@kodelyth/codex 2026.5.40 → 2026.5.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/client-ChMX13_o.js +642 -0
  2. package/dist/client-factory-D3dIsp4Y.js +9 -0
  3. package/dist/command-formatters-BRW7_Nu7.js +519 -0
  4. package/dist/command-handlers-P2IqtXaZ.js +1462 -0
  5. package/dist/compact-baos5flR.js +329 -0
  6. package/dist/computer-use-VfLvTMaa.js +367 -0
  7. package/dist/config-CezENx_E.js +510 -0
  8. package/dist/doctor-contract-api.js +53 -0
  9. package/dist/harness.js +51 -0
  10. package/dist/index.js +1133 -0
  11. package/dist/media-understanding-provider.js +335 -0
  12. package/dist/models-B9DhrIwD.js +110 -0
  13. package/dist/node-cli-sessions-De4_DuFw.js +1216 -0
  14. package/dist/plugin-activation-BlMuJeXz.js +452 -0
  15. package/dist/prompt-overlay.js +12 -0
  16. package/dist/protocol-C9UWI98H.js +9 -0
  17. package/dist/protocol-validators-BGBspNmF.js +5988 -0
  18. package/dist/provider-catalog.js +84 -0
  19. package/dist/provider-discovery.js +33 -0
  20. package/dist/provider.js +150 -0
  21. package/dist/rate-limit-cache-CHuacE27.js +24 -0
  22. package/dist/request-CTQKUxaa.js +89 -0
  23. package/dist/rolldown-runtime-DUslC3ob.js +14 -0
  24. package/dist/run-attempt-DqV2OU1R.js +5366 -0
  25. package/dist/session-binding-3PzU7ZTW.js +222 -0
  26. package/dist/shared-client-Cnyr9dyT.js +631 -0
  27. package/dist/side-question-CP5XlA0U.js +667 -0
  28. package/dist/test-api.js +45 -0
  29. package/dist/thread-lifecycle-DBJetBuV.js +1561 -0
  30. package/dist/vision-tools-Cl_5a93K.js +1379 -0
  31. package/doctor-contract-api.test.ts +44 -0
  32. package/doctor-contract-api.ts +68 -0
  33. package/harness.ts +72 -0
  34. package/index.test.ts +230 -0
  35. package/index.ts +66 -0
  36. package/klaw.plugin.json +24 -85
  37. package/media-understanding-provider.test.ts +486 -0
  38. package/media-understanding-provider.ts +521 -0
  39. package/package.json +3 -3
  40. package/prompt-overlay-runtime-contract.test.ts +48 -0
  41. package/prompt-overlay.ts +21 -0
  42. package/provider-catalog.ts +83 -0
  43. package/provider-discovery.ts +45 -0
  44. package/provider.test.ts +384 -0
  45. package/provider.ts +243 -0
  46. package/src/app-server/app-inventory-cache.test.ts +176 -0
  47. package/src/app-server/app-inventory-cache.ts +324 -0
  48. package/src/app-server/approval-bridge.test.ts +1471 -0
  49. package/src/app-server/approval-bridge.ts +1211 -0
  50. package/src/app-server/auth-bridge.test.ts +1449 -0
  51. package/src/app-server/auth-bridge.ts +614 -0
  52. package/src/app-server/auth-profile-runtime-contract.test.ts +239 -0
  53. package/src/app-server/capabilities.ts +27 -0
  54. package/src/app-server/client-factory.ts +24 -0
  55. package/src/app-server/client.test.ts +563 -0
  56. package/src/app-server/client.ts +715 -0
  57. package/src/app-server/compact.test.ts +710 -0
  58. package/src/app-server/compact.ts +500 -0
  59. package/src/app-server/computer-use.test.ts +788 -0
  60. package/src/app-server/computer-use.ts +683 -0
  61. package/src/app-server/config.test.ts +879 -0
  62. package/src/app-server/config.ts +1038 -0
  63. package/src/app-server/context-engine-projection.test.ts +252 -0
  64. package/src/app-server/context-engine-projection.ts +403 -0
  65. package/src/app-server/delivery-no-reply-runtime-contract.test.ts +80 -0
  66. package/src/app-server/dynamic-tool-diagnostics.ts +73 -0
  67. package/src/app-server/dynamic-tool-profile.ts +69 -0
  68. package/src/app-server/dynamic-tools.test.ts +1302 -0
  69. package/src/app-server/dynamic-tools.ts +623 -0
  70. package/src/app-server/elicitation-bridge.test.ts +1056 -0
  71. package/src/app-server/elicitation-bridge.ts +783 -0
  72. package/src/app-server/event-projector.test.ts +2668 -0
  73. package/src/app-server/event-projector.ts +2057 -0
  74. package/src/app-server/image-payload-sanitizer.test.ts +49 -0
  75. package/src/app-server/image-payload-sanitizer.ts +167 -0
  76. package/src/app-server/klaw-owned-tool-runtime-contract.test.ts +456 -0
  77. package/src/app-server/local-runtime-attribution.ts +39 -0
  78. package/src/app-server/managed-binary.test.ts +139 -0
  79. package/src/app-server/managed-binary.ts +193 -0
  80. package/src/app-server/models.test.ts +246 -0
  81. package/src/app-server/models.ts +172 -0
  82. package/src/app-server/native-hook-relay.test.ts +271 -0
  83. package/src/app-server/native-hook-relay.ts +150 -0
  84. package/src/app-server/native-subagent-task-mirror.test.ts +573 -0
  85. package/src/app-server/native-subagent-task-mirror.ts +497 -0
  86. package/src/app-server/outcome-fallback-runtime-contract.test.ts +404 -0
  87. package/src/app-server/plugin-activation.test.ts +336 -0
  88. package/src/app-server/plugin-activation.ts +283 -0
  89. package/src/app-server/plugin-app-cache-key.ts +74 -0
  90. package/src/app-server/plugin-approval-roundtrip.ts +122 -0
  91. package/src/app-server/plugin-inventory.test.ts +355 -0
  92. package/src/app-server/plugin-inventory.ts +357 -0
  93. package/src/app-server/plugin-thread-config.test.ts +865 -0
  94. package/src/app-server/plugin-thread-config.ts +455 -0
  95. package/src/app-server/protocol-generated/json/DynamicToolCallParams.json +33 -0
  96. package/src/app-server/protocol-generated/json/v2/ErrorNotification.json +199 -0
  97. package/src/app-server/protocol-generated/json/v2/GetAccountResponse.json +102 -0
  98. package/src/app-server/protocol-generated/json/v2/ModelListResponse.json +227 -0
  99. package/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json +2630 -0
  100. package/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json +2630 -0
  101. package/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json +1659 -0
  102. package/src/app-server/protocol-generated/json/v2/TurnStartResponse.json +1655 -0
  103. package/src/app-server/protocol-validators.test.ts +75 -0
  104. package/src/app-server/protocol-validators.ts +203 -0
  105. package/src/app-server/protocol.ts +520 -0
  106. package/src/app-server/rate-limit-cache.ts +48 -0
  107. package/src/app-server/rate-limits.test.ts +202 -0
  108. package/src/app-server/rate-limits.ts +583 -0
  109. package/src/app-server/request.ts +73 -0
  110. package/src/app-server/run-attempt.context-engine.test.ts +1004 -0
  111. package/src/app-server/run-attempt.test.ts +9477 -0
  112. package/src/app-server/run-attempt.ts +4683 -0
  113. package/src/app-server/run-attempt.vision-tools.test.ts +35 -0
  114. package/src/app-server/schema-normalization-runtime-contract.test.ts +206 -0
  115. package/src/app-server/session-binding.test.ts +303 -0
  116. package/src/app-server/session-binding.ts +398 -0
  117. package/src/app-server/session-history.ts +44 -0
  118. package/src/app-server/shared-client.test.ts +589 -0
  119. package/src/app-server/shared-client.ts +289 -0
  120. package/src/app-server/side-question.test.ts +1175 -0
  121. package/src/app-server/side-question.ts +1007 -0
  122. package/src/app-server/test-support.ts +48 -0
  123. package/src/app-server/thread-lifecycle.test.ts +447 -0
  124. package/src/app-server/thread-lifecycle.ts +939 -0
  125. package/src/app-server/thread-lifecycle.user-mcp-servers.test.ts +442 -0
  126. package/src/app-server/timeout.ts +9 -0
  127. package/src/app-server/tool-progress-normalization.ts +77 -0
  128. package/src/app-server/trajectory.test.ts +205 -0
  129. package/src/app-server/trajectory.ts +365 -0
  130. package/src/app-server/transcript-mirror.test.ts +524 -0
  131. package/src/app-server/transcript-mirror.ts +208 -0
  132. package/src/app-server/transcript-repair-runtime-contract.test.ts +44 -0
  133. package/src/app-server/transport-stdio.test.ts +171 -0
  134. package/src/app-server/transport-stdio.ts +107 -0
  135. package/src/app-server/transport-websocket.test.ts +69 -0
  136. package/src/app-server/transport-websocket.ts +90 -0
  137. package/src/app-server/transport.ts +117 -0
  138. package/src/app-server/user-input-bridge.test.ts +249 -0
  139. package/src/app-server/user-input-bridge.ts +316 -0
  140. package/src/app-server/version.ts +4 -0
  141. package/src/app-server/vision-tools.ts +12 -0
  142. package/src/command-account.ts +544 -0
  143. package/src/command-formatters.ts +425 -0
  144. package/src/command-handlers.ts +2004 -0
  145. package/src/command-rpc.test.ts +16 -0
  146. package/src/command-rpc.ts +142 -0
  147. package/src/commands.test.ts +3312 -0
  148. package/src/commands.ts +65 -0
  149. package/src/conversation-binding-data.ts +124 -0
  150. package/src/conversation-binding.test.ts +599 -0
  151. package/src/conversation-binding.ts +561 -0
  152. package/src/conversation-control.test.ts +126 -0
  153. package/src/conversation-control.ts +303 -0
  154. package/src/conversation-turn-collector.test.ts +191 -0
  155. package/src/conversation-turn-collector.ts +186 -0
  156. package/src/conversation-turn-input.test.ts +141 -0
  157. package/src/conversation-turn-input.ts +106 -0
  158. package/src/manifest.test.ts +20 -0
  159. package/src/migration/apply.ts +501 -0
  160. package/src/migration/helpers.ts +55 -0
  161. package/src/migration/plan.ts +461 -0
  162. package/src/migration/provider.test.ts +1741 -0
  163. package/src/migration/provider.ts +41 -0
  164. package/src/migration/source.ts +643 -0
  165. package/src/migration/targets.ts +25 -0
  166. package/src/node-cli-sessions.test.ts +180 -0
  167. package/src/node-cli-sessions.ts +711 -0
  168. package/test-api.ts +82 -0
  169. package/tsconfig.json +16 -0
  170. package/doctor-contract-api.js +0 -7
  171. package/harness.js +0 -7
  172. package/index.js +0 -7
  173. package/media-understanding-provider.js +0 -7
  174. package/prompt-overlay.js +0 -7
  175. package/provider-catalog.js +0 -7
  176. package/provider-discovery.js +0 -7
  177. package/provider.js +0 -7
  178. package/test-api.js +0 -7
@@ -0,0 +1,141 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildCodexConversationTurnInput } from "./conversation-turn-input.js";
3
+
4
+ describe("codex conversation turn input", () => {
5
+ it("forwards inbound image attachments to Codex app-server", () => {
6
+ expect(
7
+ buildCodexConversationTurnInput({
8
+ prompt: "what is this?",
9
+ event: {
10
+ content: "what is this?",
11
+ channel: "telegram",
12
+ isGroup: false,
13
+ metadata: {
14
+ mediaPaths: ["/tmp/photo.png", "/tmp/readme.txt"],
15
+ mediaUrls: ["https://example.test/photo.png"],
16
+ mediaTypes: ["image/png", "text/plain"],
17
+ },
18
+ },
19
+ }),
20
+ ).toEqual([
21
+ { type: "text", text: "what is this?", text_elements: [] },
22
+ { type: "localImage", path: "/tmp/photo.png" },
23
+ ]);
24
+ });
25
+
26
+ it("uses remote image urls when no local path is available", () => {
27
+ expect(
28
+ buildCodexConversationTurnInput({
29
+ prompt: "look",
30
+ event: {
31
+ content: "look",
32
+ channel: "webchat",
33
+ isGroup: false,
34
+ metadata: {
35
+ mediaUrl: "https://example.test/photo.webp?sig=1",
36
+ },
37
+ },
38
+ }),
39
+ ).toEqual([
40
+ { type: "text", text: "look", text_elements: [] },
41
+ { type: "image", url: "https://example.test/photo.webp?sig=1" },
42
+ ]);
43
+ });
44
+
45
+ it("keeps protocol-relative image urls remote", () => {
46
+ expect(
47
+ buildCodexConversationTurnInput({
48
+ prompt: "look",
49
+ event: {
50
+ content: "look",
51
+ channel: "webchat",
52
+ isGroup: false,
53
+ metadata: {
54
+ mediaUrl: "//cdn.example.test/photo.webp",
55
+ },
56
+ },
57
+ }),
58
+ ).toEqual([
59
+ { type: "text", text: "look", text_elements: [] },
60
+ { type: "image", url: "//cdn.example.test/photo.webp" },
61
+ ]);
62
+ });
63
+
64
+ it("decodes local file URLs for Codex local image input", () => {
65
+ expect(
66
+ buildCodexConversationTurnInput({
67
+ prompt: "look",
68
+ event: {
69
+ content: "look",
70
+ channel: "webchat",
71
+ isGroup: false,
72
+ metadata: {
73
+ mediaPath: "file:///tmp/Klaw%20QA/photo.png",
74
+ mediaType: "image/png",
75
+ },
76
+ },
77
+ }),
78
+ ).toEqual([
79
+ { type: "text", text: "look", text_elements: [] },
80
+ { type: "localImage", path: "/tmp/Klaw QA/photo.png" },
81
+ ]);
82
+ });
83
+
84
+ it("drops malformed local file URLs instead of throwing", () => {
85
+ expect(
86
+ buildCodexConversationTurnInput({
87
+ prompt: "look",
88
+ event: {
89
+ content: "look",
90
+ channel: "webchat",
91
+ isGroup: false,
92
+ metadata: {
93
+ mediaPath: "file:///tmp/%zz/photo.png",
94
+ mediaType: "image/png",
95
+ },
96
+ },
97
+ }),
98
+ ).toEqual([{ type: "text", text: "look", text_elements: [] }]);
99
+ });
100
+
101
+ it("treats local media URLs as Codex local image input", () => {
102
+ expect(
103
+ buildCodexConversationTurnInput({
104
+ prompt: "look",
105
+ event: {
106
+ content: "look",
107
+ channel: "webchat",
108
+ isGroup: false,
109
+ metadata: {
110
+ mediaUrls: ["/tmp/staged-photo.png", "file:///tmp/Klaw%20QA/second.jpg"],
111
+ mediaTypes: ["image/png", "image/jpeg"],
112
+ },
113
+ },
114
+ }),
115
+ ).toEqual([
116
+ { type: "text", text: "look", text_elements: [] },
117
+ { type: "localImage", path: "/tmp/staged-photo.png" },
118
+ { type: "localImage", path: "/tmp/Klaw QA/second.jpg" },
119
+ ]);
120
+ });
121
+
122
+ it("treats Windows media paths as Codex local image input", () => {
123
+ expect(
124
+ buildCodexConversationTurnInput({
125
+ prompt: "look",
126
+ event: {
127
+ content: "look",
128
+ channel: "webchat",
129
+ isGroup: false,
130
+ metadata: {
131
+ mediaUrl: "C:\\Klaw QA\\photo.png",
132
+ mediaType: "image/png",
133
+ },
134
+ },
135
+ }),
136
+ ).toEqual([
137
+ { type: "text", text: "look", text_elements: [] },
138
+ { type: "localImage", path: "C:\\Klaw QA\\photo.png" },
139
+ ]);
140
+ });
141
+ });
@@ -0,0 +1,106 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import type { PluginHookInboundClaimEvent } from "klaw/plugin-sdk/plugin-entry";
4
+ import type { CodexUserInput } from "./app-server/protocol.js";
5
+
6
+ type InboundMedia = {
7
+ path?: string;
8
+ url?: string;
9
+ mimeType?: string;
10
+ };
11
+
12
+ const IMAGE_EXTENSIONS = new Set([".avif", ".gif", ".jpeg", ".jpg", ".png", ".webp"]);
13
+
14
+ export function buildCodexConversationTurnInput(params: {
15
+ prompt: string;
16
+ event: PluginHookInboundClaimEvent;
17
+ }): CodexUserInput[] {
18
+ return [
19
+ { type: "text", text: params.prompt, text_elements: [] },
20
+ ...extractInboundMedia(params.event)
21
+ .map(toCodexImageInput)
22
+ .filter((item): item is CodexUserInput => item !== undefined),
23
+ ];
24
+ }
25
+
26
+ function extractInboundMedia(event: PluginHookInboundClaimEvent): InboundMedia[] {
27
+ const metadata = event.metadata ?? {};
28
+ // Klaw channels expose either local staged files or remote URLs. Keep
29
+ // them separate so Codex can receive the cheaper localImage input when a file
30
+ // is already present, while still supporting remote-only transports.
31
+ const paths = readStringArray(metadata.mediaPaths).concat(readStringArray(metadata.mediaPath));
32
+ const urls = readStringArray(metadata.mediaUrls).concat(readStringArray(metadata.mediaUrl));
33
+ const mimeTypes = readStringArray(metadata.mediaTypes).concat(
34
+ readStringArray(metadata.mediaType),
35
+ );
36
+ const count = Math.max(paths.length, urls.length, mimeTypes.length);
37
+ const media: InboundMedia[] = [];
38
+ for (let index = 0; index < count; index += 1) {
39
+ media.push({
40
+ path: paths[index],
41
+ url: urls[index],
42
+ mimeType: mimeTypes[index] ?? mimeTypes[0],
43
+ });
44
+ }
45
+ return media;
46
+ }
47
+
48
+ function toCodexImageInput(media: InboundMedia): CodexUserInput | undefined {
49
+ if (!isImageMedia(media)) {
50
+ return undefined;
51
+ }
52
+ const localPath = media.path ?? readLocalMediaPath(media.url);
53
+ if (localPath) {
54
+ const normalized = normalizeFileUrl(localPath);
55
+ return normalized ? { type: "localImage", path: normalized } : undefined;
56
+ }
57
+ return media.url ? { type: "image", url: media.url } : undefined;
58
+ }
59
+
60
+ function isImageMedia(media: InboundMedia): boolean {
61
+ if (media.mimeType?.toLowerCase().startsWith("image/")) {
62
+ return true;
63
+ }
64
+ const candidate = media.path ?? media.url;
65
+ if (!candidate) {
66
+ return false;
67
+ }
68
+ return IMAGE_EXTENSIONS.has(path.extname(candidate.split(/[?#]/, 1)[0] ?? "").toLowerCase());
69
+ }
70
+
71
+ function normalizeFileUrl(value: string): string | undefined {
72
+ if (!value.startsWith("file://")) {
73
+ return value;
74
+ }
75
+ try {
76
+ return fileURLToPath(value);
77
+ } catch {
78
+ return undefined;
79
+ }
80
+ }
81
+
82
+ function readLocalMediaPath(value: string | undefined): string | undefined {
83
+ if (!value) {
84
+ return undefined;
85
+ }
86
+ if (value.startsWith("file://")) {
87
+ return value;
88
+ }
89
+ if (value.startsWith("//")) {
90
+ return undefined;
91
+ }
92
+ if (path.isAbsolute(value) || path.win32.isAbsolute(value)) {
93
+ return value;
94
+ }
95
+ return /^[a-z][a-z0-9+.-]*:/i.test(value) ? undefined : value;
96
+ }
97
+
98
+ function readStringArray(value: unknown): string[] {
99
+ if (typeof value === "string" && value.trim()) {
100
+ return [value.trim()];
101
+ }
102
+ if (!Array.isArray(value)) {
103
+ return [];
104
+ }
105
+ return value.map((entry) => (typeof entry === "string" ? entry.trim() : "")).filter(Boolean);
106
+ }
@@ -0,0 +1,20 @@
1
+ import fs from "node:fs";
2
+ import { describe, expect, it } from "vitest";
3
+ import { MANAGED_CODEX_APP_SERVER_PACKAGE_VERSION } from "./app-server/version.js";
4
+
5
+ type CodexPackageManifest = {
6
+ dependencies?: Record<string, string>;
7
+ };
8
+
9
+ describe("codex package manifest", () => {
10
+ it("keeps runtime dependencies in the package manifest", () => {
11
+ const packageJson = JSON.parse(
12
+ fs.readFileSync(new URL("../package.json", import.meta.url), "utf8"),
13
+ ) as CodexPackageManifest;
14
+
15
+ expect(packageJson.dependencies).toHaveProperty("@earendil-works/pi-coding-agent");
16
+ expect(packageJson.dependencies?.["@openai/codex"]).toBe(
17
+ MANAGED_CODEX_APP_SERVER_PACKAGE_VERSION,
18
+ );
19
+ });
20
+ });