Update to OpenAI Developers
Snapshot Nov 11, 2026 · 00:08 UTC · version 1.3.16
Package or technical metadata updated
Package or technical metadata updated
Observed in package metadata. These changes alone do not establish a new customer-facing feature.
Up to 3 plugins free · no card required.
All fields and original values.
These are saved file metadata. Open a changed file to read its text edits.
Package file
Nov 9, 2026 · 00:11 UTC
9243063ec92cefcaf0a95d163ed38db30e1e6feea570012df1fcd80ea9e4a221
Nov 11, 2026 · 00:08 UTC
d3943fc37e3b7069842ee6a5d9d3061b75475c95c3da92417ec43c0000eb5151
Package file
Nov 9, 2026 · 00:11 UTC
109
Nov 11, 2026 · 00:08 UTC
108
Package file
Nov 9, 2026 · 00:11 UTC
0e43c8a02449c62684ffc47cf03c2a1023a68e614194fc16eea872bf543e2d44
Nov 11, 2026 · 00:08 UTC
2cff5c9d30e496ebbb8b4862da87ea3b1c8dfa01c7155236b6bd6564506332cd
Package file
Nov 9, 2026 · 00:11 UTC
2085
Nov 11, 2026 · 00:08 UTC
2069
Compare saved observations
Download comparison JSONChanged files
Choose a file to see its text changes. Binary or large files show metadata only.
skills/openai-platform-api-key/SKILL.md →
mcp/server.mjs
− removed · + added
--- before +++ after @@ -82,6 +82,25 @@ }, annotations: { ...TOOL_ANNOTATIONS, idempotentHint: false }, }; +const PROMO_ORG_INPUT = "organization"; +const PROMO_DISCLOSURE_INPUT = "disclosure"; +const PROMO_DISCLOSURE_FORM = { + mode: "form", + message: "Codex usage through API keys", + requestedSchema: { + type: "object", + properties: { + acknowledged: { + type: "boolean", + default: false, + title: "I understand this limitation.", + description: + "Claiming these credits disables Codex access through the selected API Organization’s API keys, including usage paid for with purchased API credits. Restoring access requires canceling this benefit. This does not impact Codex usage through your subscription and does not impact regular API usage.", + }, + }, + required: ["acknowledged"], + }, +}; const JsonRpcError = { METHOD_NOT_FOUND: -32601, INVALID_PARAMS: -32602, @@ -113,7 +132,12 @@ // Sign each prompt with its chat and form. Retries reuse the prompt UUID as // the credit-link operation ID without keeping abandoned prompts in memory. -async function elicit(id, params, form) { +async function elicit( + id, + params, + form, + { inputKey = "confirmation", context, previousPromptId, stateData } = {}, +) { if (protocol !== PROTOCOL) return (await request("elicitation/create", form)) ?? { action: "cancel" }; const { name, arguments: args, _meta, requestState, inputResponses } = params; @@ -127,15 +151,20 @@ } requireNonEmptyString(_meta.threadId, "threadId"); const call = [_meta.threadId, _meta.sessionId, _meta.itemId, _meta.callId]; - const promptId = typeof requestState === "string" ? requestState.split(".", 1)[0] : randomUUID(); + const promptId = previousPromptId ?? ( + typeof requestState === "string" ? requestState.split(".", 1)[0] : randomUUID() + ); + const statePrefix = stateData === undefined + ? `${promptId}.${inputKey}` + : `${promptId}.${inputKey}.${stateData}`; const signature = createHmac("sha256", continuationKey) - .update(JSON.stringify([promptId, name, args?.workspacePath, form, call])) + .update(JSON.stringify([statePrefix, name, args?.workspacePath, call, form, context])) .digest("base64url"); - const state = `${promptId}.${signature}`; - if (requestState === undefined && inputResponses === undefined) { + const state = `${statePrefix}.${signature}`; + if (previousPromptId !== undefined || (requestState === undefined && inputResponses === undefined)) { sendResult(id, { resultType: "input_required", - inputRequests: { confirmation: { method: "elicitation/create", params: form } }, + inputRequests: { [inputKey]: { method: "elicitation/create", params: form } }, requestState: state, }); return; @@ -146,7 +175,7 @@ ) { throw new Error("Confirmation does not belong to this tool call."); } - const response = inputResponses?.confirmation; + const response = inputResponses?.[inputKey]; if (!["accept", "decline", "cancel"].includes(response?.action)) { throw new Error("Missing or invalid confirmation response."); } @@ -213,6 +242,13 @@ }); } +function sendPromoConfirmation(id, result) { + sendResult(id, { + content: [{ type: "text", text: JSON.stringify(result) }], + structuredContent: result, + }); +} + async function handlePromoOrgConfirmation(id, params) { const args = params.arguments; if (!Array.isArray(args?.destinations) || args.destinations.length === 0 || Object.keys(args).length !== 1) { @@ -238,34 +274,55 @@ title: destination.display_name ? `${destination.display_name} (${orgId})` : orgId, }; }); - const elicitation = await elicit(id, params, { - mode: "form", - message: - "Your ChatGPT subscription includes free API credits. Choose the API organization that will receive them. You can't change the organization for this claim later.", - requestedSchema: { - type: "object", - properties: { - destination_account_id: { type: "string", title: "Platform organization", oneOf: choices }, + const stateParts = protocol === PROTOCOL && typeof params.requestState === "string" + ? params.requestState.split(".", 3) + : []; + let selectedIndex; + let previousPromptId; + if (stateParts[1] === PROMO_DISCLOSURE_INPUT) { + selectedIndex = Number(stateParts[2]); + if (choices[selectedIndex] === undefined) { + throw new Error("Confirmation does not identify an available Platform organization."); + } + } else { + const picker = await elicit(id, params, { + mode: "form", + message: + "Your ChatGPT subscription includes free API credits. Choose the API organization that will receive them. You can't change the organization for this claim later.", + requestedSchema: { + type: "object", + properties: { + destination_account_id: { type: "string", title: "Platform organization", oneOf: choices }, + }, + required: ["destination_account_id"], }, - required: ["destination_account_id"], + }, { inputKey: PROMO_ORG_INPUT }); + if (!picker) return; + selectedIndex = choices.findIndex(({ const: orgId }) => orgId === picker.content?.destination_account_id); + if (picker.action !== "accept" || selectedIndex === -1) { + return sendPromoConfirmation(id, { status: "not_approved" }); + } + previousPromptId = picker.promptId; + } + + // Carry the confirmed org in the signed state while the disclosure is open. + const disclosure = await elicit(id, params, PROMO_DISCLOSURE_FORM, { + inputKey: PROMO_DISCLOSURE_INPUT, + context: choices, + previousPromptId, + stateData: selectedIndex, + }); + if (!disclosure) return; + if (disclosure.action !== "accept" || disclosure.content?.acknowledged !== true) { + return sendPromoConfirmation(id, { status: "not_approved" }); + } + sendPromoConfirmation(id, { + status: "approved", + link_arguments: { + destination_account_id: choices[selectedIndex].const, + operation_id: protocol === PROTOCOL ? disclosure.promptId : randomUUID(), }, }); - if (!elicitation) return; - const orgId = elicitation.content?.destination_account_id; - const result = - elicitation.action === "accept" && orgIds.has(orgId) - ? { - status: "approved", - link_arguments: { - destination_account_id: orgId, - operation_id: protocol === PROTOCOL ? elicitation.promptId : randomUUID(), - }, - } - : { status: "not_approved" }; - sendResult(id, { - content: [{ type: "text", text: JSON.stringify(result) }], - structuredContent: result, - }); } async function handleToolCall(id, params) {
Full technical diff · 15 changed fields
changed /files/.app.json/sha256
"9243063ec92cefcaf0a95d163ed38db30e1e6feea570012df1fcd80ea9e4a221"
"d3943fc37e3b7069842ee6a5d9d3061b75475c95c3da92417ec43c0000eb5151"
changed /files/.app.json/size
109
108
changed /files/.codex-plugin~1plugin.json/sha256
"0e43c8a02449c62684ffc47cf03c2a1023a68e614194fc16eea872bf543e2d44"
"2cff5c9d30e496ebbb8b4862da87ea3b1c8dfa01c7155236b6bd6564506332cd"
changed /files/.codex-plugin~1plugin.json/size
2085
2069
changed /files/README.md/sha256
"13c6a79c4ce01c9248856a1e4106e3b6f0c0da55156d766dc2a8902752847702"
"f97cac42361e932287304e84b53129702a785a920beddb009bcde6e3c2026ced"
changed /files/README.md/size
2728
2814
removed /files/assets~1composer-icon.png
{
"sha256": "d21ae220edb899366b33f2e5fb61b7a4fd0d9f2aef33f99a0fde46a7eb3784e6",
"size": 3861
}Field is absent
changed /files/mcp~1server.mjs/sha256
"7ef272c5fffdae3ff96b4db424ab1a167f452e4d5391493d0c7dc0b4c8bd1feb"
"a30d0510497deddbb40cb9c986833ab9ff03fe8d9109aca6a1fea5e13ea84304"
changed /files/mcp~1server.mjs/size
14894
17028
changed /files/skills~1openai-platform-api-key~1SKILL.md/sha256
"927b1befa10920784e3131783e804dc0cc671fabfb6391f2b4eb4fb016e768d6"
"8198e7497978ad1581fa8dcc01c2c5a88c3fb0a87dbfb505547dea012c985adc"
changed /files/skills~1openai-platform-api-key~1SKILL.md/size
13300
14331
changed /files/skills~1openai-platform-api-key~1references~1evals.md/sha256
"494067ababa6cb60658ccbc53307d73c7dbd108d2778ecea5991d8319b26bb5e"
"8d1a249acb71e4caf485269a0d8384c5c8fe9545dc201be070ac3d7dc127bc0d"
changed /files/skills~1openai-platform-api-key~1references~1evals.md/size
12913
13671
changed /files/tests~1openai-platform-api-key.test.mjs/sha256
"29d2b98a82649530b39a889ac0c1f379237473b6028485167fe88a02ce96307f"
"910397b0d00b840ae80f09d6990af2f5f462f7f9e5742dc36c9e842fd9ff376d"
changed /files/tests~1openai-platform-api-key.test.mjs/size
46553
50168
Full snapshot data
{
"files": {
".app.json": {
"sha256": "d3943fc37e3b7069842ee6a5d9d3061b75475c95c3da92417ec43c0000eb5151",
"size": 108
},
".codex-plugin/plugin.json": {
"sha256": "2cff5c9d30e496ebbb8b4862da87ea3b1c8dfa01c7155236b6bd6564506332cd",
"size": 2069
},
".mcp.json": {
"sha256": "fdd030232730a6979b9e1c3bbc10892b01b41372b8c2d8354fc776bd32e0c1c8",
"size": 451
},
"README.md": {
"sha256": "f97cac42361e932287304e84b53129702a785a920beddb009bcde6e3c2026ced",
"size": 2814
},
"assets/logo.png": {
"sha256": "d21ae220edb899366b33f2e5fb61b7a4fd0d9f2aef33f99a0fde46a7eb3784e6",
"size": 3861
},
"assets/openai-platform.png": {
"sha256": "f2f8832878739a84d60fc6a6acf8dc5681fac3ed8318a70d37aa1f8fffacb537",
"size": 17940
},
"mcp/server.mjs": {
"sha256": "a30d0510497deddbb40cb9c986833ab9ff03fe8d9109aca6a1fea5e13ea84304",
"size": 17028
},
"scripts/openai-platform-api-key.mjs": {
"sha256": "7dd08001d0712226b443bdd00f45f99a90a58bdf10e25595da29850849a2fa23",
"size": 13600
},
"skills/agents/SKILL.md": {
"sha256": "1918f74c7509ef03916f0a5c6fd85a35c66faba65e26948e41cd2351cf61f334",
"size": 6830
},
"skills/agents/agents/openai.yaml": {
"sha256": "881f62164a8fe0807bc6d3d14f6992c653c4929e4e99dfe40bd79a7ee656ed84",
"size": 178
},
"skills/agents/references/agents-sdk.md": {
"sha256": "592e15f2148ea837383ea63bec1dcda45e0385e757e276001dc0aa337414f028",
"size": 4628
},
"skills/agents/references/app-template.md": {
"sha256": "8500bf9a04082fc183e7014b4b58829a8df9da3fa29b494046f98683a5130150",
"size": 2018
},
"skills/agents/references/evals.md": {
"sha256": "02517754e1a3f51af9e9ca9d0cf7440ce9f6480e9cae567f16df49343839b460",
"size": 2371
},
"skills/agents/references/sandbox-providers.md": {
"sha256": "e505f78f437224a36131edccfdc001d7d92ed2d2c151ca4d07b942b80b2b25bc",
"size": 3453
},
"skills/devday-guide/SKILL.md": {
"sha256": "ce990a4ea0a0bdba54c1a361aeedad17809048c862c6ac979333a6fba961d774",
"size": 4554
},
"skills/devday-guide/agents/openai.yaml": {
"sha256": "8020d5f8690fe05202e1d6d4f5c40e017d2d053d0c251ec8c6283461c034a865",
"size": 224
},
"skills/devday-guide/references/devday-2026-attendee-guide.md": {
"sha256": "ec81cbd120ec889ef10d7b75c66c4dab9b5033ae3d57dcaa316e7e5e6ac115ad",
"size": 5416
},
"skills/openai-api-migration/SKILL.md": {
"sha256": "164c5bbb64ca525d78a730256cf43d60ed6fcfe9ef1344a1ba72c89b75f3a3f8",
"size": 12483
},
"skills/openai-api-migration/agents/openai.yaml": {
"sha256": "00fabd89d7d4829b2143a6c0a2ffec205af53437d2093a7cc63d6fd47c73657e",
"size": 697
},
"skills/openai-api-migration/assets/migration-ledger-template.md": {
"sha256": "3437f0a13cdb3ceee8e0bb23654195b4f227d7a4dd4e6a860beeef901c07f699",
"size": 14524
},
"skills/openai-api-migration/references/evals.md": {
"sha256": "ab4bce79ad161fab8b4d99a9b11f101c5daaded9a36d253c4a9234966f45da2c",
"size": 66222
},
"skills/openai-api-migration/references/provider-framework-guidance.md": {
"sha256": "167ed81bb9718bbb3746eb1625ce647f92287ea00310f9b206839315647a2349",
"size": 4060
},
"skills/openai-api-migration/references/responses-api-guidance.md": {
"sha256": "cd470e2330198b8dacfb980675e6be97056864ac4a471194bfe3dce84f4e681f",
"size": 18770
},
"skills/openai-api-troubleshooting/SKILL.md": {
"sha256": "63d0a10934b6f999aa85fee64ef6086907e2cfeff15e614b5ce5b07d421d6956",
"size": 3928
},
"skills/openai-api-troubleshooting/agents/openai.yaml": {
"sha256": "8e58c04d41496c3c426db0f83802e5546414524dd38f560581e45f38eb7548af",
"size": 136
},
"skills/openai-api-troubleshooting/references/evals.md": {
"sha256": "9921d77b49038df2ca7e3dba8d29b76fa8ba612f1b6f0a4eb63b966b4f09f1f3",
"size": 8193
},
"skills/openai-computer-use/SKILL.md": {
"sha256": "632b415596fadfccf4432901614e989837bdf524aedf79cdea0dcd6caecd918f",
"size": 3382
},
"skills/openai-computer-use/agents/openai.yaml": {
"sha256": "f9c670708bf549506f51cf4595fdcb25383b5f1fa29a2ee8560b249f07249236",
"size": 232
},
"skills/openai-platform-api-key/SKILL.md": {
"sha256": "8198e7497978ad1581fa8dcc01c2c5a88c3fb0a87dbfb505547dea012c985adc",
"size": 14331
},
"skills/openai-platform-api-key/agents/openai.yaml": {
"sha256": "fc27a29c74c453e85c2f79fb0ee729336f5df2376bf792b82598eacd0437d842",
"size": 117
},
"skills/openai-platform-api-key/references/evals.md": {
"sha256": "8d1a249acb71e4caf485269a0d8384c5c8fe9545dc201be070ac3d7dc127bc0d",
"size": 13671
},
"skills/setup/SKILL.md": {
"sha256": "3c0b83ba6cc134011b1fb5c9bf544f129d619bf7fd2616a57365c747aa065c63",
"size": 6291
},
"skills/setup/agents/openai.yaml": {
"sha256": "9763cb1e01479669d15e69f5eb3bfa5284997687a65ed41767ee3c585e719506",
"size": 139
},
"skills/setup/scripts/verify-responses.mjs": {
"sha256": "89d93f37b752d847805dcc784971d810fabb5d554c708b18a56a4acdb2eb91df",
"size": 4315
},
"tests/openai-platform-api-key.test.mjs": {
"sha256": "910397b0d00b840ae80f09d6990af2f5f462f7f9e5742dc36c9e842fd9ff376d",
"size": 50168
},
"tests/setup.test.mjs": {
"sha256": "030a1380d71557e1140b922109272e550727c24aece7a1a0087fe54d57ad9e9e",
"size": 5487
}
}
}SHA-256 of public snapshot: 97f4b64f822c383de7c6ab26426def6b230dcdcf958c5a8fcc580763bfaef0d8