@jskit-ai/agent-docs 0.1.257 → 0.1.259

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 (230) hide show
  1. package/guide/agent/app-extras/assistant-conversation.md +88 -35
  2. package/guide/agent/app-extras/assistant.md +28 -28
  3. package/guide/agent/app-setup/authentication.md +36 -17
  4. package/guide/agent/app-setup/database-layer.md +116 -17
  5. package/guide/agent/app-setup/existing-application-migration.md +29 -25
  6. package/guide/agent/app-setup/multi-homing.md +94 -48
  7. package/guide/agent/app-setup/run-an-accounts-hub.md +6 -4
  8. package/guide/agent/framework/client-features.md +496 -0
  9. package/guide/agent/framework/crud-operations.md +5 -5
  10. package/guide/agent/framework/translation.md +4 -3
  11. package/guide/agent/framework/typed-features.md +1104 -0
  12. package/guide/agent/framework/ui-operations.md +2 -2
  13. package/guide/agent/index.md +6 -1
  14. package/package.json +1 -1
  15. package/patterns/feature-package/PATTERN.md +104 -10
  16. package/patterns/feature-package/example/booking-engine/package.json +9 -4
  17. package/patterns/feature-package/example/booking-engine/src/server/BookingEngineFeature.js +24 -0
  18. package/patterns/feature-package/example/booking-engine/src/server/bookingAvailability.js +10 -0
  19. package/patterns/feature-package/example/booking-engine/src/server/bookingEngine.js +29 -0
  20. package/patterns/feature-package/example/booking-engine/src/server/bookingEngineActions.js +26 -0
  21. package/patterns/feature-package/example/booking-engine/src/server/inputSchemas.js +1 -2
  22. package/patterns/feature-package/example/booking-engine/src/server/types.js +12 -0
  23. package/patterns/feature-package/example/variations/AvailabilityEngineFeature.js +19 -0
  24. package/patterns/feature-package/example/variations/InvoiceRollupFeature.js +23 -0
  25. package/patterns/feature-package/example/variations/availabilityEngineActions.js +26 -0
  26. package/patterns/feature-package/example/variations/customKnexRepository.js +32 -26
  27. package/patterns/feature-package/example/variations/invoiceRollupActions.js +26 -0
  28. package/patterns/feature-package/example/variations/orchestratorService.js +24 -19
  29. package/patterns/feature-package/example/variations/types.js +7 -0
  30. package/patterns/minimal-foundation/PATTERN.md +30 -1
  31. package/patterns/minimal-foundation/example/AGENTS.md +14 -0
  32. package/patterns/minimal-foundation/example/bin/develop.js +10 -5
  33. package/patterns/minimal-foundation/example/eslint.config.mjs +21 -2
  34. package/patterns/minimal-foundation/example/package.json +5 -4
  35. package/patterns/minimal-foundation/example/playwright.config.mjs +1 -1
  36. package/patterns/minimal-foundation/example/server/lib/envFile.js +19 -0
  37. package/patterns/minimal-foundation/example/server/lib/loggerOptions.js +15 -0
  38. package/patterns/minimal-foundation/example/server/lib/runtimeEnv.js +17 -17
  39. package/patterns/minimal-foundation/example/server.js +32 -29
  40. package/patterns/minimal-foundation/example/tests/server/smoke.test.js +2 -1
  41. package/patterns/shell-foundation/PATTERN.md +29 -0
  42. package/patterns/shell-foundation/example/AGENTS.md +14 -0
  43. package/patterns/shell-foundation/example/bin/develop.js +10 -5
  44. package/patterns/shell-foundation/example/eslint.config.mjs +21 -2
  45. package/patterns/shell-foundation/example/package.json +6 -5
  46. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  47. package/patterns/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +1 -0
  48. package/patterns/shell-foundation/example/playwright.config.mjs +1 -1
  49. package/patterns/shell-foundation/example/server/lib/envFile.js +19 -0
  50. package/patterns/shell-foundation/example/server/lib/loggerOptions.js +15 -0
  51. package/patterns/shell-foundation/example/server/lib/runtimeEnv.js +17 -17
  52. package/patterns/shell-foundation/example/server.js +32 -29
  53. package/patterns/shell-foundation/example/tests/server/smoke.test.js +2 -1
  54. package/reference/autogen/KERNEL_MAP.md +14 -8
  55. package/reference/autogen/PATTERN_INDEX.md +37 -37
  56. package/reference/autogen/README.md +2 -0
  57. package/reference/autogen/packages/agent-docs.md +70 -26
  58. package/reference/autogen/packages/agent-runtime.md +129 -0
  59. package/reference/autogen/packages/agent.md +149 -0
  60. package/reference/autogen/packages/architecture-inspector.md +97 -44
  61. package/reference/autogen/packages/assistant-core.md +786 -292
  62. package/reference/autogen/packages/assistant-runtime.md +182 -57
  63. package/reference/autogen/packages/assistant-voice-sherpa.md +4 -0
  64. package/reference/autogen/packages/assistant-voice.md +54 -8
  65. package/reference/autogen/packages/auth-core.md +44 -13
  66. package/reference/autogen/packages/auth-provider-local-core.md +86 -34
  67. package/reference/autogen/packages/auth-provider-local-db-core.md +1 -2
  68. package/reference/autogen/packages/auth-provider-oidc-core.md +10 -4
  69. package/reference/autogen/packages/auth-provider-supabase-core.md +52 -66
  70. package/reference/autogen/packages/auth-web.md +19 -11
  71. package/reference/autogen/packages/connectors-catalog.md +71 -43
  72. package/reference/autogen/packages/connectors-core.md +42 -4
  73. package/reference/autogen/packages/console-core.md +27 -14
  74. package/reference/autogen/packages/crud-core.md +178 -170
  75. package/reference/autogen/packages/database-runtime-mysql.md +0 -2
  76. package/reference/autogen/packages/database-runtime-postgres.md +0 -2
  77. package/reference/autogen/packages/database-runtime.md +39 -10
  78. package/reference/autogen/packages/http-runtime.md +79 -57
  79. package/reference/autogen/packages/json-rest-api-core.md +11 -8
  80. package/reference/autogen/packages/kernel.md +144 -83
  81. package/reference/autogen/packages/oidc-issuer-core.md +49 -20
  82. package/reference/autogen/packages/payments-core.md +20 -3
  83. package/reference/autogen/packages/realtime.md +47 -22
  84. package/reference/autogen/packages/resource-core.md +1 -1
  85. package/reference/autogen/packages/resource-crud-core.md +64 -26
  86. package/reference/autogen/packages/rewarded-core.md +47 -36
  87. package/reference/autogen/packages/shell-web.md +7 -10
  88. package/reference/autogen/packages/storage-runtime.md +6 -2
  89. package/reference/autogen/packages/uploads-runtime.md +10 -2
  90. package/reference/autogen/packages/users-core.md +73 -71
  91. package/reference/autogen/packages/workspaces-core.md +121 -106
  92. package/reference/autogen/packages/workspaces-web.md +1 -2
  93. package/reference/autogen/tooling/config-eslint.md +302 -0
  94. package/reference/autogen/tooling/jskit-catalog.md +28 -18
  95. package/reference/autogen/tooling/jskit-release.md +35 -20
  96. package/reference/autogen/tooling/testUtils.md +3 -1
  97. package/skills/jskit/SKILL.md +9 -8
  98. package/skills/jskit/references/app-operations.md +1 -1
  99. package/skills/jskit/references/client-features.md +491 -0
  100. package/skills/jskit/references/crud-form-actions.md +1 -1
  101. package/skills/jskit/references/crud-operations.md +7 -7
  102. package/skills/jskit/references/existing-application-migration.md +31 -27
  103. package/skills/jskit/references/heuristics/INDEX.md +5 -1
  104. package/skills/jskit/references/heuristics/child-cruds.md +1 -1
  105. package/skills/jskit/references/heuristics/client-features.md +66 -0
  106. package/skills/jskit/references/heuristics/client-requests.md +1 -1
  107. package/skills/jskit/references/heuristics/crud-authoring.md +12 -2
  108. package/skills/jskit/references/heuristics/crud-links.md +1 -1
  109. package/skills/jskit/references/heuristics/crud-repository-mapping.md +3 -3
  110. package/skills/jskit/references/heuristics/filters.md +1 -1
  111. package/skills/jskit/references/heuristics/live-actions.md +1 -1
  112. package/skills/jskit/references/heuristics/page-redirects.md +1 -1
  113. package/skills/jskit/references/heuristics/page-scaffolding.md +1 -1
  114. package/skills/jskit/references/heuristics/placements.md +1 -1
  115. package/skills/jskit/references/heuristics/row-policies.md +1 -1
  116. package/skills/jskit/references/heuristics/server-search.md +1 -1
  117. package/skills/jskit/references/heuristics/surfaces.md +1 -1
  118. package/skills/jskit/references/heuristics/typed-features.md +100 -0
  119. package/skills/jskit/references/heuristics/ui-contract.md +1 -1
  120. package/skills/jskit/references/heuristics/ui-testing.md +4 -4
  121. package/skills/jskit/references/material-3.md +2 -2
  122. package/skills/jskit/references/multi-homing.md +96 -50
  123. package/skills/jskit/references/pattern-index.md +37 -37
  124. package/skills/jskit/references/patterns/app/minimal-foundation/PATTERN.md +30 -1
  125. package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +14 -0
  126. package/skills/jskit/references/patterns/app/minimal-foundation/example/bin/develop.js +10 -5
  127. package/skills/jskit/references/patterns/app/minimal-foundation/example/eslint.config.mjs +21 -2
  128. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +5 -4
  129. package/skills/jskit/references/patterns/app/minimal-foundation/example/playwright.config.mjs +1 -1
  130. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/envFile.js +19 -0
  131. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/loggerOptions.js +15 -0
  132. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/runtimeEnv.js +17 -17
  133. package/skills/jskit/references/patterns/app/minimal-foundation/example/server.js +32 -29
  134. package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/server/smoke.test.js +2 -1
  135. package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +29 -0
  136. package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +14 -0
  137. package/skills/jskit/references/patterns/app/shell-foundation/example/bin/develop.js +10 -5
  138. package/skills/jskit/references/patterns/app/shell-foundation/example/eslint.config.mjs +21 -2
  139. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +6 -5
  140. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
  141. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +1 -0
  142. package/skills/jskit/references/patterns/app/shell-foundation/example/playwright.config.mjs +1 -1
  143. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/envFile.js +19 -0
  144. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/loggerOptions.js +15 -0
  145. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/runtimeEnv.js +17 -17
  146. package/skills/jskit/references/patterns/app/shell-foundation/example/server.js +32 -29
  147. package/skills/jskit/references/patterns/app/shell-foundation/example/tests/server/smoke.test.js +2 -1
  148. package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/ApplicationAiFeature.js +4 -2
  149. package/skills/jskit/references/patterns/auth/accounts-hub/PATTERN.md +2 -1
  150. package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
  151. package/skills/jskit/references/patterns/auth/accounts-hub/example/server/hubPaths.js +9 -3
  152. package/skills/jskit/references/patterns/auth/auth-surface/PATTERN.md +25 -12
  153. package/skills/jskit/references/patterns/auth/auth-surface/example/tools/preview-identity +7 -1
  154. package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +2 -2
  155. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
  156. package/skills/jskit/references/patterns/connectors/ai-connections/PATTERN.md +16 -1
  157. package/skills/jskit/references/patterns/connectors/ai-connections/example/ai-model.js +12 -3
  158. package/skills/jskit/references/patterns/connectors/ai-connections/example/perplexity-answer.js +15 -4
  159. package/skills/jskit/references/patterns/connectors/api-key-connection/PATTERN.md +9 -1
  160. package/skills/jskit/references/patterns/connectors/api-key-connection/example/connections.js +5 -2
  161. package/skills/jskit/references/patterns/connectors/aws-storage-queries/PATTERN.md +13 -3
  162. package/skills/jskit/references/patterns/connectors/aws-storage-queries/example/s3-transfer.js +14 -3
  163. package/skills/jskit/references/patterns/connectors/calendar-cli/PATTERN.md +8 -0
  164. package/skills/jskit/references/patterns/connectors/calendar-cli/example/knexfile.js +1 -1
  165. package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
  166. package/skills/jskit/references/patterns/connectors/calendar-cli/example/scripts/calendar.js +8 -4
  167. package/skills/jskit/references/patterns/connectors/event-delivery/PATTERN.md +1 -1
  168. package/skills/jskit/references/patterns/connectors/firebase-messaging/PATTERN.md +10 -0
  169. package/skills/jskit/references/patterns/connectors/firebase-messaging/example/server/notifications.js +8 -0
  170. package/skills/jskit/references/patterns/connectors/google-ads-search/PATTERN.md +18 -7
  171. package/skills/jskit/references/patterns/connectors/google-ads-search/example/ads-setup.js +13 -5
  172. package/skills/jskit/references/patterns/connectors/oauth-connection/PATTERN.md +1 -1
  173. package/skills/jskit/references/patterns/connectors/paddle-catalogue/PATTERN.md +11 -2
  174. package/skills/jskit/references/patterns/connectors/paddle-catalogue/example/create-products.js +5 -2
  175. package/skills/jskit/references/patterns/connectors/public-image/PATTERN.md +10 -1
  176. package/skills/jskit/references/patterns/connectors/public-image/example/logo-url.js +4 -1
  177. package/skills/jskit/references/patterns/connectors/redshift-queries/PATTERN.md +1 -1
  178. package/skills/jskit/references/patterns/connectors/source-scanning/PATTERN.md +13 -2
  179. package/skills/jskit/references/patterns/connectors/source-scanning/example/source-scanner.js +9 -0
  180. package/skills/jskit/references/patterns/crud/json-api-resource-package/PATTERN.md +102 -23
  181. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +3 -2
  182. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/server/types.js +5 -0
  183. package/skills/jskit/references/patterns/crud/resource-contract/PATTERN.md +54 -1
  184. package/skills/jskit/references/patterns/database/mysql-application/PATTERN.md +16 -5
  185. package/skills/jskit/references/patterns/database/mysql-application/example/knexfile.js +2 -2
  186. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
  187. package/skills/jskit/references/patterns/database/mysql-application/example/scripts/prepare-database.js +1 -1
  188. package/skills/jskit/references/patterns/database/postgres-application/PATTERN.md +16 -5
  189. package/skills/jskit/references/patterns/database/postgres-application/example/knexfile.js +2 -2
  190. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
  191. package/skills/jskit/references/patterns/database/postgres-application/example/scripts/prepare-database.js +1 -1
  192. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
  193. package/skills/jskit/references/patterns/rewards/google-rewarded/example/GoogleRewardedDeliveryProvider.js +1 -1
  194. package/skills/jskit/references/patterns/rewards/google-rewarded/example/googlePublisherTag.js +5 -11
  195. package/skills/jskit/references/patterns/server/feature-package/PATTERN.md +104 -10
  196. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +9 -4
  197. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/BookingEngineFeature.js +24 -0
  198. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/bookingAvailability.js +10 -0
  199. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/bookingEngine.js +29 -0
  200. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/bookingEngineActions.js +26 -0
  201. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/inputSchemas.js +1 -2
  202. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/types.js +12 -0
  203. package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineFeature.js +19 -0
  204. package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupFeature.js +23 -0
  205. package/skills/jskit/references/patterns/server/feature-package/example/variations/availabilityEngineActions.js +26 -0
  206. package/skills/jskit/references/patterns/server/feature-package/example/variations/customKnexRepository.js +32 -26
  207. package/skills/jskit/references/patterns/server/feature-package/example/variations/invoiceRollupActions.js +26 -0
  208. package/skills/jskit/references/patterns/server/feature-package/example/variations/orchestratorService.js +24 -19
  209. package/skills/jskit/references/patterns/server/feature-package/example/variations/types.js +7 -0
  210. package/skills/jskit/references/patterns/users/user-administration-server/PATTERN.md +16 -1
  211. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +3 -2
  212. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/server/types.js +5 -0
  213. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +4 -3
  214. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/server/UsersWorkspaceFeature.js +2 -9
  215. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/server/types.js +5 -0
  216. package/skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md +42 -17
  217. package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/WorkspaceInvitationsFeature.js +27 -0
  218. package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/email/workspaceInviteEmail.js +11 -10
  219. package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/email/workspaceInviteMailer.js +27 -0
  220. package/skills/jskit/references/translation.md +5 -4
  221. package/skills/jskit/references/typed-features.md +1099 -0
  222. package/skills/jskit/references/ui-operations.md +3 -3
  223. package/patterns/feature-package/example/booking-engine/src/server/BookingEngineProvider.js +0 -33
  224. package/patterns/feature-package/example/booking-engine/src/server/actions.js +0 -24
  225. package/patterns/feature-package/example/variations/AvailabilityEngineProvider.js +0 -31
  226. package/patterns/feature-package/example/variations/InvoiceRollupProvider.js +0 -36
  227. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/BookingEngineProvider.js +0 -33
  228. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/actions.js +0 -24
  229. package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineProvider.js +0 -31
  230. package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupProvider.js +0 -36
@@ -14,6 +14,11 @@ Use this on demand; do not load the full index at startup.
14
14
 
15
15
  ### src
16
16
 
17
+ ### `src/client/browser.js`
18
+ Exports
19
+ - `hasWindowFunction(name)`
20
+ - `waitForLayoutFrame()`
21
+
17
22
  ### `src/client/components/AssistantSettingsFormCard.vue`
18
23
  Exports
19
24
  - None
@@ -26,24 +31,12 @@ Exports
26
31
  Exports
27
32
  - None
28
33
  Local functions
29
- - `itemKey(item = {})`
30
- - `itemName(item = {})`
31
- - `itemPhase(item = {})`
32
- - `itemPercent(item = {})`
33
- - `itemProgressVisible(item = {})`
34
- - `itemProgressIndeterminate(item = {})`
35
- - `itemProgressValue(item = {})`
36
34
  - `itemProgressStationary(item = {})`
37
- - `itemBytesLabel(item = {})`
38
- - `itemStatusLabel(item = {})`
39
- - `itemCancelable(item = {})`
40
35
  - `actionKey(item = {}, action = "")`
41
36
  - `actionElement(element = null)`
42
37
  - `setActionElement(item = {}, action = "", element = null)`
43
38
  - `focusItemAction(item = {})`
44
39
  - `handleAction(action, item, index)`
45
- - `itemIcon(item = {})`
46
- - `itemColor(item = {})`
47
40
  - `updateReducedMotionPreference()`
48
41
 
49
42
  ### `src/client/conversation/AssistantComposerActions.vue`
@@ -64,7 +57,6 @@ Local functions
64
57
  - `resend(id)`
65
58
  - `cancel(id)`
66
59
  - `edit(id)`
67
- - `attachmentEvent(method, event)`
68
60
  - `attachSelectedFiles(event)`
69
61
  - `applyModel()`
70
62
  - `selectSuggestion(value)`
@@ -107,10 +99,7 @@ Exports
107
99
  Exports
108
100
  - None
109
101
  Local functions
110
- - `resizeTextarea()`
111
- - `queueResizeTextarea()`
112
- - `preserveHeightForNextModelValue()`
113
- - `handleTextareaInput(event = {})`
102
+ - `handleTextareaInput(event)`
114
103
  - `handleTextareaFocus(event = {})`
115
104
  - `handleTextareaBlur(event = {})`
116
105
  - `handleTextareaKeydown(event = {})`
@@ -125,43 +114,65 @@ Exports
125
114
  - None
126
115
  Local functions
127
116
  - `previewForTurn(turn)`
128
- - `displayTime(value = "")`
129
- - `userMessagePreviewText(value = "")`
130
- - `displayMessage(message = null, { allowNumberedQuestions = false, preserveParagraphLineBreaks = false, previewUserMessage = false } = {}, cacheKey = "")`
131
- - `displayThinkingMessage(message = null)`
132
- - `conversationAgentMessages(turn = {})`
133
- - `conversationMessageKey(message = {}, index = 0)`
134
117
  - `handleLongTextLinkClick(payload)`
135
118
  - `cancelRequested(turn = {})`
136
119
  - `userMessageCollapsible(message = null)`
137
120
  - `userMessageExpanded(turn = {})`
138
121
  - `toggleExpandedKey(expandedKeys, key)`
139
122
  - `toggleUserMessage(turn = {})`
140
- - `messageScrollKey(message = null)`
141
- - `clearUserScrollIntent()`
142
- - `resumePendingTailFollow()`
143
- - `markUserScrollIntent({ upward = false } = {})`
144
- - `markKeyboardScrollIntent(event = {})`
145
- - `rememberTouch(event = {})`
146
- - `markTouchScrollIntent(event = {})`
147
- - `scrollToLatestMessageAfterLayout({ behavior = "auto", force = false } = {})`
148
- - `queueInitialBottomScroll()`
149
- - `queueLiveBottomScroll({ force = false } = {})`
150
- - `clearLiveBottomScroll()`
151
- - `updateLatestFollowFromScroll(event = {})`
152
- - `visibleHistoryAnchor(element)`
153
- - `restoreAnchoredScroll(element, snapshot)`
154
- - `waitForTwoFrames()`
155
- - `restoreRetainedReaderScroll()`
156
- - `requestLoadMore()`
157
- - `clearLoadMoreScrollSnapshot()`
158
- - `completeLoadMoreRequest(version, changed)`
123
+
124
+ ### `src/client/conversation/attachmentFiles.js`
125
+ Exports
126
+ - `assistantAttachmentClipboardLocalFileReference(event)`
127
+ - `assistantAttachmentClipboardText(event)`
128
+ - `assistantAttachmentEventHasFiles(event)`
129
+ - `assistantAttachmentFiles(fileList)`
130
+ - `assistantAttachmentFilesFromDropEvent(event)`
131
+ - `assistantAttachmentFilesFromPasteEvent(event)`
132
+ - `assistantAttachmentFilesFromTransferItems(items)`
133
+ - `useAttachmentDropTarget({ uploadFiles, reportAttachmentError })`
134
+
135
+ ### `src/client/conversation/attachmentQueueItems.js`
136
+ Exports
137
+ - `activePhases`
138
+ - `itemBytesLabel(item = {})`
139
+ - `itemCancelable(item = {})`
140
+ - `itemColor(item = {})`
141
+ - `itemIcon(item = {})`
142
+ - `itemKey(item = {})`
143
+ - `itemName(item = {})`
144
+ - `itemPercent(item = {})`
145
+ - `itemPhase(item = {})`
146
+ - `itemProgressIndeterminate(item = {})`
147
+ - `itemProgressValue(item = {})`
148
+ - `itemProgressVisible(item = {})`
149
+ - `itemStatusLabel(item = {})`
159
150
 
160
151
  ### `src/client/conversation/attachmentSize.js`
161
152
  Exports
162
153
  - `attachmentLimitText(maxBytes)`
163
154
  - `attachmentSizeText(size)`
164
155
 
156
+ ### `src/client/conversation/attachmentUploadRows.js`
157
+ Exports
158
+ - `attachmentFileName(file)`
159
+ - `attachmentIdentity(attachment)`
160
+ - `attachmentReceipt(row, uploaded)`
161
+ - `attachmentUploadError(attachment)`
162
+ - `attachmentUploadResult(upload = null)`
163
+ - `buildQueueRow({ currentSessionId, file = null, fileName = "attachment", phase = "queued", producer = null, size = 0 } = {})`
164
+ - `createReceiptCleanup({ deleteAttachment, deletesUnsentUploads, reportAttachmentError })`
165
+ - `createWaiter(row)`
166
+ - `settleWaiter(row, value = null, waiter = row.waiter)`
167
+ - `updateRowProgress(row, progress, total)`
168
+ Local functions
169
+ - `nextAttachmentClientId()`
170
+ - `attachmentProgress(progress = {}, possibleTotal, fallbackTotal = 0)`
171
+
172
+ ### `src/client/conversation/conversationDisplay.js`
173
+ Exports
174
+ - `displayedConversation(adapter)`
175
+
165
176
  ### `src/client/conversation/index.js`
166
177
  Exports
167
178
  - `AssistantConversationElement`
@@ -210,7 +221,6 @@ Exports
210
221
  - `unmatchedOptimisticMessages(turns = [], optimisticMessages = [], { receiptsOnly = false } = {})`
211
222
  - `retainAssistantConversation`
212
223
  Local functions
213
- - `messageText(value)`
214
224
  - `turnMatchesOptimisticMessage(turn = {}, optimistic = {})`
215
225
 
216
226
  ### `src/client/conversation/retainedConversation.js`
@@ -219,34 +229,36 @@ Exports
219
229
 
220
230
  ### `src/client/conversation/submitText.js`
221
231
  Exports
222
- - `createAssistantTextSubmission({ getState, setDraft, submit, afterDraftChange = async () => {} })`
232
+ - `createAssistantTextSubmission({ getState, setDraft, submit, afterDraftChange = readStateAtOnce })`
223
233
  Local functions
224
234
  - `submissionError(message, { messageCode })`
235
+ - `readStateAtOnce()`
236
+
237
+ ### `src/client/conversation/transcriptEntries.js`
238
+ Exports
239
+ - `useTranscriptEntries(props)`
240
+ - `userMessagePreviewText(value = "")`
241
+ Local functions
242
+ - `conversationAgentMessages(turn = {})`
243
+ - `conversationMessageKey(message = {}, index = 0)`
225
244
 
226
245
  ### `src/client/conversation/useAssistantAttachments.js`
227
246
  Exports
228
247
  - `ASSISTANT_ATTACHMENT_MAX_BYTES`
229
248
  - `ASSISTANT_ATTACHMENT_MAX_ITEMS`
230
249
  - `ASSISTANT_ATTACHMENT_UPLOAD_CONCURRENCY`
231
- - `assistantAttachmentEventHasFiles(event)`
232
- - `assistantAttachmentFiles(fileList = [])`
233
- - `assistantAttachmentFilesFromDropEvent(event)`
234
- - `assistantAttachmentFilesFromPasteEvent(event)`
235
- - `assistantAttachmentFilesFromTransferItems(items = [])`
236
- - `useAssistantAttachments({ canUpload = () => true, deleteAttachment = null, onError = null, onUploaded = async () => null, sessionId, uploadAttachment, maxBytes = ASSISTANT_ATTACHMENT_MAX_BYTES, maxItems = ASSISTANT_ATTACHMENT_MAX_ITEMS, uploadConcurrency = ASSISTANT_ATTACHMENT_UPLOAD_CONCURRENCY } = {})`
250
+ - `assistantAttachmentEventHasFiles`
251
+ - `assistantAttachmentFiles`
252
+ - `assistantAttachmentFilesFromDropEvent`
253
+ - `assistantAttachmentFilesFromPasteEvent`
254
+ - `assistantAttachmentFilesFromTransferItems`
255
+ - `useAssistantAttachments({ canUpload = () => true, deleteAttachment, onError = keepAttachmentErrorInStatus, onUploaded = keepUploadedAttachmentsReady, sessionId, uploadAttachment, maxBytes = ASSISTANT_ATTACHMENT_MAX_BYTES, maxItems = ASSISTANT_ATTACHMENT_MAX_ITEMS, uploadConcurrency = ASSISTANT_ATTACHMENT_UPLOAD_CONCURRENCY })`
237
256
  Local functions
238
257
  - `attachmentErrorText(error, fallback)`
239
258
  - `assistantAttachmentSessionId(sessionId)`
240
259
  - `assistantAttachmentUploadAllowed(canUpload)`
241
- - `assistantAttachmentClipboardText(event)`
242
- - `assistantAttachmentClipboardLocalFileReference(event)`
243
- - `attachmentUploadError(attachment = {})`
244
- - `attachmentIdentity(attachment = {})`
245
- - `nextAttachmentClientId()`
246
- - `attachmentFileName(file = {})`
247
- - `attachmentUploadResult(upload = null)`
248
- - `attachmentProgress(progress = {}, possibleTotal, fallbackTotal = 0)`
249
- - `attachmentReceipt(row, uploaded = {})`
260
+ - `keepAttachmentErrorInStatus()`
261
+ - `keepUploadedAttachmentsReady()`
250
262
 
251
263
  ### `src/client/conversation/useAssistantQuestions.js`
252
264
  Exports
@@ -254,18 +266,26 @@ Exports
254
266
 
255
267
  ### `src/client/conversation/useAssistantSuggestions.js`
256
268
  Exports
257
- - `useAssistantSuggestions({ active = true, requestKey = "", draft = "", configuration = {}, generate, onSelect = () => false, debounceMs = 750, minIntervalMs = 0 } = {})`
269
+ - `useAssistantSuggestions({ active = true, requestKey = "", draft = "", configuration = {}, generate, onSelect = () => false, debounceMs = 750, minIntervalMs = 0 })`
258
270
 
259
271
  ### `src/client/conversation/useScrollToBottom.js`
260
272
  Exports
261
- - `useScrollToBottom({ anchor = null, enabled = true, scrollAnchorIntoView = true, settleDelaysMs = DEFAULT_SETTLE_DELAYS_MS, target } = {})`
273
+ - `useScrollToBottom({ anchor = null, enabled = true, scrollAnchorIntoView = true, settleDelaysMs = DEFAULT_SETTLE_DELAYS_MS, target })`
262
274
  Local functions
263
275
  - `readElement(value)`
264
- - `hasWindowTimer(name)`
265
- - `waitForLayoutFrame()`
266
276
  - `normalizedScrollBehavior(value = "")`
267
277
  - `scrollElementToBottom(targetElement, behavior = "auto")`
268
278
 
279
+ ### `src/client/conversation/useTextareaAutoGrow.js`
280
+ Exports
281
+ - `useTextareaAutoGrow(props, textareaRef)`
282
+
283
+ ### `src/client/conversation/useTranscriptScrollFollow.js`
284
+ Exports
285
+ - `useTranscriptScrollFollow({ props, displayEntries, isWorking, bodyElement, bottomElement, loadMore })`
286
+ Local functions
287
+ - `messageScrollKey(message = null)`
288
+
269
289
  ### `src/client/i18n.js`
270
290
  Exports
271
291
  - `useJskitText`
@@ -279,20 +299,35 @@ Exports
279
299
 
280
300
  ### `src/client/lib/assistantApi.js`
281
301
  Exports
282
- - `createAssistantApi({ request, requestStream, resolveBasePath, resolveSurfaceId = null } = {})`
302
+ - `createAssistantApi({ request, requestStream, resolveBasePath, resolveSurfaceId })`
283
303
  - `buildStreamEventError(event)`
284
304
  Local functions
285
- - `isRecord(value)`
286
305
  - `appendQueryParam(params, key, value)`
287
306
  - `createAssistantQueryParams(query = {}, transport = null)`
288
307
  - `normalizeSurfaceHeaderValue(value)`
289
- - `resolveAssistantRequestHeaders(resolveSurfaceId)`
308
+ - `resolveAssistantRequestHeaders(resolveSurfaceId, sendsSurface)`
290
309
  - `resolveRequiredBasePath(resolveBasePath)`
310
+ - `ignoreStreamEvent()`
291
311
 
292
312
  ### `src/client/lib/assistantHttpClient.js`
293
313
  Exports
294
314
  - `assistantHttpClient`
295
315
 
316
+ ### `src/client/types.js`
317
+ Exports
318
+ - `type AssistantAttachments`
319
+ - `type AssistantSuggestions`
320
+ - `type AssistantQuestions`
321
+ - `type AssistantMessageDelivery`
322
+ - `type AssistantApi`
323
+ - `type AssistantAttachmentReceipt`
324
+ - `type AssistantAttachmentUpload`
325
+ - `type AssistantAttachmentDeletion`
326
+ - `type AssistantGoalState`
327
+ - `type AssistantConversationAdapter`
328
+ - `type AssistantConversationActions`
329
+ - `type AssistantModelChoices`
330
+
296
331
  ### `src/server/conversation/agentRun.js`
297
332
  Exports
298
333
  - `conversationAgentRunRecord(record, normalizedRunId, { normalizeState = normalizeRunState, isActive = runStateIsActive } = {})`
@@ -307,6 +342,7 @@ Local functions
307
342
  Exports
308
343
  - `conversationAttachmentIds(value = [])`
309
344
  - `createConversationAttachmentReader({ attachments, context, conversationId, signal, authorize, types, maximumBytes })`
345
+ - `NO_ATTACHMENTS`
310
346
  Local functions
311
347
  - `invalid(message, { messageCode, messageParams = {} })`
312
348
 
@@ -321,13 +357,21 @@ Local functions
321
357
  ### `src/server/conversation/claudeClient.js`
322
358
  Exports
323
359
  - `CLAUDE_JSON_MAX_FRAME_BYTES`
324
- - `createClaudeJsonClient({ stream, onEvent = async () => {}, onControlRequest, onFailure = async () => {}, timeoutMs = 30_000 } = {})`
360
+ - `createClaudeJsonClient({ stream, onEvent = ignoreClaudeFrame, onControlRequest, onFailure = ignoreClaudeFailure, timeoutMs = 30_000 })`
325
361
  - `readClaudeJsonFrames`
326
362
  Local functions
327
363
  - `claudeProtocolError(message, code = "assistant_claude_protocol_error")`
364
+ - `ignoreClaudeFrame()`
365
+ - `ignoreClaudeFailure()`
366
+ - `reportNoProgress()`
367
+
368
+ ### `src/server/conversation/claudeCommandRun.js`
369
+ Exports
370
+ - `createClaudeCommandRun({ bound, preparation, send, interrupt })`
328
371
 
329
372
  ### `src/server/conversation/claudeHistory.js`
330
373
  Exports
374
+ - `claudeNativeMessageId(id)`
331
375
  - `listClaudeConversationStorage({ configRoot, binding })`
332
376
  - `deleteClaudeConversationHistory({ configRoot, workdir, conversationId })`
333
377
  - `retireClaudeConversationHistory({ configRoot, binding, beforeDelete, requireIdle, signal })`
@@ -345,10 +389,27 @@ Local functions
345
389
  - `completeHistoryOffset(handle, start, size)`
346
390
  - `readClaudeHistoryFrames(file)`
347
391
 
392
+ ### `src/server/conversation/claudeNativeTurn.js`
393
+ Exports
394
+ - `claudeTurnFailure(message, { code = "assistant_claude_turn_failed" } = {})`
395
+ - `createClaudeConversationTurn({ conversationId, onEvent, process, entry, bound = false })`
396
+ - `type ClaudeTurnProcess`
397
+ Local functions
398
+ - `steeringRefusal(message, { messageCode, finished })`
399
+ - `setClaudeTurnState(entry, state, message = "")`
400
+ - `claudeTurnResult(entry, current)`
401
+ - `claudeProviderChange(frame)`
402
+ - `continuesClaudeTurn(frame)`
403
+ - `updateClaudeBackgroundTasks(tasks, frame)`
404
+ - `liveClaudeBlock(messages, messageId, frame, role)`
405
+ - `claudeResultError(frame, output)`
406
+ - `claudeResultMessage(frame, turnId, result)`
407
+ - `retainStoppedClaudeMessages(messages, pendingAssistantMessages)`
408
+
348
409
  ### `src/server/conversation/claudeProcess.js`
349
410
  Exports
350
411
  - `claudeUnexpectedExitMessage(processExit = {})`
351
- - `readClaudeCodeAuthStatus({ env = process.env, credentialHome = { home: env.HOME || homedir() }, command = "claude", commandRunner, signal } = {})`
412
+ - `readClaudeCodeAuthStatus({ env, credentialHome, command = "claude", commandRunner, signal })`
352
413
  - `claudeConnectionIdentity(configRoot, providerId, baseUrl, apiKey)`
353
414
  - `claudeModelConfiguration({ providerId, model: modelId }, connection)`
354
415
  - `verifyClaudeProviderKey(provider, apiKey, fetchImpl)`
@@ -358,42 +419,70 @@ Exports
358
419
  - `bindClaudeConversationAccount(entry, { identity, providerId, allowAccountChange = false, stop, save })`
359
420
  - `claudePlanUsage(value)`
360
421
  - `claudeCatalogueModels(initialization)`
361
- - `createClaudeAccountQueries({ createProcess, accountIdentity, configRoot, processes = () => [], isClosing = () => false })`
362
- - `createClaudeCodeProcess({ command = "claude", execution = createLocalConversationExecution(), env = process.env, workdir, onEvent, onControlRequest, onFailure, onStarted, executionLimits, signal, commandWrapper, initializationTimeoutMs = 30_000, onInitializationProgress, ...options } = {})`
363
- Local functions
422
+ - `createClaudeAccountQueries({ createProcess, accountIdentity, configRoot, processes = noOwnedProcesses, isClosing = neverClosing })`
423
+ - `createClaudeCodeProcess({ command = "claude", execution = createLocalConversationExecution(), env, workdir, onEvent, onControlRequest, onFailure = ignoreProcessFailure, onStarted = ignoreProcessStart, executionLimits, signal, commandWrapper, initializationTimeoutMs = 30_000, onInitializationProgress, ...options })`
424
+ - `type ClaudeCodeProcess`
425
+ Local functions
426
+ - `ignoreProcessStart()`
427
+ - `ignoreProcessFailure()`
428
+ - `noOwnedProcesses()`
429
+ - `neverClosing()`
364
430
  - `fileRevision(file)`
365
431
  - `readNativeClaudeCodeAuthStatus({ env, credentialHome, command, commandRunner, signal })`
366
432
  - `claudeCodeAuthStatus(result)`
367
433
  - `claudePlanUsageVerified(value)`
368
434
  - `presentPlanUsage(reading)`
369
435
 
436
+ ### `src/server/conversation/claudeProcessStart.js`
437
+ Exports
438
+ - `hasPendingClaudeStartup(entry)`
439
+ - `createClaudeProcessStart({ store, process, createError, onEvent, bound, readHistory, isClosing, applicationCall, currentApplicationCommand })`
440
+
441
+ ### `src/server/conversation/claudePromptDelivery.js`
442
+ Exports
443
+ - `createClaudePromptDelivery({ store, preparation, createError, onEvent, readHistory, bindAccount, ensureProcess, snapshot })`
444
+
445
+ ### `src/server/conversation/claudeSessionCleanup.js`
446
+ Exports
447
+ - `createClaudeSessionCleanup({ entries, store, configRoot, acquire, savedState, holdsNativeWork, disconnectedMessage })`
448
+
370
449
  ### `src/server/conversation/claudeTools.js`
371
450
  Exports
372
- - `claudeApplicationToolResponse(request, { schemas, turn, signal, assertCurrent, onExecutionFailure })`
451
+ - `claudeApplicationToolResponse(request, { schemas, turn, signal, assertCurrent = acceptNativeCall, onExecutionFailure = ignoreExecutionFailure })`
373
452
  - `CLAUDE_APPLICATION_TOOL_SERVER`
453
+ Local functions
454
+ - `acceptNativeCall()`
455
+ - `ignoreExecutionFailure()`
374
456
 
375
457
  ### `src/server/conversation/claudeTurn.js`
376
458
  Exports
377
- - `claudeNativeMessageId(id)`
378
- - `waitForClaudeConversationTurn(conversation, input = {}, { signal, defaultTimeoutMs = 180_000, maximumTimeoutMs = Infinity, createError = failure, interruptedMessage = "Claude was interrupted when the application disconnected." } = {})`
379
- - `runClaudeRenewalTurn(conversation, { clientMessageId, prompt, outputSchema, expectedThreadId, forbiddenThreadId, requireFreshHistory = false, timeoutMs = 180_000 }, { createError = failure, unreadableCode = "assistant_claude_turn_unreadable", failedCode = "assistant_claude_turn_failed", acceptedField = "inputAccepted" } = {})`
459
+ - `waitForClaudeConversationTurn(conversation, input = {}, { signal, defaultTimeoutMs = 180_000, maximumTimeoutMs = Infinity, createError = claudeTurnFailure, interruptedMessage = "Claude was interrupted when the application disconnected." } = {})`
460
+ - `runClaudeRenewalTurn(conversation, { clientMessageId, prompt, outputSchema, expectedThreadId, forbiddenThreadId, requireFreshHistory = false, timeoutMs = 180_000 }, { createError = claudeTurnFailure, unreadableCode = "assistant_claude_turn_unreadable", failedCode = "assistant_claude_turn_failed", acceptedField = "inputAccepted" } = {})`
380
461
  - `createClaudeConversationGoals({ conversationId, readHistory, readState, interrupt, send, readRetainedGoal, saveRetainedGoal })`
381
- - `createClaudeConversationOwner({ configRoot, store, preparation, process, onEvent, createError = failure, disconnectedMessage = "Claude was interrupted when the application disconnected." })`
382
- - `createClaudeConversationTurn({ conversationId, onEvent = async () => {}, process, entry, bound = false } = {})`
462
+ - `createClaudeConversationOwner({ configRoot, store, preparation, process, onEvent, createError = claudeTurnFailure, disconnectedMessage = "Claude was interrupted when the application disconnected." })`
463
+ - `type ClaudeConversationEntry`
464
+ - `type ClaudeConversationStore`
465
+ - `type ClaudeConversationPreparation`
466
+ - `type ClaudeConversationProcessHost`
467
+ - `type ClaudeConversationEventHandler`
468
+ - `type ClaudeConversationErrorFactory`
383
469
  Local functions
384
- - `failure(message, code = "assistant_claude_turn_failed")`
385
- - `now()`
386
- - `hasPendingClaudeStartup(entry)`
387
470
  - `nativeWorkSettled(entry)`
388
471
  - `runsNativeWork(entry)`
389
472
 
473
+ ### `src/server/conversation/codexAccountReader.js`
474
+ Exports
475
+ - `createCodexAccountReader({ errorPrefix = "", identityNamespace = "codex-account-v1", secretNamespace = "codex-auth-secret-v1" } = {})`
476
+ - `codexAuthOutputRequiresReconnect(output = "")`
477
+ - `CODEX_APP_SERVER_ACCOUNT_ID_MAX_LENGTH`
478
+
390
479
  ### `src/server/conversation/codexAuthPreflight.js`
391
480
  Exports
392
- - `assertCodexAuthPreflightReady(options = {}, { reason = "codex-auth-preflight", execution, credentials } = {})`
481
+ - `assertCodexAuthPreflightReady(options, { reason = "codex-auth-preflight", execution, credentials })`
393
482
  Local functions
394
483
  - `tailAppend(text = "", chunk = "", maxBytes = CODEX_AUTH_PREFLIGHT_OUTPUT_TAIL_BYTES)`
395
484
  - `codexAuthPreflightArgs()`
396
- - `runCodexAuthPreflight({ codexCommand = "codex", env = process.env, executionRoot = "", runtimeDir = "", terminalEnv = {}, timeoutMs = CODEX_AUTH_PREFLIGHT_TIMEOUT_MS, toolHomeSource = "", workdir = "" } = {}, execution)`
485
+ - `runCodexAuthPreflight({ codexCommand = "codex", env, executionRoot = "", runtimeDir = "", terminalEnv = {}, timeoutMs = CODEX_AUTH_PREFLIGHT_TIMEOUT_MS, toolHomeSource = "", workdir = "" } = {}, execution)`
397
486
 
398
487
  ### `src/server/conversation/codexClient.js`
399
488
  Exports
@@ -404,6 +493,7 @@ Local functions
404
493
  - `codexAppServerRequestAbortedError(method = "")`
405
494
  - `addSocketListener(socket, eventName, handler)`
406
495
  - `socketMessageText(event, maxBytes = Number.POSITIVE_INFINITY)`
496
+ - `ignoreDisconnect()`
407
497
 
408
498
  ### `src/server/conversation/codexConfiguration.js`
409
499
  Exports
@@ -413,14 +503,11 @@ Exports
413
503
  - `codexAppServerTurnSettings({ effectiveSettings, cwd = "", effort = "", model = "", approvalPolicy, reasoningSummary, sandboxPolicy, externalSandbox = false } = {})`
414
504
  - `codexInteractiveArguments({ command, threadId = "", remoteEndpoint = "", model, effort, disableStartupUpdates = false, bypassApprovalsAndSandbox = false, bypassHookTrust = false } = {})`
415
505
  - `codexAppServerProjectHookTrustConfig(provider, cwd = "", { persist = false } = {})`
416
- - `prepareCodexModelCatalog({ command, runtimeDir, bundled = false, signal, additionalModels = [], codexHome = process.env.CODEX_HOME || path.join(os.homedir(), ".codex") })`
506
+ - `prepareCodexModelCatalog({ command, runtimeDir, bundled = false, signal, additionalModels = [], codexHome })`
417
507
  - `readCodexModelContextWindow({ runtimeDir, model } = {})`
418
508
  - `codexAppServerTextHasControlCharacters(value = "")`
419
- - `createCodexAppServerIsolation({ clientName = "jskit", minimumVersion = "0.151.0", disabledFeatures = DISABLED_FEATURES, limits: { userAgentMaxLength = 512, mcpServerMaxCount = 128, mcpServerNameMaxLength = 256, configResponseMaxBytes = 256 * 1024, hookMaxCount = 256, hookErrorMaxCount = 256, hookFieldMaxLength = 2048, hookFingerprintMaxLength = 256 * 1024, hookResponseMaxBytes = 512 * 1024 } = {}, createError = codexAppServerIsolationPolicyError } = {})`
420
- - `codexToolFreeConfiguration(options)`
421
- - `readCodexToolFreeConfiguration(provider = null, workdir = "", assertCompatibility = codexConversationIsolation.assertCompatibility)`
422
509
  - `codexCatalogRows(value = null, createError = message => new Error(message))`
423
- - `codexCatalogReasoningEfforts(model = {})`
510
+ - `codexCatalogReasoningEfforts(model)`
424
511
  - `codexCatalogModels(rows)`
425
512
  - `codexConfiguredModelCatalog(includeModel, model, reasoningEffort)`
426
513
  - `codexProviderModelCatalog({ models })`
@@ -429,50 +516,73 @@ Exports
429
516
  - `codexProviderFileConfiguration(provider, key, codexHome)`
430
517
  - `copyCodexProviderHome(sourceHome, targetHome)`
431
518
  - `verifyCodexProviderKey(provider, apiKey, fetchImpl = fetch)`
432
- - `createCodexAccountReader({ errorPrefix = "", identityNamespace = "codex-account-v1", secretNamespace = "codex-auth-secret-v1" } = {})`
433
- - `codexAuthOutputRequiresReconnect(output = "")`
434
- - `CODEX_APP_SERVER_ACCOUNT_ID_MAX_LENGTH`
435
519
  Local functions
436
520
  - `codexModelCatalogRevision({ command, codexHome, bundled, additionalModels })`
437
- - `isPlainRecord(value)`
438
- - `deepFreezeCodexAppServerHelperConfig(value)`
439
- - `codexAppServerIsolationPolicyError(message = "", details = {})`
440
521
  - `codexProviderCatalogSetting(codexHome)`
441
522
 
442
523
  ### `src/server/conversation/codexConversations.js`
443
524
  Exports
444
525
  - `createCodexConversationCommands({ checkpoint, codexAppServerConversationMessageId, codexAppServerStreamMessage, conversationPreparation, ensureCodexAppServerProviderForActiveTurn, errorPrefix, helperLifecycle, helperOwnershipError, interruptFailedCode, namespace, providerSessions, ensureSessionProvider, borrowSessionProvider, steerFailedCode, turnOutcomes })`
526
+ - `type CodexConversationRegistry`
527
+ - `type CodexConversationLookup`
528
+ - `type CodexConversationStateUpdate`
529
+ - `type CodexConversationObserver`
530
+ - `type CodexProviderBorrowHandle`
531
+ - `type CodexConversationContextReader`
532
+ - `type CodexConversationResult`
533
+ - `type CodexProviderBorrow`
534
+ - `type CodexConversationCommands`
535
+
536
+ ### `src/server/conversation/codexConversationStops.js`
537
+ Exports
538
+ - `createCodexConversationStops({ codexAppServerConversations, codexAppServerConversation, codexAppServerConversationContext, codexAppServerConversationResult, withProviderBorrow, forgetObservation, holdWhileActive, conversationPreparation, helperLifecycle, providerSessions, namespace, errorPrefix, interruptFailedCode, turnOutcomes })`
539
+ - `type CodexConversationStops`
445
540
 
446
541
  ### `src/server/conversation/codexConversationStore.js`
447
542
  Exports
448
- - `createCodexConversationRunStore({ storage, scope, segmentId, isCurrent, clock = () => new Date() } = {})`
449
- - `createCodexConversationStore({ storage, scope, segmentId, isCurrent, transcript, streams } = {})`
543
+ - `createCodexConversationRunStore({ storage, scope, segmentId, isCurrent, clock = () => new Date() })`
544
+ - `createCodexConversationStore({ storage, scope, segmentId, isCurrent, transcript, streams })`
545
+ - `type ConversationTranscript`
546
+ - `type ConversationStreams`
547
+
548
+ ### `src/server/conversation/codexConversationTurns.js`
549
+ Exports
550
+ - `ignoreCodexConversationEvent()`
551
+ - `codexAppServerEphemeralConversationSnapshot(state = {})`
552
+ - `prepareCodexAppServerConversationThread(provider, preparation, helperIsolation)`
553
+ - `createCodexConversationTurns({ codexAppServerConversations, codexAppServerConversation, observeCodexConversation, holdWhileActive, namespace, errorPrefix, helperOwnershipError, steerFailedCode, interruptFailedCode })`
554
+ - `type CodexConversationTurns`
555
+ Local functions
556
+ - `notifyNoConversationPromptSending()`
557
+
558
+ ### `src/server/conversation/codexDetachedConversation.js`
559
+ Exports
560
+ - `acquireCodexAppServerDetachedThread(provider, requestedThreadId, threadSettings, input = {})`
561
+ - `codexAppServerDetachedThreadId(thread, requestedThreadId)`
562
+ - `dispatchCodexAppServerDetachedTurn({ provider, prompt, threadId }, authorized)`
563
+ - `runDetachedCodexAppServerTurn({ provider, threadId, timeoutMs, onEvent: emitDetachedEvent, onFailure } = {}, operation)`
564
+ - `createCodexDetachedConversation({ conversationPreparation, codexAppServerConversationResult, codexAppServerConversationContext, helperLifecycle, helperOwnershipError })`
565
+ - `type CodexDetachedConversation`
566
+ Local functions
567
+ - `ignoreDetachedConversationEvent()`
450
568
 
451
569
  ### `src/server/conversation/codexDetachedTurn.js`
452
570
  Exports
453
571
  - `CODEX_APP_SERVER_DETACHED_TURN_TIMEOUT_MS`
454
- - `createCodexAppServerDetachedTurnWatcher(provider = null, threadId = "", { includeThreadHistory = true, allowEmptyResponse = false, onEvent = null, timeoutMs = CODEX_APP_SERVER_DETACHED_TURN_TIMEOUT_MS } = {})`
572
+ - `createCodexAppServerDetachedTurnWatcher(provider, threadId = "", { includeThreadHistory = true, allowEmptyResponse = false, onEvent = ignoreCodexDetachedTurnEvent, timeoutMs = CODEX_APP_SERVER_DETACHED_TURN_TIMEOUT_MS } = {})`
573
+ - `ignoreCodexDetachedTurnEvent()`
455
574
  - `waitForCodexAppServerTurn(provider, threadId = "", turn = null, { timeoutMs = CODEX_APP_SERVER_DETACHED_TURN_TIMEOUT_MS, createError = codexAppServerTurnError } = {})`
575
+ - `type CodexDetachedTurnProvider`
576
+ - `type CodexDetachedTurnEventObserver`
456
577
  Local functions
457
578
  - `codexAppServerTurnTokenUsage(notification = {})`
458
579
  - `codexAppServerTurnError(reason, details = {}, providerMessage = "")`
459
580
 
460
581
  ### `src/server/conversation/codexEvents.js`
461
582
  Exports
462
- - `codexContextUsageFromNotification(notification = {})`
583
+ - `codexAppServerProviderThreadAssistantSegments`
584
+ - `codexContextUsageFromNotification(notification)`
463
585
  - `classifyCodexAppServerEvent(notification = {})`
464
- - `codexAppServerThreadRawValue(thread = {})`
465
- - `codexAppServerThreadTurnId(thread = {})`
466
- - `codexAppServerThreadError(thread = {})`
467
- - `codexAppServerProviderThreadTurns(thread = null)`
468
- - `codexAppServerProviderTurnId(turn = {})`
469
- - `codexAppServerProviderTurnStatus(turn = {})`
470
- - `codexAppServerProviderTurnItems(turn = {})`
471
- - `codexAppServerProviderTurnClientIds(turn = {})`
472
- - `codexAppServerProviderTurnForOperation(thread = null, { clientMessageId = "", turnId = "" } = {})`
473
- - `inspectCodexAppServerRenewalThread(thread = null, { clientMessageId = "", turnId: expectedTurnId = "", requireFresh = false } = {})`
474
- - `codexAppServerProviderTurnText(thread = null, turnId = "")`
475
- - `codexAppServerProviderTurnError(turn = {})`
476
586
  - `codexAppServerAgentMessageText(payload = {})`
477
587
  - `codexAppServerAssistantItemText(item = {})`
478
588
  - `codexAppServerContentText(value = null)`
@@ -484,26 +594,22 @@ Exports
484
594
  - `codexAppServerNotificationEventType(notification = {}, event = null)`
485
595
  - `codexAppServerNotificationItem(notification = {})`
486
596
  - `codexAppServerNotificationItemId(notification = {})`
487
- - `codexAppServerNotificationParams(notification = {})`
597
+ - `codexAppServerNotificationParams(notification)`
488
598
  - `codexAppServerNotificationThreadId(notification = {})`
489
599
  - `codexAppServerNotificationTurnId(notification = {})`
490
600
  - `codexAppServerNotificationTurnStatus(notification = {})`
491
601
  - `codexAppServerNotificationUsageLimitExceeded(notification = {})`
492
- - `codexAppServerProviderThreadAssistantSegments(value = {}, turnId = "")`
493
602
  - `codexAppServerOutputOwnerTurnId({ notificationThreadId = "", notificationTurnId = "", trackedActive = false, trackedState = "", trackedThreadId = "", trackedTurnId = "" } = {})`
603
+ - `codexAppServerSignedOutText(text = "")`
494
604
  - `codexAppServerStatusFromValue(status = null)`
495
605
  - `codexAppServerUserMessageText(item = {})`
496
606
  Local functions
497
607
  - `nonNegativeInteger(value)`
498
- - `codexAppServerSignedOutText(text = "")`
499
608
  - `codexAppServerTextInputText(input = {})`
500
609
  - `codexAppServerHookPromptText(item = {})`
501
610
  - `codexAppServerFinalEventText(notification = {}, event = null, payload = {})`
502
611
  - `codexAppServerSignalName(value = "")`
503
612
  - `codexAppServerSignalNames(value = null)`
504
- - `codexAppServerProviderThread(value = {})`
505
- - `codexAppServerProviderThreadTurn(value = {}, turnId = "")`
506
- - `codexAppServerProviderTurnAssistantSegments(turn = {})`
507
613
 
508
614
  ### `src/server/conversation/codexGoalCommands.js`
509
615
  Exports
@@ -519,9 +625,15 @@ Exports
519
625
 
520
626
  ### `src/server/conversation/codexHelperThreadLedger.js`
521
627
  Exports
628
+ - `createCodexHelperThreadLedgerOwner({ executionProfile, snapshotExecutionProfile = executionProfile, errorPrefix = "codex_helper_" })`
629
+ Local functions
630
+ - `observeNoLock()`
631
+
632
+ ### `src/server/conversation/codexHelperThreadRecord.js`
633
+ Exports
522
634
  - `CODEX_HELPER_THREAD_LEDGER_SCHEMA_VERSION`
523
635
  - `CODEX_HELPER_THREAD_LIFECYCLES`
524
- - `createCodexHelperThreadLedgerOwner({ executionProfile, snapshotExecutionProfile = executionProfile, errorPrefix = "codex_helper_" } = {})`
636
+ - `createCodexHelperThreadRecordSchema({ executionProfile, errorPrefix })`
525
637
 
526
638
  ### `src/server/conversation/codexHelperThreadRecovery.js`
527
639
  Exports
@@ -529,11 +641,18 @@ Exports
529
641
 
530
642
  ### `src/server/conversation/codexHelperThreads.js`
531
643
  Exports
532
- - `createCodexHelperThreadLifecycle({ providerOwner, ledgerOwner, applicationName = "Application", errorPrefix = "" } = {})`
644
+ - `createCodexHelperThreadLifecycle({ providerOwner, ledgerOwner, applicationName = "Application", errorPrefix = "" })`
645
+ - `type CodexHelperThreadLifecycle`
646
+ Local functions
647
+ - `codexAppServerHelperThreadKey({ projectRuntimeRoot = "", sessionId = "", threadId = "" } = {})`
648
+ - `codexAppServerProviderKeyFingerprint(providerKey = "")`
649
+ - `codexAppServerRuntimeIdentityMatches(expected = {}, actual = {}, { requireAccount = true, requireEndpoint = true } = {})`
650
+ - `codexAppServerHelperThreadOwnershipMatches(record = {}, { providerKey = "", runtime = {}, server = null } = {}, options = {})`
651
+ - `ignoreHelperThreadRetired()`
533
652
 
534
653
  ### `src/server/conversation/codexHistoryAdapter.js`
535
654
  Exports
536
- - `startCodexHistoryAdapter({ token, codexHome, readHistoryPath, fetchImpl = fetch, maxRequestBytes = MAX_REQUEST_BYTES } = {})`
655
+ - `startCodexHistoryAdapter({ token, codexHome, readHistoryPath = readNoHistoryPath, fetchImpl = fetch, maxRequestBytes = MAX_REQUEST_BYTES } = {})`
537
656
  - `translateCodexHistory(body, destination = "openai")`
538
657
  - `prepareCodexHistory(params, client, { baseUrl, modelProviderId, ...options } = {})`
539
658
  - `readCodexHistoryRows`
@@ -545,6 +664,7 @@ Local functions
545
664
  - `retainedUserRecord(item)`
546
665
  - `restoreCompactedHistory(body, { destination, historyPath, codexHome, signal, maxRequestBytes })`
547
666
  - `forwardedHeaders(input)`
667
+ - `readNoHistoryPath()`
548
668
 
549
669
  ### `src/server/conversation/codexHomeStorage.js`
550
670
  Exports
@@ -553,19 +673,39 @@ Exports
553
673
  Local functions
554
674
  - `directoryNames(directory)`
555
675
 
676
+ ### `src/server/conversation/codexIsolation.js`
677
+ Exports
678
+ - `createCodexAppServerIsolation({ clientName = "jskit", minimumVersion = "0.151.0", disabledFeatures = DISABLED_FEATURES, limits: { userAgentMaxLength = 512, mcpServerMaxCount = 128, mcpServerNameMaxLength = 256, configResponseMaxBytes = 256 * 1024, hookMaxCount = 256, hookErrorMaxCount = 256, hookFieldMaxLength = 2048, hookFingerprintMaxLength = 256 * 1024, hookResponseMaxBytes = 512 * 1024 } = {}, createError = codexAppServerIsolationPolicyError } = {})`
679
+ - `codexToolFreeConfiguration(options)`
680
+ - `readCodexToolFreeConfiguration(provider = null, workdir = "", assertCompatibility = codexConversationIsolation.assertCompatibility)`
681
+ Local functions
682
+ - `deepFreezeCodexAppServerHelperConfig(value)`
683
+ - `codexAppServerIsolationPolicyError(message = "", details = {})`
684
+
685
+ ### `src/server/conversation/codexLiveItems.js`
686
+ Exports
687
+ - `codexAppServerLiveProgressCandidate(notification = {})`
688
+ - `createCodexAppServerLiveItems({ createStore, publish, turnStateFromAgentRun, debugLog, readCodexAppServerAgentRunForSession, messageMetadata, persistCommentary, liveProgressMaxLength })`
689
+ Local functions
690
+ - `codexAppServerLiveProgressKey(sessionId = "", threadId = "", notification = {})`
691
+ - `codexAppServerLiveProgressFingerprintKey(sessionId = "", threadId = "", turnId = "", text = "")`
692
+ - `codexAppServerTerminalItemMirrorKey(sessionId = "", threadId = "", notification = {}, role = "")`
693
+
556
694
  ### `src/server/conversation/codexMessageCommands.js`
557
695
  Exports
558
- - `createCodexMessageCommands({ output, journal, recovery, threadStatus, selection, observer, delivery, promptDeliveries: codexAppServerPromptDeliveries, createRuntime, debugError, debugLog, errorPrefix, messageIdPrefix, messageMetadata, namespace, providerSessions, recoverAdmission, steerFailedCode, turnAlreadyRunningError, turnState })`
696
+ - `createCodexMessageCommands({ output, journal, recovery, threadStatus, selection, observer, delivery, promptDispatch, promptDeliveries, createRuntime, debugError, debugLog, errorPrefix, messageIdPrefix, messageMetadata, namespace, providerSessions, recoverAdmission, steerFailedCode, turnAlreadyRunningError, turnState })`
559
697
 
560
698
  ### `src/server/conversation/codexMessageDelivery.js`
561
699
  Exports
562
700
  - `createCodexAppServerMessageDelivery({ namespace, publish, messageMetadata, createStore, turnStateFromAgentRun, deliveryStateMetadataKey, output, journal, recovery })`
701
+ - `type CodexAppServerMessageDelivery`
563
702
 
564
703
  ### `src/server/conversation/codexModelCatalog.js`
565
704
  Exports
566
705
  - `codexAppServerModelCatalogError(message = "", errorPrefix = "")`
567
- - `codexAppServerProviderConnectionGeneration(provider = null)`
706
+ - `codexAppServerProviderConnectionGeneration(provider)`
568
707
  - `createCodexAppServerModelCatalogCache({ cacheMs = 30_000, errorPrefix = "" } = {})`
708
+ - `createCodexRuntimeModelCatalog({ withLifecycle, assertOpen, acquireRuntime, stopOwnedRuntime, forgetOwnedRuntime })`
569
709
  Local functions
570
710
  - `codexAppServerModelCatalogSnapshot(value = null, errorPrefix = "")`
571
711
 
@@ -578,22 +718,28 @@ Local functions
578
718
  ### `src/server/conversation/codexNotificationObserver.js`
579
719
  Exports
580
720
  - `createCodexNotificationObserver({ journal, recovery, threadStatus, output, delivery, notificationQueue, namespace, createRuntime, createStore, publish, captureContext, debugLog, onNotificationSignal, turnStateFromAgentRun })`
721
+ - `type CodexNotificationObserver`
581
722
 
582
723
  ### `src/server/conversation/codexNotificationQueue.js`
583
724
  Exports
584
- - `createCodexAppServerNotificationQueue({ namespace = normalizeCodexRunText, isClosing = () => false, runInContext = (_context, operation) => operation(), reportError = () => {} } = {})`
725
+ - `createCodexAppServerNotificationQueue({ namespace = normalizeText, isClosing = () => false, runInContext = (_context, operation) => operation(), reportError = ignoreNotificationTaskError } = {})`
726
+ - `type CodexAppServerNotificationQueue`
727
+ Local functions
728
+ - `ignoreNotificationTaskError()`
585
729
 
586
730
  ### `src/server/conversation/codexObservationControl.js`
587
731
  Exports
588
732
  - `createCodexObservationControl({ conversations, output, journal, namespace, createRuntime, publish, runInContext, turnState, errorPrefix })`
733
+ - `type CodexObservationControl`
589
734
 
590
735
  ### `src/server/conversation/codexOutput.js`
591
736
  Exports
592
- - `createCodexAppServerOutput({ namespace, createRuntime, createStore, publish, acquireProvider, turnState, turnStateFromAgentRun, debugLog, debugError, liveProgressMaxLength, persistCommentary = true, storeReadError, messageMetadata, snapshotRecoveryItemLimit })`
737
+ - `createCodexAppServerOutput({ namespace, createRuntime, createStore, publish, acquireProvider, turnState, turnStateFromAgentRun, debugLog, debugError, liveProgressMaxLength, persistCommentary = true, messageMetadata, snapshotRecoveryItemLimit })`
738
+ - `type CodexAppServerOutput`
593
739
 
594
740
  ### `src/server/conversation/codexProcess.js`
595
741
  Exports
596
- - `runCodexAppServerProcess({ runtimeDir, command, args = [], runtimeToken: token, bundled = false, additionalModels = [] })`
742
+ - `runCodexAppServerProcess({ runtimeDir, command, args = [], runtimeToken: token, bundled = false, additionalModels = [], env })`
597
743
  - `ensureWritablePrivateDirectory(dirPath = "")`
598
744
  - `codexAppServerMetadataPath(runtimeDir = "")`
599
745
  - `normalizeCodexAppServerMetadata(metadata = {})`
@@ -602,111 +748,162 @@ Exports
602
748
  - `fileExists(filePath = "")`
603
749
  - `tailTextFile(filePath = "", maxBytes = 4096)`
604
750
  - `acquireCodexRuntimeLock(runtimeDir = "", { busyCode = "codex_runtime_busy", timeoutMs = CODEX_APP_SERVER_LOCK_TIMEOUT_MS } = {})`
751
+ - `stableHash(value)`
605
752
  - `codexAppServerExecutionMode(options = {})`
606
753
  - `codexAppServerIsHelper(options = {})`
607
754
  - `assertExistingDirectory(dirPath = "", label = "directory")`
608
755
  - `codexAppServerHelperHomeDir(runtimeDir = "")`
609
756
  - `codexAppServerHelperWorkspaceDir(runtimeDir = "")`
757
+ - `codexAppServerHelperCommandBaseEnv(env, codexHome = "")`
758
+ - `codexAppServerLogPath(runtimeDir = "")`
759
+ - `codexAppServerSocketPath(runtimeDir = "")`
760
+ - `codexAppServerSocketPathBytes(socketPath = "")`
761
+ - `codexAppServerSocketPathTooLong(socketPath = "")`
762
+ - `codexAppServerUnixEndpoint(socketPath = "")`
763
+ - `codexAppServerProjectTrustOverride(workdir = "")`
610
764
  - `codexAppServerProcessCwd({ executionRoot = "", runtimeDir = "", workdir = "" } = {})`
765
+ - `codexAppServerRuntimeDirIsManaged(runtimeDir = "")`
611
766
  - `removeCodexAppServerRuntimeDir(runtimeDir = "")`
767
+ - `removeCodexAppServerMetadataTemps(runtimeDir = "")`
768
+ - `codexAppServerRuntimeCleanupCanSkip(error)`
612
769
  - `codexAppServerRuntimeIdentity(runtime = {})`
613
770
  - `normalizeCodexAppServerTerminalEnv(terminalEnv = {})`
614
- - `codexAppServerCommandBaseEnv({ env = process.env, terminalEnv = {} } = {})`
771
+ - `codexAppServerCommandBaseEnv({ env, terminalEnv = {} } = {})`
615
772
  - `codexAppServerCredentialHome(toolHomeSource = "", baseEnv = {})`
616
773
  - `codexAppServerTerminalEnvHash(terminalEnv = {})`
774
+ - `codexHistoryAdapterUrlIsValid(baseUrl, token)`
775
+ - `codexAppServerLivenessTimeoutMs(options = {})`
776
+ - `codexAppServerProcessCommandHash({ codexArgs = [], codexCommand = "", executionMode = "", processCwd = "", runtimeDir = "" } = {})`
617
777
  - `codexCommandHookDefinition(command)`
618
- - `createCodexAppServerRuntime({ execution, credentials, configuration = {} })`
778
+ - `CODEX_APP_SERVER_EXECUTION_MODES`
619
779
  - `CODEX_APP_SERVER_METADATA_SCHEMA_VERSION`
780
+ - `CODEX_APP_SERVER_PROVIDER_ID`
620
781
  - `CODEX_APP_SERVER_TRANSPORT`
621
782
  - `CODEX_APP_SERVER_RUNTIME_DIR_NAME`
783
+ - `CODEX_APP_SERVER_READY_TIMEOUT_MS`
784
+ - `CODEX_APP_SERVER_LIVENESS_TIMEOUT_MS`
622
785
  - `CODEX_APP_SERVER_DESKTOP_BUS_ENV_NAMES`
786
+ - `CODEX_APP_SERVER_UNIX_SOCKET_PATH_MAX_BYTES`
787
+ - `CODEX_APP_SERVER_ENDPOINT_STATUS`
788
+ - `CODEX_APP_SERVER_RUNTIME_STATUS`
623
789
  - `CODEX_APP_SERVER_PROCESS_STATE`
790
+ - `CODEX_APP_SERVER_PROCESS_IDENTITY_STATUS`
624
791
  - `CODEX_APP_SERVER_DEFAULT_ENVIRONMENT`
625
792
  Local functions
626
793
  - `ensurePrivateDirectory(dirPath = "")`
627
794
  - `codexAppServerLockDir(runtimeDir = "")`
628
795
  - `readLockOwner(lockDir = "")`
629
796
  - `lockIsStale(lockDir = "")`
630
- - `stableHash(value)`
631
- - `codexAppServerHelperCommandBaseEnv(env = process.env, codexHome = "")`
632
- - `codexAppServerLogPath(runtimeDir = "")`
633
- - `codexAppServerSocketPath(runtimeDir = "")`
634
- - `codexAppServerSocketPathBytes(socketPath = "")`
635
- - `codexAppServerSocketPathTooLong(socketPath = "")`
636
- - `codexAppServerUnixEndpoint(socketPath = "")`
637
- - `codexAppServerProjectTrustOverride(workdir = "")`
638
- - `codexAppServerRuntimeDirIsManaged(runtimeDir = "")`
639
- - `removeCodexAppServerMetadataTemps(runtimeDir = "")`
640
- - `codexAppServerRuntimeCleanupCanSkip(error)`
641
- - `codexHistoryAdapterUrlIsValid(baseUrl, token)`
642
- - `codexAppServerLivenessTimeoutMs(options = {})`
643
- - `codexAppServerProcessCommandHash({ codexArgs = [], codexCommand = "", executionMode = "", processCwd = "", runtimeDir = "" } = {})`
644
- - `tomlInlineValue(value)`
645
797
 
646
798
  ### `src/server/conversation/codexProcessLeader.js`
647
799
  Exports
648
800
  - None
649
801
 
802
+ ### `src/server/conversation/codexPromptDispatch.js`
803
+ Exports
804
+ - `createCodexPromptDispatch({ output, journal, recovery, threadStatus, delivery, debugError, debugLog, steerFailedCode, turnState })`
805
+ - `type CodexPromptDispatch`
806
+
650
807
  ### `src/server/conversation/codexProvider.js`
651
808
  Exports
652
- - `CODEX_APP_SERVER_THREAD_INVENTORY_MAX_COUNT`
653
- - `CODEX_APP_SERVER_THREAD_INVENTORY_ID_MAX_LENGTH`
654
809
  - `CodexAppServerAgentProvider`
655
- - `CODEX_APP_SERVER_INVALID_REQUEST_CODE`
656
- - `ensureCodexAppServerThread({ observeThread, provider, settings, projectHooks = false, identity, applicationTools, providerReady, workdir = "", onStage = () => {} } = {})`
657
- - `codexApplicationToolConfiguration(tools)`
658
- - `assertCodexApplicationToolSchemaIdentity(threadId, savedIdentity, toolSchemaIdentity)`
659
- - `sendCodexAppServerPrompt({ attachments = [], clientUserMessageId = "", outputSchema = null, provider, prompt = "", threadId = "", readOnly = false } = {}, authorized = {})`
660
- - `codexAppServerDeliveredTurn(delivery = {})`
661
- - `codexAppServerEndpointForTarget(endpoint = "")`
662
- - `codexAppServerRequestIsInvalid(error = null, method = "")`
663
- - `codexAppServerThreadIsMissing(error = null, threadId = "")`
664
- - `codexAppServerThreadHasReadableHistory(provider = null, threadId = "")`
665
- - `deleteCodexAppServerThread({ provider, threadId } = {})`
666
- - `deleteCodexAppServerHelperThread({ provider, threadId, turnId = "" } = {})`
667
- - `inspectCodexAppServerMessageAdmission({ provider, threadId, messageId } = {})`
668
- - `codexCliResumeCommand({ codexCommand = "", endpoint = "", threadId = "" } = {})`
669
- - `codexLocalImageInput(attachments = [])`
670
- - `codexTextInput(text = "")`
671
- - `codexTurnInput(input = [])`
672
- - `shellQuote(value = "")`
673
- - `exportCodexNativeHistory`
674
- - `retireCodexConversationHistory(provider, binding, { toolHomeSource, beforeDelete, signal, errorPrefix = "" } = {})`
675
- - `readCodexNativeGoal(databasePath, { threadId, signal } = {})`
676
- - `createCodexAppServerProviderOwner`
677
- - `codexAppServerOwnedRuntimeKey`
678
- - `codexAppServerRuntimeStopWasVerified`
810
+ Local functions
811
+ - `normalizeCodexAppServerInfo(initializeResult = null)`
812
+ - `readNoInstructions()`
813
+ - `keepThreadEnvironment(environment)`
814
+ - `prepareNoThreadResume()`
815
+ - `logNothing()`
816
+ - `reportNoObservationLoss()`
817
+ - `closeNothing()`
818
+ - `runDirectly(operation)`
819
+
820
+ ### `src/server/conversation/codexProviderAuth.js`
821
+ Exports
822
+ - `codexAppServerHelperRequestError(error = null, reason = "", errorPrefix = "")`
823
+ - `createCodexProviderAuth({ provider })`
824
+ - `codexAppServerHelperAuthError`
825
+ - `type CodexAppServerAgentProvider`
679
826
  Local functions
680
827
  - `codexAppServerHelperLoginParams(auth = {}, errorPrefix = "")`
681
828
  - `codexAppServerHelperLoginResponseType(auth = {})`
682
829
  - `codexAppServerHelperAccountType(auth = {})`
683
- - `codexAppServerHelperRequestError(error = null, reason = "", errorPrefix = "")`
684
- - `normalizeCodexAppServerInfo(initializeResult = null)`
685
- - `codexAppServerThreadRequestParams(params = {}, threadEnv = {})`
686
- - `codexControlProbeCommand(keys, marker)`
830
+ - `prepareNativeAuth()`
831
+ - `codexPlanUsage(limits)`
832
+
833
+ ### `src/server/conversation/codexProviderInvalidation.js`
834
+ Exports
835
+ - `createCodexProviderInvalidation({ inScope, withLifecycle, forgetModelCatalog, exitUnverifiedCode, debugLog, debugError })`
836
+
837
+ ### `src/server/conversation/codexProviderInventories.js`
838
+ Exports
839
+ - `createCodexProviderInventories({ provider })`
840
+ - `CODEX_APP_SERVER_THREAD_INVENTORY_MAX_COUNT`
841
+ - `CODEX_APP_SERVER_THREAD_INVENTORY_ID_MAX_LENGTH`
842
+ - `type CodexAppServerAgentProvider`
843
+ Local functions
687
844
  - `codexAppServerThreadInventoryError(errorCode, label, detail)`
688
845
  - `codexAppServerThreadInventoryRefusal(entry, threadId, { cwd, verifyCwd })`
689
846
  - `listBoundedCodexAppServerThreadIds({ ancestorThreadId = "", archived = false, client, cwd = "", errorCode = "", findThreadId = "", label = "", requestLabel = "", runRequest, signal = null, sourceKinds = ["appServer"], state, verifyCwd = false } = {})`
690
- - `codexPlanUsage(limits = {})`
691
- - `normalizeAgentThread(value = {})`
692
- - `normalizeAgentTurn(value = {})`
693
847
 
694
848
  ### `src/server/conversation/codexProviderOwner.js`
695
849
  Exports
696
- - `codexAppServerOwnedRuntimeKey(providerKey = "", providerOptions = {})`
697
- - `releaseSupersededCodexRuntime(runtimeDir = "")`
698
- - `codexAppServerRuntimeStopWasVerified(result = {})`
699
- - `directoryExists(filePath = "")`
700
- - `createCodexAppServerProviderOwner({ runtimeRoot = "", assertOpen: assertApplicationOpen = () => {}, onRecoveryEvent = () => {}, debugLog = () => {}, debugError = error => error, providerFactory = null, prepareNativeHost = () => ({}), runtimeBusyCode = "codex_app_server_runtime_busy", exitUnverifiedCode = "codex_runtime_exit_unverified", requiredStopCode = "codex_runtime_exit_unverified", runtimeCloseError = "Codex app-server runtime close failed.", transientIdleMs = 60_000 } = {})`
850
+ - `createCodexAppServerProviderOwner({ runtimeRoot = "", assertOpen: assertApplicationOpen = ownerStaysOpen, onRecoveryEvent = ignoreRecoveryEvent, debugLog = ignoreDebugEvent, debugError = error => error, // readable-check: allow dependency-default - input validation: an application passes null to choose the built-in provider providerFactory = null, prepareNativeHost = emptyNativeHost, runtimeBusyCode = "codex_app_server_runtime_busy", exitUnverifiedCode = "codex_runtime_exit_unverified", requiredStopCode = "codex_runtime_exit_unverified", runtimeCloseError = "Codex app-server runtime close failed.", transientIdleMs = 60_000 } = {})`
851
+ - `type CodexAppServerProviderOwner`
852
+ - `type CodexProviderSessions`
701
853
  Local functions
702
- - `withRuntimeLifecycle(runtimeKey, operation)`
703
- - `runtimePeers(runtimeKey)`
704
- - `nativeRequest(client, method, params)`
705
- - `runningNativeThreads(peers)`
854
+ - `ownerStaysOpen()`
855
+ - `ignoreRecoveryEvent()`
856
+ - `ignoreDebugEvent()`
857
+ - `emptyNativeHost()`
858
+
859
+ ### `src/server/conversation/codexProviderRelease.js`
860
+ Exports
861
+ - `createCodexProviderRelease({ records, providers, providerOwners, ownedRuntimes, withLifecycle, runtimeIsShared, forgetOwnedRuntime, closeProvider, requiredStopCode, exitUnverifiedCode, runtimeCloseError, debugLog, debugError })`
706
862
 
707
863
  ### `src/server/conversation/codexProviderSelection.js`
708
864
  Exports
709
865
  - `createCodexProviderSelection({ providerSessions, turnState, helperLifecycle, helperOwnershipError, modelCatalogCacheMs, errorPrefix })`
866
+ - `type CodexProviderSelection`
867
+
868
+ ### `src/server/conversation/codexProviderThreads.js`
869
+ Exports
870
+ - `codexAppServerRequestIsInvalid(error = null, method = "")`
871
+ - `codexAppServerThreadIsMissing(error = null, threadId = "")`
872
+ - `retireCodexConversationHistory(provider, binding, { toolHomeSource, beforeDelete, signal, errorPrefix = "" } = {})`
873
+ - `readCodexNativeGoal(databasePath, { threadId, signal } = {})`
874
+ - `codexAppServerThreadHasReadableHistory(provider, threadId = "")`
875
+ - `inspectCodexAppServerMessageAdmission({ provider, threadId, messageId } = {})`
876
+ - `deleteCodexAppServerThread({ provider, threadId } = {})`
877
+ - `deleteCodexAppServerHelperThread({ provider, threadId, turnId = "" } = {})`
878
+ - `codexApplicationToolConfiguration(tools)`
879
+ - `assertCodexApplicationToolSchemaIdentity(threadId, savedIdentity, toolSchemaIdentity)`
880
+ - `ensureCodexAppServerThread({ observeThread, provider, settings, projectHooks = false, identity, applicationTools, providerReady, workdir = "", onStage = () => {} } = {})`
881
+ - `codexAppServerThreadRequestParams(params = {}, threadEnv = {})`
882
+ - `keepCodexThreadParams(params)`
883
+ - `resumeCodexThreadAsIs()`
884
+ - `createCodexProviderThreads({ provider })`
885
+ - `CODEX_APP_SERVER_INVALID_REQUEST_CODE`
886
+ - `type CodexAppServerAgentProvider`
887
+ Local functions
888
+ - `codexHelperDeletionSupport(provider)`
889
+ - `assertCodexThreadPreparation({ observeThread, identity, applicationTools })`
890
+ - `normalizeAgentThread(value = {})`
891
+
892
+ ### `src/server/conversation/codexProviderTurns.js`
893
+ Exports
894
+ - `codexAppServerEndpointForTarget(endpoint = "")`
895
+ - `codexTextInput(text = "")`
896
+ - `codexLocalImageInput(attachments = [])`
897
+ - `sendCodexAppServerPrompt({ attachments = [], clientUserMessageId = "", outputSchema = null, provider, prompt = "", threadId = "", readOnly = false } = {}, authorized = {})`
898
+ - `codexTurnInput(input = [])`
899
+ - `shellQuote(value = "")`
900
+ - `codexControlProbeCommand(keys, marker)`
901
+ - `codexCliResumeCommand({ codexCommand = "", endpoint = "", threadId = "" } = {})`
902
+ - `codexAppServerDeliveredTurn(delivery)`
903
+ - `createCodexProviderTurns({ provider })`
904
+ - `type CodexAppServerAgentProvider`
905
+ Local functions
906
+ - `normalizeAgentTurn(value = {})`
710
907
 
711
908
  ### `src/server/conversation/codexReasoning.js`
712
909
  Exports
@@ -732,14 +929,59 @@ Local functions
732
929
  ### `src/server/conversation/codexResultSettlement.js`
733
930
  Exports
734
931
  - `createCodexResultSettlement({ journal, output, createRuntime, publish, debugLog, debugError, turnState })`
932
+ - `type CodexResultSettlement`
735
933
 
736
934
  ### `src/server/conversation/codexRunJournal.js`
737
935
  Exports
738
- - `createCodexRunJournal({ namespace, normalizeRunState, turnState, createRuntime, publish, checkpoint, debugLog, output, messageIdPrefix, sessionIdRequiredError, turnClaimsUnsupportedError, turnAlreadyRunningError, errorPrefix, idlePublishPayload, finalizingGraceMs, admissionTaskFinished, orphanedPromptMessage })`
936
+ - `createCodexRunJournal({ namespace, normalizeRunState, turnState, createRuntime, publish, checkpoint, debugLog, output, messageIdPrefix, sessionIdRequiredError, turnAlreadyRunningError, errorPrefix, idlePublishPayload, finalizingGraceMs, admissionTaskFinished, orphanedPromptMessage })`
937
+ - `type CodexRunJournal`
938
+ Local functions
939
+ - `terminalCodexAppServerAgentRunState(status = "")`
940
+ - `codexAppServerDateValueMs(value = "")`
941
+
942
+ ### `src/server/conversation/codexRuntime.js`
943
+ Exports
944
+ - `createCodexAppServerRuntime({ execution, credentials, configuration = {} })`
945
+ - `type CodexRuntimeExecution`
946
+ - `type CodexProcessIdentity`
947
+ - `type CodexRuntimeCredentials`
948
+ - `type CodexRuntimeSettings`
949
+ Local functions
950
+ - `codexAppServerLivenessIdentity(pid, alive)`
951
+
952
+ ### `src/server/conversation/codexRuntimeInventory.js`
953
+ Exports
954
+ - `codexAppServerOwnedRuntimeKey(providerKey = "", providerOptions)`
955
+ - `withRuntimeLifecycle(runtimeKey, operation)`
956
+ - `releaseSupersededCodexRuntime(runtimeDir = "")`
957
+ - `codexAppServerRuntimeStopWasVerified(result)`
958
+ - `directoryExists(filePath = "")`
959
+ - `runtimePeers(runtimeKey)`
960
+ - `nativeRequest(client, method, params)`
961
+ - `runningNativeThreads(peers)`
962
+ - `codexAppServerProviders`
963
+ - `codexAppServerOwnedRuntimes`
964
+ - `codexAppServerStaleRuntimes`
739
965
 
740
966
  ### `src/server/conversation/codexRuntimeLifecycle.js`
741
967
  Exports
742
- - `createCodexRuntimeLifecycle({ pendingWork, observer, checkManagedConnection, providerSessions, helperLifecycle, captureContext, runInContext, continueGoalAfterAccountChange = null, debugLog, debugError, closingError = null })`
968
+ - `createCodexRuntimeLifecycle({ pendingWork, observer, checkManagedConnection, providerSessions, helperLifecycle, captureContext, runInContext, continueGoalAfterAccountChange, debugLog, debugError, closingError = null })`
969
+ - `type CodexHelperThreadLifecycle`
970
+ - `type CodexNotificationObserver`
971
+ - `type CodexRuntimeLifecycle`
972
+ - `type CodexRunOwner`
973
+ - `type CodexDebugLog`
974
+
975
+ ### `src/server/conversation/codexRuntimeStart.js`
976
+ Exports
977
+ - `createCodexAppServerProcessStart({ execution, credentials, codexProcessIdentity, runtimeStop, codexAppServerEndpointStatus, waitForCodexAppServer, settings })`
978
+ Local functions
979
+ - `tomlInlineValue(value)`
980
+
981
+ ### `src/server/conversation/codexRuntimeStop.js`
982
+ Exports
983
+ - `createCodexAppServerRuntimeStop({ execution, codexProcessIdentity, errorPrefix })`
984
+ - `type CodexRuntimeStop`
743
985
 
744
986
  ### `src/server/conversation/codexSessionCleanup.js`
745
987
  Exports
@@ -752,14 +994,36 @@ Exports
752
994
  ### `src/server/conversation/codexThreadReadiness.js`
753
995
  Exports
754
996
  - `createCodexThreadReadiness({ providerSessions, selection, observer, threadStatus, recovery, turnState, debugLog, debugError })`
997
+ - `type CodexThreadReadiness`
998
+
999
+ ### `src/server/conversation/codexThreadSnapshot.js`
1000
+ Exports
1001
+ - `codexAppServerThreadRawValue(thread = {})`
1002
+ - `codexAppServerThreadTurnId(thread = {})`
1003
+ - `codexAppServerThreadError(thread = {})`
1004
+ - `codexAppServerProviderThreadTurns(thread = null)`
1005
+ - `codexAppServerProviderTurnId(turn = {})`
1006
+ - `codexAppServerProviderTurnStatus(turn = {})`
1007
+ - `codexAppServerProviderTurnItems(turn = {})`
1008
+ - `codexAppServerProviderTurnClientIds(turn = {})`
1009
+ - `codexAppServerProviderTurnForOperation(thread = null, { clientMessageId = "", turnId = "" } = {})`
1010
+ - `inspectCodexAppServerRenewalThread(thread = null, { clientMessageId = "", turnId: expectedTurnId = "", requireFresh = false } = {})`
1011
+ - `codexAppServerProviderTurnText(thread = null, turnId = "")`
1012
+ - `codexAppServerProviderTurnError(turn = {})`
1013
+ - `codexAppServerProviderThreadAssistantSegments(value = {}, turnId = "")`
1014
+ Local functions
1015
+ - `codexAppServerProviderThread(value)`
1016
+ - `codexAppServerProviderThreadTurn(value = {}, turnId = "")`
1017
+ - `codexAppServerProviderTurnAssistantSegments(turn = {})`
755
1018
 
756
1019
  ### `src/server/conversation/codexThreadStatus.js`
757
1020
  Exports
758
1021
  - `createCodexThreadStatus({ journal, settlement, recovery, output, createRuntime, turnState, turnOutcomes, debugLog, debugError })`
1022
+ - `type CodexThreadStatus`
759
1023
 
760
1024
  ### `src/server/conversation/codexTurn.js`
761
1025
  Exports
762
- - `createCodexAppServerRunOwner({ namespace = normalizeCodexRunText, normalizeRunState = normalizeCodexAppServerRunState, debugLog = () => {}, debugError = error => normalizeCodexRunText(error?.message || error), createRuntime, createStore, publish = async () => null, acquireProvider = async () => null, providerSessions = null, serverClosingError = null, helperThreads = null, modelCatalogCacheMs = 30_000, conversationPreparation = null, storeReadError = "The session store does not support agent-run reads.", sessionIdRequiredError = "A session ID is required.", turnClaimsUnsupportedError = "The session runtime does not support Codex turn claims.", turnAlreadyRunningError = "Codex is already working on this session.", messageIdPrefix = "codex:", idlePublishPayload = null, checkpoint = async () => null, messageMetadata = {}, persistCommentary = true, deliveryStateMetadataKey = "assistant_delivery", hasRuntime = () => true, recoverAdmission = null, admissionTaskFinished = () => false, outcomeNotice = async () => null, resultDeliveryFailureMessage = ({ error = "" } = {}) => { const detail = normalizeCodexRunText(error); if (!detail) return "Codex app-server finished this turn, but the assistant result text was not received."; const punctuation = [".", "!", "?"].some(character => detail.endsWith(character)) ? "" : "."; return "Codex completed, but its response could not be processed: " + detail + punctuation; }, orphanedPromptMessage = "The application restarted before Codex confirmed the message. Your message is safe; retry it.", onNotificationSignal = async () => null, captureContext = () => null, runInContext = (_context, operation) => operation(), // Resumes a goal an account change paused, once the previous account's // runtime has stopped: `(sessionId, { threadId })`. Without it the goal stays // paused for the person to resume. continueGoalAfterAccountChange = null, notificationQueue = null, activeReconcileMs = 2000, finalizingGraceMs = 10000, finalizingGraceAfterHistoryRead = false, failureDetailGraceMs = 0, steerFailedCode = "codex_turn_steer_failed", interruptFailedCode = "codex_turn_interrupt_failed", errorPrefix = "" } = {})`
1026
+ - `createCodexAppServerRunOwner({ namespace = normalizeText, normalizeRunState = normalizeCodexAppServerRunState, debugLog = ignoreDebugLog, debugError = error => normalizeText(error?.message || error), createRuntime, createStore, publish = answerNothing, acquireProvider = answerNothing, providerSessions, serverClosingError, helperThreads = null, modelCatalogCacheMs = 30_000, conversationPreparation, sessionIdRequiredError = "A session ID is required.", turnAlreadyRunningError = "Codex is already working on this session.", messageIdPrefix = "codex:", idlePublishPayload, checkpoint = answerNothing, messageMetadata = {}, persistCommentary = true, deliveryStateMetadataKey = "assistant_delivery", hasRuntime = () => true, recoverAdmission, admissionTaskFinished = () => false, outcomeNotice = answerNothing, resultDeliveryFailureMessage = codexResultDeliveryFailureMessage, orphanedPromptMessage = "The application restarted before Codex confirmed the message. Your message is safe; retry it.", onNotificationSignal = answerNothing, captureContext = captureNoContext, runInContext = runInNoContext, continueGoalAfterAccountChange, notificationQueue = null, activeReconcileMs = 2000, finalizingGraceMs = 10000, finalizingGraceAfterHistoryRead = false, failureDetailGraceMs = 0, steerFailedCode = "codex_turn_steer_failed", interruptFailedCode = "codex_turn_interrupt_failed", errorPrefix = "" })`
763
1027
  - `CODEX_APP_SERVER_RUN_STATE`
764
1028
  - `normalizeCodexAppServerRunState`
765
1029
  - `codexAppServerRunStateIsActive`
@@ -799,14 +1063,49 @@ Exports
799
1063
  - `createCodexAppServerNotificationQueue`
800
1064
  - `sendPreparedCodexAppServerHelperTurn`
801
1065
  - `codexAppServerThreadIsMissing`
1066
+ - `type CodexSessionNamespace`
1067
+ - `type CodexDebugLog`
1068
+ - `type CodexDebugError`
1069
+ - `type CodexCreateRuntime`
1070
+ - `type CodexCreateStore`
1071
+ - `type CodexPublish`
1072
+ - `type CodexTurnStateReader`
1073
+ - `type CodexAgentRunTurnStateReader`
1074
+ - `type CodexCaptureContext`
1075
+ - `type CodexRunInContext`
1076
+ - `type CodexTurnOutcomes`
1077
+ - `type CodexAdmissionRecovery`
1078
+ - `type CodexCheckpoint`
1079
+ - `type CodexMessageMetadataHooks`
1080
+ - `type CodexProviderSessions`
1081
+ Local functions
1082
+ - `ignoreDebugLog()`
1083
+ - `answerNothing()`
1084
+ - `captureNoContext()`
1085
+ - `addNoMessageMetadata()`
1086
+ - `keepDeliveredMessageMetadata(_store, _sessionId, metadata)`
1087
+ - `codexResultDeliveryFailureMessage({ error = "" } = {})`
1088
+ - `runInNoContext(_context, operation)`
1089
+
1090
+ ### `src/server/conversation/codexTurnActivity.js`
1091
+ Exports
1092
+ - `createCodexTurnActivity({ journal, output, settlement, createRuntime, createStore, debugLog, turnState, turnStateFromAgentRun, scheduleActiveRecovery })`
1093
+ - `type CodexTurnActivity`
802
1094
 
803
1095
  ### `src/server/conversation/codexTurnControl.js`
804
1096
  Exports
805
1097
  - `createCodexTurnControl({ journal, settlement, recovery, threadStatus, debugError, debugLog, errorPrefix, interruptFailedCode, turnOutcomes, turnState })`
1098
+ - `type CodexTurnControl`
1099
+
1100
+ ### `src/server/conversation/codexTurnEndings.js`
1101
+ Exports
1102
+ - `createCodexTurnEndings({ journal, output, settlement, createRuntime, debugLog, debugError, turnState, failureDetailGraceMs, turnOutcomes, outcomeNotice, resultDeliveryFailureMessage, captureContext, runInContext, notificationQueue, finalizingGraceAfterHistoryRead, scheduleActiveRecovery })`
1103
+ - `type CodexTurnEndings`
806
1104
 
807
1105
  ### `src/server/conversation/codexTurnRecovery.js`
808
1106
  Exports
809
1107
  - `createCodexTurnRecovery({ journal, output, settlement, promptDeliveries, namespace, createRuntime, createStore, acquireProvider, turnState, turnStateFromAgentRun, debugLog, debugError, captureContext, runInContext, activeReconcileMs, finalizingGraceAfterHistoryRead, failureDetailGraceMs, notificationQueue, hasRuntime, recoverAdmission, turnOutcomes, outcomeNotice, resultDeliveryFailureMessage })`
1108
+ - `type CodexTurnRecovery`
810
1109
 
811
1110
  ### `src/server/conversation/codexTurnState.js`
812
1111
  Exports
@@ -814,8 +1113,8 @@ Exports
814
1113
  - `codexAppServerRunStateIsActive(state)`
815
1114
  - `codexAppServerRunStateIsTerminal(state)`
816
1115
  - `codexAppServerAgentRun(session = {})`
817
- - `codexAppServerPendingUserMessageClientIds(run = {})`
818
- - `codexAppServerPendingUserMessageOwnership(run = {}, clientId = "")`
1116
+ - `codexAppServerPendingUserMessageClientIds(run)`
1117
+ - `codexAppServerPendingUserMessageOwnership(run, clientId = "")`
819
1118
  - `codexAppServerProcessedResultEvent(session = {}, threadId = "", turnId = "")`
820
1119
  - `codexAppServerTurnStateFromAgentRun(run = {}, normalizeRunState = normalizeCodexAppServerRunState)`
821
1120
  - `codexAppServerTurnState(session = {}, normalizeRunState = normalizeCodexAppServerRunState)`
@@ -826,6 +1125,7 @@ Exports
826
1125
  - `codexAppServerTurnCanReceiveProviderActivity(turn = {}, threadId = "", turnId = "")`
827
1126
  - `codexAppServerTurnCanAdoptSuccessor(turn = {}, threadId = "", turnId = "")`
828
1127
  - `codexAppServerTurnKey(threadId = "", turnId = "")`
1128
+ - `codexAppServerConversationMessageId(threadId = "", turnId = "", role = "", text = "")`
829
1129
  - `codexAppServerNativeOuterTurnId(threadId = "", turnId = "")`
830
1130
  - `codexAppServerAgentRunPatch({ error = "", inputSource = "", outerTurnId = "", phase, runState = CODEX_APP_SERVER_RUN_STATE.COMPLETED, session = {}, status = "", threadId = "", turnId = "", updatedAt = "" } = {}, normalizeRunState = normalizeCodexAppServerRunState)`
831
1131
  - `codexAppServerRunIdentityForPatch(session = {}, { threadId = "", turnId = "" } = {}, normalizeRunState = normalizeCodexAppServerRunState)`
@@ -840,14 +1140,13 @@ Exports
840
1140
  - `codexAppServerMessageText(input = {})`
841
1141
  - `codexAppServerMessageDisplayText(input = {}, fallback = "")`
842
1142
  - `CODEX_APP_SERVER_RUN_STATE`
843
- - `codexAppServerRunInputSource(run = {})`
1143
+ - `codexAppServerRunInputSource(run)`
844
1144
  - `codexAppServerThreadStatus(thread = {})`
845
1145
  - `codexAppServerReadThreadStatus(provider = null, threadId = "", { observeLatestTurn = false } = {})`
846
1146
  - `codexAppServerTurnStatusIsActive(status = "")`
847
1147
  - `codexAppServerTurnStatusIsComplete(status = "")`
848
1148
  - `codexAppServerTurnStatusIsSuccessfulComplete(status = "")`
849
1149
  - `codexAppServerTurnStatusIsProviderFailure(status = "")`
850
- - `normalizeCodexRunText(value)`
851
1150
  - `codexAppServerErrorMessage(value, fallback = "Codex could not be prepared.")`
852
1151
  - `codexAppServerMessageDeferred({ threadId = "", turnId = "" } = {}, steerFailedCode = "codex_turn_steer_failed")`
853
1152
  - `codexPromptInputFromRequest(input = {})`
@@ -869,6 +1168,12 @@ Exports
869
1168
  Local functions
870
1169
  - `shellQuote(value)`
871
1170
 
1171
+ ### `src/server/conversation/completedResponses.js`
1172
+ Exports
1173
+ - `createCompletedResponses({ storage, transcript, events, catalog, isClosed, completedEnvelope, maximumToolCalls })`
1174
+ - `type ConversationEntry`
1175
+ - `type CompletedResponses`
1176
+
872
1177
  ### `src/server/conversation/configuration.js`
873
1178
  Exports
874
1179
  - `normalizeConversationConfiguration(configuration, { engine, defaultIntegrationId } = {})`
@@ -879,26 +1184,131 @@ Exports
879
1184
  Exports
880
1185
  - `conversationMessageIdentity(turnId, message)`
881
1186
  - `conversationMessageVersion(message, { includeData = false } = {})`
882
- - `createConversationChangeover({ state, transcript, agent, identity, presentation = {}, log = () => {}, captureContext = false, applicationMessages = false, maximumInitialMessages = 30, maximumInitialMessageCharacters = Infinity, maximumHistoryBytes = Infinity })`
1187
+ - `createConversationChangeover({ state, transcript, agent, identity, presentation = {}, log = logNothing, captureContext = false, applicationMessages = false, maximumInitialMessages = 30, maximumInitialMessageCharacters = Infinity, maximumHistoryBytes = Infinity })`
883
1188
  - `conversationHistoryVersions(history)`
884
1189
  - `conversationRequestText({ text, origin, data })`
885
1190
  - `conversationContinuity({ history, briefing = "", maximumCharacters = 128_000 })`
886
1191
  - `conversationNativeMessages(history)`
887
1192
  Local functions
1193
+ - `logNothing()`
888
1194
  - `writtenMessages(history, native = false)`
889
1195
 
1196
+ ### `src/server/conversation/conversationDelivery.js`
1197
+ Exports
1198
+ - `createConversationDelivery({ storage, transcript, events, entries, reads, limits, persistCommentary, completedEnvelope, maximumFinalReply, maximumCompletedOutput })`
1199
+ - `type ConversationEntry`
1200
+ - `type ConversationRequest`
1201
+ - `type ConversationDelivery`
1202
+
1203
+ ### `src/server/conversation/conversationEntries.js`
1204
+ Exports
1205
+ - `createConversationEntries({ storage, transcript, streams, providers, events, catalog, defaultEngine, defaultIntegrationId, persistCommentary, completedEnvelope })`
1206
+ - `type ConversationDriver`
1207
+ - `type ActiveTurn`
1208
+ - `type ConversationRequest`
1209
+ - `type HostConversation`
1210
+ - `type BoundApplicationTools`
1211
+ - `type ConversationEntry`
1212
+ - `type ConversationState`
1213
+ - `type ConversationEntries`
1214
+
1215
+ ### `src/server/conversation/conversationEvents.js`
1216
+ Exports
1217
+ - `createConversationEvents({ authorize, isClosed, storage, streams, completedEnvelope })`
1218
+ - `serial(entry, callback)`
1219
+ - `type ConversationEntry`
1220
+ - `type ConversationEvents`
1221
+
1222
+ ### `src/server/conversation/conversationGoals.js`
1223
+ Exports
1224
+ - `createConversationGoals({ events, entries, reads, sending, stopping, catalog })`
1225
+ - `type ConversationEntry`
1226
+ - `type ConversationGoals`
1227
+
1228
+ ### `src/server/conversation/conversationHandles.js`
1229
+ Exports
1230
+ - `createConversationHandles({ entries, storage, defaultHost, events, reads, sending, goals, delivery, stopping, replacement, completedResponses, completedEnvelope, persistCommentary, defaultIntegrationId })`
1231
+ - `type ConversationEntry`
1232
+ - `type HostConversation`
1233
+ - `type ConversationHandles`
1234
+ Local functions
1235
+ - `assertHostConversation(conversation, { id, configuration, representation })`
1236
+
1237
+ ### `src/server/conversation/conversationReads.js`
1238
+ Exports
1239
+ - `createConversationReads({ storage, transcript, streams, attachmentsOffered, completedEnvelope })`
1240
+ - `pendingSuccessor(state)`
1241
+ - `retainedSegments(state)`
1242
+ - `submittedMessage(turn)`
1243
+ - `type ConversationEntry`
1244
+ - `type ConversationState`
1245
+ - `type ConversationReads`
1246
+ Local functions
1247
+ - `offersPages(entry)`
1248
+
1249
+ ### `src/server/conversation/conversationRefusals.js`
1250
+ Exports
1251
+ - `deliveryFailure(delivered)`
1252
+ - `failure(message, code, statusCode = 409, { messageCode, messageParams } = {})`
1253
+ - `stateErrorFields(error)`
1254
+
1255
+ ### `src/server/conversation/conversationReplacement.js`
1256
+ Exports
1257
+ - `createConversationReplacement({ storage, providers, events, entries, reads, delivery, completedEnvelope, defaultIntegrationId, maximumContinuity })`
1258
+ - `type ConversationEntry`
1259
+ - `type ConversationReplacement`
1260
+
1261
+ ### `src/server/conversation/conversationSending.js`
1262
+ Exports
1263
+ - `createConversationSending({ storage, events, entries, reads, turns, onDeliveryTiming, deliveryHostStages, completedEnvelope, maximumInput })`
1264
+ - `type ConversationEntry`
1265
+ - `type ConversationRequest`
1266
+ - `type ConversationSending`
1267
+ Local functions
1268
+ - `sameRequest(left, right)`
1269
+
1270
+ ### `src/server/conversation/conversationStopping.js`
1271
+ Exports
1272
+ - `createConversationStopping({ storage, entries, events, delivery })`
1273
+ - `type ConversationEntry`
1274
+ - `type ConversationStopping`
1275
+
1276
+ ### `src/server/conversation/conversationTurnDelivery.js`
1277
+ Exports
1278
+ - `createConversationTurnDelivery({ storage, streams, events, reads, delivery, attachments, persistCommentary, maximumContinuity, maximumAttachmentBytes })`
1279
+ - `type ConversationEntry`
1280
+ - `type ActiveTurn`
1281
+ - `type ConversationRequest`
1282
+ - `type ConversationTurnDelivery`
1283
+
1284
+ ### `src/server/conversation/conversationTurns.js`
1285
+ Exports
1286
+ - `createConversationTurns({ storage, streams, events, entries, reads, delivery, turnDelivery, catalog, apiHistory, isClosed, completedEnvelope, maximumToolCalls, maximumFinalReply, maximumCompletedOutput, timeoutMs })`
1287
+ - `saveTools(entry, transaction, request, calls)`
1288
+ - `type ConversationEntry`
1289
+ - `type ConversationRequest`
1290
+ - `type ActiveTurn`
1291
+ - `type ConversationTurns`
1292
+ Local functions
1293
+ - `recordNoNativeCheckpoint()`
1294
+
890
1295
  ### `src/server/conversation/deliveryTiming.js`
891
1296
  Exports
892
1297
  - `normalizeConversationDeliveryHostStages(hostStages = [])`
893
- - `createConversationDeliveryTiming({ engine, conversationId, messageId, report, hostStages = [], clock = () => performance.now() })`
1298
+ - `createConversationDeliveryTiming({ engine, conversationId, messageId, report, hostStages = NO_HOST_STAGES, clock = monotonicNow })`
1299
+ - `recordNoDeliveryTiming()`
1300
+ Local functions
1301
+ - `monotonicNow()`
894
1302
 
895
1303
  ### `src/server/conversation/fileStorage.js`
896
1304
  Exports
897
- - `createFileConversationStorage({ directory } = {})`
1305
+ - `createFileConversationStorage({ directory })`
898
1306
 
899
1307
  ### `src/server/conversation/hookBridge.js`
900
1308
  Exports
901
- - `createConversationHookBridge({ resolveConversation, readInstructions } = {})`
1309
+ - `createConversationHookBridge({ resolveConversation, readInstructions = refuseHookInstructions })`
1310
+ Local functions
1311
+ - `refuseHookInstructions()`
902
1312
 
903
1313
  ### `src/server/conversation/index.js`
904
1314
  Exports
@@ -933,14 +1343,26 @@ Exports
933
1343
  ### `src/server/conversation/localExecution.js`
934
1344
  Exports
935
1345
  - `createLocalConversationExecution()`
936
- - `createConversationProcessIdentity({ runtimeTokenEnvironmentName = "JSKIT_EXECUTION_RUNTIME_TOKEN", commandHashEnvironmentName = "JSKIT_EXECUTION_COMMAND_HASH", label = "Native", unavailableCode = "native_process_identity_unavailable", platform = process.platform, ps = runPs } = {})`
937
- Local functions
938
- - `runPs(args)`
1346
+ - `type ConversationExecution`
939
1347
 
940
1348
  ### `src/server/conversation/memoryStorage.js`
941
1349
  Exports
942
1350
  - `createMemoryConversationStorage()`
943
1351
 
1352
+ ### `src/server/conversation/nativeCommandCallbacks.js`
1353
+ Exports
1354
+ - `ignoreReceipt()`
1355
+ - `ignorePromptSending()`
1356
+ - `ignorePromptRejection()`
1357
+
1358
+ ### `src/server/conversation/nativeConversationLifecycle.js`
1359
+ Exports
1360
+ - `createNativeConversationLifecycle({ authorize, defaultHost, hostPrepares, providers, entries, events, stopping, assertRuntimeOpen })`
1361
+ - `type NativeConversationLifecycle`
1362
+ Local functions
1363
+ - `isThenable(value)`
1364
+ - `implementsOperation(driver, name)`
1365
+
944
1366
  ### `src/server/conversation/nativeHistoryExport.js`
945
1367
  Exports
946
1368
  - `readStoppedNativeDatabase(databasePath, read, { signal } = {})`
@@ -956,24 +1378,23 @@ Exports
956
1378
  Exports
957
1379
  - `normalizeNullableText(value)`
958
1380
  - `jsonHash(value)`
1381
+ - `isPlainRecord(value)`
959
1382
 
960
1383
  ### `src/server/conversation/openCodeClient.js`
961
1384
  Exports
962
- - `readOpenCodeConversationDatabase({ databasePath, conversationId, onMessage, signal } = {})`
963
- - `retireOpenCodeConversationHistory(storageClient, controlClient, binding, options = {})`
964
1385
  - `openCodeAssistantMessageText(message = {})`
965
1386
  - `OPENCODE_RESPONSE_LIMIT_BYTES`
966
1387
  - `createOpenCodeServerClient({ allowAttachmentDirectories = false, baseUrl = "", defaultDirectory = "", directory = "", fetchImpl = globalThis.fetch, instances = { addressed: new Map(), sequence: 0 }, password = "", username = "opencode" } = {})`
1388
+ - `normalizedMessageRows(value = null)`
967
1389
  - `readBoundedResponse(response, limitBytes = OPENCODE_RESPONSE_LIMIT_BYTES)`
968
1390
  Local functions
969
- - `record(value)`
1391
+ - `reportNoReadiness()`
970
1392
  - `openCodeServerError(message, { body = null, code = "assistant_opencode_server_request_failed", method = "", path = "", status = 0 } = {})`
971
1393
  - `parsedJson(value = "")`
972
1394
  - `responseErrorMessage(payload = null, fallback = "OpenCode rejected the request.")`
973
1395
  - `queryString(values = {})`
974
1396
  - `sessionPath(sessionId = "", suffix = "")`
975
1397
  - `stableSessionPath(sessionId = "", suffix = "")`
976
- - `normalizedMessageRows(value = null)`
977
1398
  - `providerCapabilityMedia(value = null)`
978
1399
  - `sanitizedOpenCodeModel(model = {}, fallbackId = "")`
979
1400
  - `invalidOpenCodeCatalogError()`
@@ -981,9 +1402,22 @@ Local functions
981
1402
  - `stablePromptBody(input = {})`
982
1403
  - `eventSessionId(value = null)`
983
1404
  - `decodeOpenCodeEventData(value = "")`
1405
+
1406
+ ### `src/server/conversation/openCodeNativeHistory.js`
1407
+ Exports
1408
+ - `readOpenCodeConversationDatabase({ databasePath, conversationId, onMessage, signal } = {})`
1409
+ - `retireOpenCodeConversationHistory(storageClient, controlClient, binding, options = {})`
1410
+ Local functions
984
1411
  - `inspectOpenCodeConversationFamily(storageClient, controlClient, binding, { signal } = {})`
985
1412
  - `exportOpenCodeNativeHistory(storageClient, controlClient, id, onRecord, { signal: inputSignal } = {})`
986
1413
 
1414
+ ### `src/server/conversation/openCodeNativeSession.js`
1415
+ Exports
1416
+ - `openCodeServerForDirectory(server, workdir)`
1417
+ - `openCodeModel(selection = {}, executionProfile = null)`
1418
+ - `sameOpenCodeSelection(left, right)`
1419
+ - `ensureOpenCodeSession(target, { selection, model, workdir = target.workdir, identity, signal, invalidIdentity = () => new Error("OpenCode did not return a native conversation ID.") })`
1420
+
987
1421
  ### `src/server/conversation/openCodePlugin.js`
988
1422
  Exports
989
1423
  - `conversationInstructions({ client, registryPath = process.env.JSKIT_OPENCODE_ENV_REGISTRY, resolveHostInstructions } = {})`
@@ -993,8 +1427,8 @@ Exports
993
1427
  - `openCodeProcessEnvironment(baseEnv = {}, { cacheRoot = "", dbPath = "", inlineConfig = "", outputTokenMax = 0, packageInstalls = true, password = "" } = {})`
994
1428
  - `openCodeConversationAgent({ nativeTools = false, tools = false } = {})`
995
1429
  - `openCodeConversationAgents({ sessionEnvironmentRegistry = "" } = {})`
996
- - `createOpenCodeConversationServer({ command = "opencode", execution = createLocalConversationExecution(), env = process.env, workdir, stateDirectory, databasePath, sessionEnvironmentRegistry, connection, maxOutputTokens, onStarted, onFailure, executionLimits, signal } = {})`
997
- - `createOpenCodeServerProcess({ command = "opencode", execution = createLocalConversationExecution(), env = process.env, workdir, privateRoot, directory = "", connections = [], port = 0, fetchImpl = globalThis.fetch, allowAttachmentDirectories = false, expectedVersion = OPENCODE_EXPECTED_VERSION, readinessTimeoutMs = OPENCODE_READY_TIMEOUT_MS, onStarted, onFailure, executionLimits, signal } = {})`
1430
+ - `createOpenCodeConversationServer({ command = "opencode", execution = createLocalConversationExecution(), env, workdir, stateDirectory, databasePath, sessionEnvironmentRegistry, connection, maxOutputTokens, onStarted = ignoreServerStart, onFailure = ignoreServerFailure, executionLimits, signal })`
1431
+ - `createOpenCodeServerProcess({ command = "opencode", execution = createLocalConversationExecution(), env, workdir, privateRoot, directory = "", connections = [], port = 0, fetchImpl = globalThis.fetch, allowAttachmentDirectories = false, expectedVersion = OPENCODE_EXPECTED_VERSION, readinessTimeoutMs = OPENCODE_READY_TIMEOUT_MS, onStarted = ignoreServerStart, onFailure = ignoreServerFailure, executionLimits, signal })`
998
1432
  - `readOpenCodeZenModelIds({ fetchImpl = globalThis.fetch, timeoutMs = OPENCODE_ZEN_CATALOG_TIMEOUT_MS } = {})`
999
1433
  - `readOpenCodeCatalog({ createServerProcess, privateRoot = "", workdir = "" } = {})`
1000
1434
  - `verifyOpenCodeApiKey({ apiKey = "", agentId = openCodeConversationAgent(), prepareCommand, modelId = "", modelProviderId = "", privateRoot = "", workdir = "" } = {})`
@@ -1004,17 +1438,20 @@ Exports
1004
1438
  - `OPENCODE_STOP_TIMEOUT_MS`
1005
1439
  - `openCodeApplicationToolSchemas`
1006
1440
  - `createOpenCodeSharedRuntime`
1007
- - `openCodeServerForDirectory`
1008
1441
  - `readOpenCodeEnvironments`
1009
1442
  - `openCodeEnvironmentForDirectory`
1010
1443
  - `openCodeEnvironmentForSession`
1011
1444
  - `assertOpenCodeModelProvider`
1012
1445
  - `limitOpenCodeModelOutput`
1446
+ - `openCodeServerForDirectory`
1013
1447
  - `ensureOpenCodeSession`
1014
1448
  - `openCodeModel`
1015
1449
  - `sameOpenCodeSelection`
1016
1450
  - `createOpenCodeConversationPlugin`
1451
+ - `type ConversationExecution`
1017
1452
  Local functions
1453
+ - `ignoreServerStart()`
1454
+ - `ignoreServerFailure()`
1018
1455
  - `availableLoopbackPort()`
1019
1456
  - `openCodeExitReason(logs)`
1020
1457
  - `waitForOpenCodeReady({ client, expectedVersion = OPENCODE_EXPECTED_VERSION, processHandle, timeoutMs = OPENCODE_READY_TIMEOUT_MS, signal } = {})`
@@ -1022,6 +1459,13 @@ Local functions
1022
1459
  - `agentPermission(ask, nativeTools, tools)`
1023
1460
  - `openCodeZenCatalogError(cause = null)`
1024
1461
 
1462
+ ### `src/server/conversation/openCodeProcessOwner.js`
1463
+ Exports
1464
+ - `createOpenCodeProcessOwner({ processes, processStarts, monitors, turns, temporaryConversations, onStop, storageIdleMs })`
1465
+ - `type OpenCodeProcessOwner`
1466
+ Local functions
1467
+ - `ignoreTargetRemoval()`
1468
+
1025
1469
  ### `src/server/conversation/openCodeRuntime.js`
1026
1470
  Exports
1027
1471
  - `assertOpenCodeModelProvider(selected, input = {})`
@@ -1029,27 +1473,32 @@ Exports
1029
1473
  - `readOpenCodeEnvironments(registryPath = "")`
1030
1474
  - `openCodeEnvironmentForDirectory(environments, cwd = "")`
1031
1475
  - `openCodeEnvironmentForSession(environments, sessionId = "", client = null)`
1032
- - `openCodeServerForDirectory(server = {}, workdir = "")`
1033
- - `openCodeModel(selection = {}, executionProfile = null)`
1034
- - `sameOpenCodeSelection(left = {}, right = {})`
1035
- - `ensureOpenCodeSession(target, { selection, model, workdir = target.workdir, identity = {}, signal, invalidIdentity = () => new Error("OpenCode did not return a native conversation ID.") })`
1036
- - `createOpenCodeSharedRuntime({ onStop = () => {}, scope, storageIdleMs = 60_000 } = {})`
1476
+ - `createOpenCodeSharedRuntime({ onStop = ignoreRuntimeStop, scope, storageIdleMs = 60_000 })`
1037
1477
  Local functions
1038
- - `openCodeTurnSnapshot(turn = null, threadId = "")`
1039
- - `openCodeCredentialFailure(value = "")`
1040
- - `openCodeProviderApiFailure(error = {})`
1478
+ - `ignoreRuntimeStop()`
1041
1479
  - `pathContains(root = "", candidate = "")`
1042
1480
 
1481
+ ### `src/server/conversation/openCodeSessionTurns.js`
1482
+ Exports
1483
+ - `createOpenCodeSessionTurns({ processes, monitors, turns, processOwner, turnMonitor })`
1484
+
1485
+ ### `src/server/conversation/openCodeTemporaryConversations.js`
1486
+ Exports
1487
+ - `createOpenCodeTemporaryConversations({ processes, temporaryConversations, processOwner })`
1488
+ Local functions
1489
+ - `scopedTarget(target, prepared)`
1490
+
1043
1491
  ### `src/server/conversation/openCodeTools.js`
1044
1492
  Exports
1045
1493
  - `createOpenCodeToolBridge({ execute, maxArgumentBytes, schemas })`
1046
1494
 
1047
1495
  ### `src/server/conversation/openCodeTurn.js`
1048
1496
  Exports
1497
+ - `recoverWithoutProjection()`
1049
1498
  - `openCodeDetachedPrompt(input = {})`
1050
1499
  - `openCodeStructuredOutput(value = "")`
1051
1500
  - `observeOpenCodeEvents(client, conversationId, { abortController, signal = abortController.signal, ...options } = {})`
1052
- - `openCodeMessageError(message = {})`
1501
+ - `openCodeMessageError(message)`
1053
1502
  - `inspectOpenCodeMessageAdmission(client, conversationId, inputMessageId, { signal = AbortSignal.timeout(OPENCODE_INTERRUPT_TIMEOUT_MS), wait = false, readFailure = () => null } = {})`
1054
1503
  - `steerOpenCodeTurn(client, conversationId, turn, input, { signal } = {})`
1055
1504
  - `dispatchOpenCodeTurn(turn, input, options = {})`
@@ -1060,36 +1509,63 @@ Exports
1060
1509
  - `openCodeRowsForInput(value = null, inputMessageId = "")`
1061
1510
  - `openCodeLastAssistantResult(value = null, { readError = openCodeMessageError } = {})`
1062
1511
  - `waitForOpenCodeMessages(client, conversationId = "", inputMessageId = "", { onMessages = null, readFailure = () => null, readError = openCodeMessageError, signal } = {})`
1063
- - `waitForOpenCodeFinalResponse(client, conversationId, turn, { agent, model, recoveryMessageId, beforeRecovery = null, ...options } = {})`
1064
- - `observeOpenCodeTurnCompletion(runtime, target, conversationId, turn, { events, signal, timeoutMs, finalResponse, projectResult = value => value, afterClose, ...waitOptions } = {})`
1512
+ - `waitForOpenCodeFinalResponse(client, conversationId, turn, { agent, model, recoveryMessageId, beforeRecovery = recoverWithoutProjection, ...options } = {})`
1513
+ - `observeOpenCodeTurnCompletion(processOwner, target, conversationId, turn, { events, signal, timeoutMs, finalResponse, projectResult = value => value, afterClose = ignoreObservationClose, ...waitOptions } = {})`
1065
1514
  - `runOpenCodeConversationTurn(client, conversationId, input = {}, { expectedThreadId = "", forbiddenThreadId = "", requireFreshHistory = false, completeResult, close } = {})`
1066
1515
  - `OPENCODE_INTERRUPT_TIMEOUT_MS`
1067
1516
  - `OPENCODE_REFUSED_TOOL_ERROR`
1068
1517
  Local functions
1069
- - `record(value)`
1518
+ - `ignoreObservationClose()`
1070
1519
  - `openCodeEventSummary(event = {})`
1071
- - `consumeOpenCodeEvents(client, conversationId, { eventStartedAt = null, onEvent = null, onError = null, onReady = null, readError = openCodeMessageError, signal } = {})`
1520
+ - `consumeOpenCodeEvents(client, conversationId, { eventStartedAt = null, onEvent = null, onError = null, onReady, readError = openCodeMessageError, signal } = {})`
1072
1521
  - `hasMessage(id)`
1073
1522
  - `openCodeMessageResultForInput(value = null, inputMessageId = "", { readError = openCodeMessageError } = {})`
1074
1523
  - `latestOpenCodeMessageResult(value, readError)`
1075
1524
 
1525
+ ### `src/server/conversation/openCodeTurnMonitor.js`
1526
+ Exports
1527
+ - `openCodeTurnSnapshot(turn = null, threadId = "")`
1528
+ - `openCodeProviderApiFailure(error)`
1529
+ - `observePreparedEvents(target, turn, abortController, signal, projection)`
1530
+ - `writeConversationProjection(sessionId, messages = null, { inputMessageId = "", streaming = false, captureFinalAssistantResult = false } = {}, projection)`
1531
+ - `createOpenCodeTurnMonitor({ processes, monitors, turns, processOwner })`
1532
+ - `type OpenCodeTurnMonitor`
1533
+ Local functions
1534
+ - `noOutputId()`
1535
+ - `openCodeCredentialFailure(value = "")`
1536
+
1537
+ ### `src/server/conversation/processIdentity.js`
1538
+ Exports
1539
+ - `createConversationProcessIdentity({ runtimeTokenEnvironmentName = "JSKIT_EXECUTION_RUNTIME_TOKEN", commandHashEnvironmentName = "JSKIT_EXECUTION_COMMAND_HASH", label = "Native", unavailableCode = "native_process_identity_unavailable", platform = process.platform, ps = runPs } = {})`
1540
+ Local functions
1541
+ - `runPs(args)`
1542
+
1076
1543
  ### `src/server/conversation/provider.js`
1077
1544
  Exports
1078
- - `createConversationProviderFactory({ connections, apiClientFactory, fetch, limits, actions, toolCatalog } = {})`
1545
+ - `createConversationProviderFactory({ connections, apiClientFactory, fetch, limits, actions, toolCatalog })`
1546
+ - `type ConversationProviderFactory`
1547
+ - `type ConversationDriver`
1079
1548
 
1080
1549
  ### `src/server/conversation/providers/api.js`
1081
1550
  Exports
1082
1551
  - `createApiConversationDriver({ connections, apiClientFactory, fetch, limits = {} })`
1083
1552
  Local functions
1084
- - `toolResultContent(result)`
1553
+ - `toolOutput(result)`
1554
+ - `ignoreEvent()`
1555
+ - `stateNote()`
1556
+ - `content(message)`
1557
+ - `providerCallId(id)`
1558
+ - `turnMessages(turn)`
1085
1559
 
1086
1560
  ### `src/server/conversation/providers/claude.js`
1087
1561
  Exports
1088
- - `createClaudeConversationAdapter({ getProcess, isActive, startProcess, stopProcess } = {})`
1562
+ - `createClaudeConversationAdapter({ getProcess, isActive, startProcess, stopProcess })`
1563
+ - `type ClaudeCodeProcess`
1564
+ - `type ClaudeProcessControl`
1089
1565
 
1090
1566
  ### `src/server/conversation/providers/claudeDriver.js`
1091
1567
  Exports
1092
- - `createClaudeConversationDriver({ connections, host = {}, limits = {} } = {})`
1568
+ - `createClaudeConversationDriver({ connections, host = LOCAL_HOST, limits = {} })`
1093
1569
  Local functions
1094
1570
  - `nativeInput(input)`
1095
1571
  - `claudeGoalValue(goal, conversationId)`
@@ -1097,24 +1573,44 @@ Local functions
1097
1573
  ### `src/server/conversation/providers/codex.js`
1098
1574
  Exports
1099
1575
  - `createCodexConversationAdapter(host)`
1576
+ - `type CodexConversationAdapterHost`
1100
1577
 
1101
1578
  ### `src/server/conversation/providers/codexDriver.js`
1102
1579
  Exports
1103
- - `createCodexConversationDriver({ connections, host = {}, limits = {} } = {})`
1580
+ - `createCodexConversationDriver({ connections, host = {}, limits = {} })`
1581
+ - `type CodexDriverSession`
1582
+ - `type CodexConversationConnections`
1104
1583
  Local functions
1584
+ - `assertCodexApplicationEnvironment(host)`
1585
+
1586
+ ### `src/server/conversation/providers/codexDriverConnection.js`
1587
+ Exports
1588
+ - `createCodexDriverConnection({ session, supplied, sessionId, providerKey, providerOwner, owner, runtime, reportFailure, updateBinding, recordGoal, accountIdentity, connections, env, host, limits, nativeHost, nativeTools })`
1589
+
1590
+ ### `src/server/conversation/providers/codexDriverTurns.js`
1591
+ Exports
1592
+ - `createCodexDriverTurns({ session, supplied, conversation, sessionId, providerKey, providerOwner, owner, runtime, updateBinding, drainNotifications, connection })`
1105
1593
  - `goalValue(goal)`
1594
+ Local functions
1106
1595
  - `nativeInput(input)`
1596
+ - `rejectNoNativePrompt()`
1107
1597
 
1108
1598
  ### `src/server/conversation/providers/opencode.js`
1109
1599
  Exports
1110
- - `createOpenCodeConversationAdapter({ resolveInstructions } = {})`
1600
+ - `createOpenCodeConversationAdapter({ resolveInstructions })`
1601
+ - `type OpenCodeInstructionSource`
1111
1602
 
1112
1603
  ### `src/server/conversation/providers/opencodeDriver.js`
1113
1604
  Exports
1114
- - `createOpenCodeConversationDriver({ connections, host = {}, limits = {} } = {})`
1605
+ - `createOpenCodeConversationDriver({ connections, host = LOCAL_HOST, limits = {} })`
1606
+
1607
+ ### `src/server/conversation/providers/opencodeStandalone.js`
1608
+ Exports
1609
+ - `executeOpenCodeApplicationTool({ active, turn, target, sessionId, assertCurrent = acceptCurrentTurn }, input, signal)`
1610
+ - `openStandaloneOpenCodeConversation({ connections, host, limits, workdir, stateDirectory, execution, nativeTools, maximumOutput }, { binding, writeBinding, reportFailure })`
1115
1611
  Local functions
1612
+ - `acceptCurrentTurn()`
1116
1613
  - `nativeMessageId(id)`
1117
- - `executeOpenCodeApplicationTool({ active, turn, target, sessionId, assertCurrent }, input, signal)`
1118
1614
 
1119
1615
  ### `src/server/conversation/providers/scoped.js`
1120
1616
  Exports
@@ -1132,7 +1628,9 @@ Exports
1132
1628
  - `stopPersistentConversation({ sessionId, record, context, operations, records, projection })`
1133
1629
  - `deletePersistentConversation({ sessionId, record, context, operations, records, projection })`
1134
1630
  - `SCOPED_CONVERSATION_CAPABILITIES`
1631
+ - `type ScopedNativeCall`
1135
1632
  Local functions
1633
+ - `ignoreScopedEvent()`
1136
1634
  - `requireSuccess(result)`
1137
1635
  - `qualifyTranscript(turns, record, response, receipts)`
1138
1636
  - `publishTranscript({ sessionId, store, receipts, publish }, context, record, turns, response = {})`
@@ -1141,15 +1639,7 @@ Local functions
1141
1639
 
1142
1640
  ### `src/server/conversation/runtime.js`
1143
1641
  Exports
1144
- - `createConversationRuntime({ engine: defaultEngine = "api", defaultIntegrationId, storage, authorize, connections, apiClientFactory, apiHistory, actions, toolPolicy, toolCatalog, attachments, fetch, host: defaultHost, onDeliveryTiming, hostDeliveryStages, persistCommentary = true, completedEnvelope = false, limits = {} } = {})`
1145
- Local functions
1146
- - `failure(message, code, statusCode = 409, { messageCode, messageParams } = {})`
1147
- - `deliveryFailure(delivered)`
1148
- - `stateErrorFields(error)`
1149
- - `submittedMessage(turn)`
1150
- - `retainedSegments(state)`
1151
- - `pendingSuccessor(state)`
1152
- - `sameRequest(left, right)`
1642
+ - `createConversationRuntime({ engine: defaultEngine = "api", defaultIntegrationId, storage: suppliedStorage, authorize, connections, apiClientFactory, apiHistory, actions, toolPolicy, toolCatalog, attachments: suppliedAttachments, fetch, host: defaultHost, onDeliveryTiming, hostDeliveryStages, persistCommentary = true, completedEnvelope = false, limits = DEFAULT_LIMITS })`
1153
1643
 
1154
1644
  ### `src/server/conversation/runtimeStateUpgrade.js`
1155
1645
  Exports
@@ -1188,11 +1678,11 @@ Exports
1188
1678
 
1189
1679
  ### `src/server/conversation/structuredOutput.js`
1190
1680
  Exports
1191
- - `validateConversationOutputSchema(outputSchema, { maxOutputCharacters, createError = (message, details) => Object.assign(new TypeError(message), { details }) } = {})`
1681
+ - `validateConversationOutputSchema(outputSchema, { maxOutputCharacters, createError = outputSchemaTypeError })`
1192
1682
  - `conversationOutputSchema(schema)`
1193
1683
  - `parseConversationOutput(text, schema)`
1194
1684
  Local functions
1195
- - `isPlainRecord(value)`
1685
+ - `outputSchemaTypeError(message, details)`
1196
1686
 
1197
1687
  ### `src/server/conversation/systemPrompt.js`
1198
1688
  Exports
@@ -1200,13 +1690,18 @@ Exports
1200
1690
 
1201
1691
  ### `src/server/conversation/tools.js`
1202
1692
  Exports
1203
- - `createConversationTools({ catalog, toolSet: retainedToolSet, context, prepareContext, signal: turnSignal, previousCalls = [], authorize, save, emit, maximumCalls = 32, discoveryOnly = false, transient = false, propagateErrors = false })`
1693
+ - `createConversationTools({ catalog, toolSet: retainedToolSet, context, prepareContext, signal: turnSignal, previousCalls = [], authorize = authorizeTransientCall, save = saveTransientCalls, emit = announceTransientCall, maximumCalls = 32, discoveryOnly = false, transient = false, propagateErrors = false })`
1694
+ Local functions
1695
+ - `authorizeTransientCall()`
1696
+ - `saveTransientCalls()`
1697
+ - `announceTransientCall()`
1204
1698
 
1205
1699
  ### `src/server/conversation/transcript.js`
1206
1700
  Exports
1207
- - `createConversationTranscript({ storage, clock = () => new Date(), applicationTurns = false } = {})`
1701
+ - `createConversationTranscript({ storage, clock = currentDate, applicationTurns = false })`
1208
1702
  - `isCompletedEnvelopeTurn(turn)`
1209
1703
  Local functions
1704
+ - `currentDate()`
1210
1705
  - `hasMessages(turn)`
1211
1706
 
1212
1707
  ### `src/server/hosts/claudeHistory.js`
@@ -1242,17 +1737,17 @@ Exports
1242
1737
  - `codexInteractiveArguments`
1243
1738
  - `normalizeCodexThreadId`
1244
1739
  - `codexAppServerProjectHookTrustConfig`
1245
- - `codexAuthOutputRequiresReconnect`
1246
- - `codexProviderConfiguration`
1247
- - `codexProviderFileConfiguration`
1248
- - `codexProviderCatalogPath`
1249
- - `verifyCodexProviderKey`
1250
1740
  - `codexProviderModelCatalog`
1251
1741
  - `codexCatalogRows`
1252
1742
  - `codexCatalogReasoningEfforts`
1253
1743
  - `codexCatalogModels`
1254
1744
  - `codexConfiguredModelCatalog`
1255
1745
  - `readCodexModelContextWindow`
1746
+ - `codexProviderConfiguration`
1747
+ - `codexProviderFileConfiguration`
1748
+ - `codexProviderCatalogPath`
1749
+ - `verifyCodexProviderKey`
1750
+ - `codexAuthOutputRequiresReconnect`
1256
1751
  - `createCodexAccountReader`
1257
1752
  - `createCodexAppServerIsolation`
1258
1753
  - `readCodexToolFreeConfiguration`
@@ -1297,29 +1792,29 @@ Exports
1297
1792
  - `codexAppServerHelperHomeDir`
1298
1793
  - `codexAppServerHelperWorkspaceDir`
1299
1794
  - `codexAppServerIsHelper`
1300
- - `createCodexAppServerRuntime`
1301
1795
  - `normalizeCodexAppServerTerminalEnv`
1302
1796
  - `runCodexAppServerProcess`
1797
+ - `createCodexAppServerRuntime`
1303
1798
 
1304
1799
  ### `src/server/hosts/codexProvider.js`
1305
1800
  Exports
1306
1801
  - `CODEX_APP_SERVER_INVALID_REQUEST_CODE`
1307
- - `CodexAppServerAgentProvider`
1308
- - `codexAppServerEndpointForTarget`
1309
1802
  - `codexAppServerRequestIsInvalid`
1310
- - `codexAppServerRuntimeStopWasVerified`
1311
- - `codexCliResumeCommand`
1312
- - `codexTextInput`
1313
- - `codexTurnInput`
1314
- - `createCodexAppServerProviderOwner`
1315
1803
  - `deleteCodexAppServerHelperThread`
1316
1804
  - `deleteCodexAppServerThread`
1317
1805
  - `ensureCodexAppServerThread`
1318
1806
  - `inspectCodexAppServerMessageAdmission`
1319
1807
  - `retireCodexConversationHistory`
1320
1808
  - `readCodexNativeGoal`
1809
+ - `CodexAppServerAgentProvider`
1810
+ - `codexAppServerEndpointForTarget`
1811
+ - `codexCliResumeCommand`
1812
+ - `codexTextInput`
1813
+ - `codexTurnInput`
1321
1814
  - `sendCodexAppServerPrompt`
1322
1815
  - `shellQuote`
1816
+ - `codexAppServerRuntimeStopWasVerified`
1817
+ - `createCodexAppServerProviderOwner`
1323
1818
  - `assertCodexAuthPreflightReady`
1324
1819
  - `codexRenewalThreadError`
1325
1820
  - `defineCodexRenewalThreadIds`
@@ -1414,9 +1909,6 @@ Exports
1414
1909
  - `writeNdjson`
1415
1910
  - `resolveWorkspaceSlug`
1416
1911
  - `createServiceToolCatalog`
1417
- - `consumeCompletionStream`
1418
- - `sanitizeAssistantMessageText`
1419
- - `runAssistantToolLoop`
1420
1912
  - `runBoundedAssistantToolLoop`
1421
1913
  - `readAssistantResponseEnvelope`
1422
1914
  - `readPartialAssistantReply`
@@ -1433,26 +1925,6 @@ Exports
1433
1925
  Local functions
1434
1926
  - `sdkMessages(messages)`
1435
1927
 
1436
- ### `src/server/lib/assistantCompletion.js`
1437
- Exports
1438
- - `consumeCompletionStream(stream, onText = () => {}, { signal, limits, preserveWhitespace = false, requireCallIds = false, callIdPrefix = "" } = {})`
1439
- - `sanitizeAssistantMessageText(value, { preserveWhitespace = false } = {})`
1440
- Local functions
1441
- - `extractTextDelta(deltaContent)`
1442
- - `parseDsmlToolCallsFromText(value = "")`
1443
-
1444
- ### `src/server/lib/assistantToolLoop.js`
1445
- Exports
1446
- - `runAssistantToolLoop({ messages, input, toolSet, toToolSchema, complete, executeToolCalls, finish, preserveWhitespace = false })`
1447
- Local functions
1448
- - `requiresCurrentTime(value = "")`
1449
- - `resolvePreflightTools(toolDescriptors = [], input = "")`
1450
- - `buildRecoveryPrompt({ reason = "", toolFailures = [], toolSuccesses = [] } = {})`
1451
- - `buildRecoveryFallbackAnswer({ reason = "", toolFailures = [], toolSuccesses = [] } = {})`
1452
- - `toSafeToolResultText(value)`
1453
- - `buildToolOutcomeFallbackAnswer({ toolFailures = [], toolSuccesses = [] } = {})`
1454
- - `buildAssistantToolCallMessage(toolCalls = [])`
1455
-
1456
1928
  ### `src/server/lib/ndjson.js`
1457
1929
  Exports
1458
1930
  - `NDJSON_CONTENT_TYPE`
@@ -1517,14 +1989,6 @@ Exports
1517
1989
  - `createServiceToolCatalog(actions, { isActionAvailable, barredActionIds = [], skipActionPrefixes = [], maxDirectTools: rawMaxDirectTools = DEFAULT_MAX_DIRECT_TOOLS, discoveryPageSize: rawDiscoveryPageSize = DEFAULT_DISCOVERY_PAGE_SIZE, maxToolArgumentBytes: rawMaxToolArgumentBytes = DEFAULT_MAX_TOOL_ARGUMENT_BYTES, maxToolResultBytes: rawMaxToolResultBytes = DEFAULT_MAX_TOOL_RESULT_BYTES } = {})`
1518
1990
  - `DISCOVERY_TOOL_DESCRIPTORS`
1519
1991
  Local functions
1520
- - `normalizePreflightIntents(value)`
1521
- - `normalizeAssistantExtension(value)`
1522
- - `normalizeAssistantActionExtension(action = {})`
1523
- - `normalizeBarredEntry(value)`
1524
- - `normalizeBarredActionSet(value)`
1525
- - `isActionBarred(barredRules, actionId)`
1526
- - `sanitizeToolName(value)`
1527
- - `resolveUniqueToolName(baseName, used)`
1528
1992
  - `parseToolPayload(argumentsText)`
1529
1993
  - `normalizeNonNegativeInteger(value, fallback)`
1530
1994
  - `serializedByteLength(value)`
@@ -1538,13 +2002,45 @@ Local functions
1538
2002
  - `truncateDescription(value, maxLength = 240)`
1539
2003
  - `resolveValidationFailureMessage(error)`
1540
2004
  - `canInvokeMethod(permission, context)`
1541
- - `normalizePermissionSpec(permission)`
1542
2005
  - `stripWorkspaceSlugFromSchema(schema, context = {})`
2006
+ - `canUseToolOnSurface(entry = {}, context = {})`
2007
+ - `reportNoToolFailure()`
2008
+
2009
+ ### `src/server/lib/serviceToolEntries.js`
2010
+ Exports
2011
+ - `AUTOMATION_CHANNEL`
2012
+ - `normalizePermissionSpec(permission)`
2013
+ - `resolveActionToolEntries(actions, { barredActionIds = [], skipActionPrefixes = [] } = {})`
2014
+ Local functions
2015
+ - `normalizeAssistantExtension(value)`
2016
+ - `normalizeAssistantActionExtension(action = {})`
2017
+ - `normalizeBarredEntry(value)`
2018
+ - `normalizeBarredActionSet(value)`
2019
+ - `isActionBarred(barredRules, actionId)`
2020
+ - `sanitizeToolName(value)`
2021
+ - `resolveUniqueToolName(baseName, used)`
1543
2022
  - `hasAutomationChannel(action = {})`
1544
2023
  - `normalizeSurfaceList(value)`
1545
- - `canUseToolOnSurface(entry = {}, context = {})`
1546
2024
  - `resolveActionBackedToolEntries(actions)`
1547
- - `resolveActionToolEntries(actions, { barredActionIds = [], skipActionPrefixes = [] } = {})`
2025
+
2026
+ ### `src/server/types.js`
2027
+ Exports
2028
+ - `type ConversationRuntime`
2029
+ - `type ConversationTranscript`
2030
+ - `type ConversationStreams`
2031
+ - `type ReentrantConversationStorage`
2032
+ - `type ServiceToolCatalog`
2033
+ - `type AiClient`
2034
+ - `type AiConnectionClient`
2035
+ - `type ConversationStorage`
2036
+ - `type ConversationAuthorize`
2037
+ - `type ConversationHost`
2038
+ - `type ConversationAttachments`
2039
+ - `type ConversationConnections`
2040
+ - `type ConversationApiClientFactory`
2041
+ - `type ConversationApiHistory`
2042
+ - `type ConversationDeliveryTimingObserver`
2043
+ - `type ConversationLimits`
1548
2044
 
1549
2045
  ### `src/shared/assistantPaths.js`
1550
2046
  Exports
@@ -1564,7 +2060,6 @@ Local functions
1564
2060
  ### `src/shared/assistantResource.js`
1565
2061
  Exports
1566
2062
  - `MAX_INPUT_CHARS`
1567
- - `MAX_HISTORY_MESSAGES`
1568
2063
  - `MAX_MESSAGE_PAGE_SIZE`
1569
2064
  - `attachmentIdsField`
1570
2065
  - `assistantResource`
@@ -1591,9 +2086,6 @@ Exports
1591
2086
  Local functions
1592
2087
  - `inactiveAnswerChoiceSugar()`
1593
2088
  - `normalizedChoiceText(value = "")`
1594
- - `isSingleTextareaMessageField(fields = [], fieldName = "response")`
1595
- - `optionalValueMatches(actual = "", expected = "")`
1596
- - `answerChoiceHeadingLine(line = "")`
1597
2089
  - `answerChoiceLineText(line = "")`
1598
2090
  - `validAnswerChoice(choice = {})`
1599
2091
 
@@ -1625,6 +2117,12 @@ Local functions
1625
2117
  - `normalizeMarkdownLinkHref(value = "")`
1626
2118
  - `markdownLinkAt(text = "", start = 0)`
1627
2119
 
2120
+ ### `src/shared/conversation/messageInputSugar.js`
2121
+ Exports
2122
+ - `answerChoiceHeadingLine(line = "")`
2123
+ - `isSingleTextareaMessageField(fields = [], fieldName = "response")`
2124
+ - `optionalValueMatches(actual = "", expected = "")`
2125
+
1628
2126
  ### `src/shared/conversation/numberedQuestionSugar.js`
1629
2127
  Exports
1630
2128
  - `canRenderNumberedQuestionSugar({ fields = [], fieldName = "response", intentId = "", requiredIntentId = "", requiredStepStatus = "", stepStatus = "" } = {})`
@@ -1637,10 +2135,7 @@ Exports
1637
2135
  - `UI_QUESTION_FIELD_PREFIX`
1638
2136
  Local functions
1639
2137
  - `inactiveNumberedQuestionSugar()`
1640
- - `isSingleTextareaMessageField(fields = [], fieldName = "response")`
1641
- - `optionalValueMatches(actual = "", expected = "")`
1642
2138
  - `numberedQuestionMarkerMatch(line = "")`
1643
- - `trailingAnswerChoiceHeadingLine(line = "")`
1644
2139
  - `trailingAnswerChoiceLine(line = "")`
1645
2140
  - `numberedQuestionLabelLooksLikeQuestion(label = "")`
1646
2141
  - `validNumberedQuestions(questions = [])`
@@ -1718,7 +2213,6 @@ Exports
1718
2213
  - `ASSISTANT_STREAM_EVENT_TYPES`
1719
2214
  - `normalizeAssistantStreamEventType`
1720
2215
  - `MAX_INPUT_CHARS`
1721
- - `MAX_HISTORY_MESSAGES`
1722
2216
  - `MAX_MESSAGE_PAGE_SIZE`
1723
2217
  - `attachmentIdsField`
1724
2218
  - `assistantResource`