@janole/ai-sdk-provider-codex-asp 0.4.1 → 0.4.3

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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  `@janole/ai-sdk-provider-codex-asp` is a [Vercel AI SDK](https://ai-sdk.dev/) v6 custom provider for the Codex App Server Protocol.
4
4
 
5
- Status: POC feature-complete for language model usage. Currently tested with [codex-cli](https://github.com/openai/codex/releases/tag/rust-v0.107.0) 0.107.0.
5
+ Status: POC feature-complete for language model usage. Currently tested with [codex-cli](https://github.com/openai/codex/releases/tag/rust-v0.117.0) 0.117.0.
6
6
 
7
7
  - `LanguageModelV3` provider implementation
8
8
  - Streaming (`streamText`) and non-streaming (`generateText`)
@@ -113,8 +113,8 @@ const codex = createCodexAppServer({
113
113
  persistent?: { poolSize?, idleTimeoutMs?, scope?, key? },
114
114
  compaction?: { shouldCompactOnResume?, strict? }, // optional thread/compact/start before resumed turns
115
115
  debug?: { logPackets?, logger? }, // packet-level JSON-RPC debug logging
116
- defaultThreadSettings?: { cwd?, approvalPolicy?, sandbox? },
117
- defaultTurnSettings?: { cwd?, approvalPolicy?, sandboxPolicy?, model?, effort?, summary? },
116
+ defaultThreadSettings?: { cwd?, approvalPolicy?, approvalsReviewer?, sandbox? },
117
+ defaultTurnSettings?: { cwd?, approvalPolicy?, approvalsReviewer?, sandboxPolicy?, model?, effort?, summary? },
118
118
  approvals?: { onCommandApproval?, onFileChangeApproval? },
119
119
  toolTimeoutMs?: number, // default: 30000
120
120
  interruptTimeoutMs?: number, // default: 10000
@@ -145,6 +145,29 @@ const codex = createCodexAppServer({
145
145
  });
146
146
  ```
147
147
 
148
+ Approval reviewer example:
149
+
150
+ Set `approvalsReviewer` to `"guardian_subagent"` to let Codex route approval decisions to its built-in reviewer agent instead of prompting the human user.
151
+
152
+ ```ts
153
+ const codex = createCodexAppServer({
154
+ defaultThreadSettings: {
155
+ approvalsReviewer: "guardian_subagent",
156
+ },
157
+ });
158
+
159
+ await streamText({
160
+ model: codex("gpt-5.3-codex"),
161
+ prompt: "Delete the old generated protocol files under src/protocol/app-server-protocol if they are no longer referenced, then regenerate the current ones.",
162
+ providerOptions: codexCallOptions({
163
+ approvalsReviewer: "user",
164
+ approvals: {
165
+ onCommandApproval: async () => "decline",
166
+ },
167
+ }),
168
+ });
169
+ ```
170
+
148
171
  See [`src/provider.ts`](src/provider.ts) for full type definitions.
149
172
 
150
173
  ## Examples
package/dist/index.cjs CHANGED
@@ -935,7 +935,7 @@ var DynamicToolsDispatcher = class {
935
935
  // package.json
936
936
  var package_default = {
937
937
  name: "@janole/ai-sdk-provider-codex-asp",
938
- version: "0.4.1"};
938
+ version: "0.4.3"};
939
939
 
940
940
  // src/package-info.ts
941
941
  var PACKAGE_NAME = package_default.name;
@@ -1769,6 +1769,12 @@ function sdkToolsToCodexDynamicTools(tools) {
1769
1769
  inputSchema: t.inputSchema
1770
1770
  }));
1771
1771
  }
1772
+ function resolveApprovalHandlers(providerSettings, callOptions) {
1773
+ return stripUndefined({
1774
+ onCommandApproval: callOptions?.approvals?.onCommandApproval ?? providerSettings.approvals?.onCommandApproval,
1775
+ onFileChangeApproval: callOptions?.approvals?.onFileChangeApproval ?? providerSettings.approvals?.onFileChangeApproval
1776
+ });
1777
+ }
1772
1778
  function isPassThroughContentPart(part) {
1773
1779
  switch (part.type) {
1774
1780
  case "tool-call":
@@ -1924,6 +1930,8 @@ var CodexLanguageModel = class {
1924
1930
  let activeThreadId;
1925
1931
  let activeTurnId;
1926
1932
  let session;
1933
+ let detachApprovals;
1934
+ let detachDynamicTools;
1927
1935
  const interruptTimeoutMs = this.config.providerSettings.interruptTimeoutMs ?? 1e4;
1928
1936
  const interruptTurnIfPossible = async () => {
1929
1937
  if (!activeThreadId || !activeTurnId) {
@@ -1950,6 +1958,10 @@ var CodexLanguageModel = class {
1950
1958
  try {
1951
1959
  controller.close();
1952
1960
  } finally {
1961
+ detachDynamicTools?.();
1962
+ detachDynamicTools = void 0;
1963
+ detachApprovals?.();
1964
+ detachApprovals = void 0;
1953
1965
  await fileResolver.cleanup();
1954
1966
  await client.disconnect();
1955
1967
  }
@@ -1963,6 +1975,10 @@ var CodexLanguageModel = class {
1963
1975
  try {
1964
1976
  controller.close();
1965
1977
  } finally {
1978
+ detachDynamicTools?.();
1979
+ detachDynamicTools = void 0;
1980
+ detachApprovals?.();
1981
+ detachApprovals = void 0;
1966
1982
  await fileResolver.cleanup();
1967
1983
  await client.disconnect();
1968
1984
  }
@@ -2024,11 +2040,10 @@ var CodexLanguageModel = class {
2024
2040
  pendingToolCall.threadId,
2025
2041
  closeSuccessfully
2026
2042
  );
2027
- const approvalsDispatcher2 = new ApprovalsDispatcher(stripUndefined({
2028
- onCommandApproval: this.config.providerSettings.approvals?.onCommandApproval,
2029
- onFileChangeApproval: this.config.providerSettings.approvals?.onFileChangeApproval
2030
- }));
2031
- approvalsDispatcher2.attach(client);
2043
+ const approvalsDispatcher2 = new ApprovalsDispatcher(
2044
+ resolveApprovalHandlers(this.config.providerSettings, callOptions)
2045
+ );
2046
+ detachApprovals = approvalsDispatcher2.attach(client);
2032
2047
  const result = toolResult ?? {
2033
2048
  success: false,
2034
2049
  contentItems: [{
@@ -2056,13 +2071,12 @@ var CodexLanguageModel = class {
2056
2071
  timeoutMs: this.config.providerSettings.toolTimeoutMs,
2057
2072
  onDebugEvent: toolLogger
2058
2073
  }));
2059
- dispatcher.attach(client);
2074
+ detachDynamicTools = dispatcher.attach(client);
2060
2075
  }
2061
- const approvalsDispatcher = new ApprovalsDispatcher(stripUndefined({
2062
- onCommandApproval: this.config.providerSettings.approvals?.onCommandApproval,
2063
- onFileChangeApproval: this.config.providerSettings.approvals?.onFileChangeApproval
2064
- }));
2065
- approvalsDispatcher.attach(client);
2076
+ const approvalsDispatcher = new ApprovalsDispatcher(
2077
+ resolveApprovalHandlers(this.config.providerSettings, callOptions)
2078
+ );
2079
+ detachApprovals = approvalsDispatcher.attach(client);
2066
2080
  client.onAnyNotification((method, params) => {
2067
2081
  const parts = mapper.map({ method, params });
2068
2082
  const mappedTurnId = mapper.getTurnId();
@@ -2116,6 +2130,7 @@ var CodexLanguageModel = class {
2116
2130
  developerInstructions,
2117
2131
  cwd: callOptions?.cwd ?? this.config.providerSettings.defaultThreadSettings?.cwd,
2118
2132
  approvalPolicy: callOptions?.approvalPolicy ?? this.config.providerSettings.defaultThreadSettings?.approvalPolicy,
2133
+ approvalsReviewer: callOptions?.approvalsReviewer ?? this.config.providerSettings.defaultThreadSettings?.approvalsReviewer,
2119
2134
  sandbox: callOptions?.sandbox ?? this.config.providerSettings.defaultThreadSettings?.sandbox,
2120
2135
  model: callOptions?.model ?? this.config.providerSettings.defaultModel
2121
2136
  });
@@ -2179,6 +2194,7 @@ var CodexLanguageModel = class {
2179
2194
  config,
2180
2195
  cwd: callOptions?.cwd ?? this.config.providerSettings.defaultThreadSettings?.cwd,
2181
2196
  approvalPolicy: callOptions?.approvalPolicy ?? this.config.providerSettings.defaultThreadSettings?.approvalPolicy,
2197
+ approvalsReviewer: callOptions?.approvalsReviewer ?? this.config.providerSettings.defaultThreadSettings?.approvalsReviewer,
2182
2198
  sandbox: callOptions?.sandbox ?? this.config.providerSettings.defaultThreadSettings?.sandbox
2183
2199
  });
2184
2200
  debugLog?.("outbound", "thread/start", threadStartParams);
@@ -2205,6 +2221,7 @@ var CodexLanguageModel = class {
2205
2221
  input: turnInput,
2206
2222
  cwd: callOptions?.cwd ?? this.config.providerSettings.defaultTurnSettings?.cwd,
2207
2223
  approvalPolicy: callOptions?.approvalPolicy ?? this.config.providerSettings.defaultTurnSettings?.approvalPolicy,
2224
+ approvalsReviewer: callOptions?.approvalsReviewer ?? this.config.providerSettings.defaultTurnSettings?.approvalsReviewer,
2208
2225
  sandboxPolicy: callOptions?.sandboxPolicy ?? this.config.providerSettings.defaultTurnSettings?.sandboxPolicy,
2209
2226
  model: callOptions?.model ?? this.config.providerSettings.defaultTurnSettings?.model,
2210
2227
  effort: callOptions?.effort ?? this.config.providerSettings.defaultTurnSettings?.effort,