@jskit-ai/assistant-core 0.2.7 → 0.2.9

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 (214) hide show
  1. package/examples/conversation/package.json +5 -5
  2. package/package.json +18 -7
  3. package/src/client/browser.js +21 -0
  4. package/src/client/conversation/AssistantAttachmentQueue.vue +25 -108
  5. package/src/client/conversation/AssistantComposerActions.vue +1 -1
  6. package/src/client/conversation/AssistantConversationElement.vue +14 -52
  7. package/src/client/conversation/AssistantGoalControl.vue +13 -10
  8. package/src/client/conversation/AssistantPromptInput.vue +6 -91
  9. package/src/client/conversation/AssistantTranscript.css +505 -0
  10. package/src/client/conversation/AssistantTranscript.vue +24 -1197
  11. package/src/client/conversation/attachmentFiles.js +158 -0
  12. package/src/client/conversation/attachmentQueueItems.js +121 -0
  13. package/src/client/conversation/attachmentUploadRows.js +265 -0
  14. package/src/client/conversation/conversationDisplay.js +54 -0
  15. package/src/client/conversation/messageDelivery.js +13 -9
  16. package/src/client/conversation/retainedConversation.js +14 -3
  17. package/src/client/conversation/submitText.js +13 -2
  18. package/src/client/conversation/transcriptEntries.js +225 -0
  19. package/src/client/conversation/useAssistantAttachments.js +86 -388
  20. package/src/client/conversation/useAssistantQuestions.js +16 -3
  21. package/src/client/conversation/useAssistantSuggestions.js +16 -2
  22. package/src/client/conversation/useScrollToBottom.js +17 -19
  23. package/src/client/conversation/useTextareaAutoGrow.js +115 -0
  24. package/src/client/conversation/useTranscriptScrollFollow.js +525 -0
  25. package/src/client/lib/assistantApi.js +192 -161
  26. package/src/client/types.js +110 -0
  27. package/src/server/conversation/attachments.js +21 -6
  28. package/src/server/conversation/boundedToolLoop.js +1 -0
  29. package/src/server/conversation/claudeClient.js +71 -20
  30. package/src/server/conversation/claudeCommandRun.js +191 -0
  31. package/src/server/conversation/claudeHistory.js +7 -0
  32. package/src/server/conversation/claudeNativeTurn.js +708 -0
  33. package/src/server/conversation/claudeProcess.js +186 -112
  34. package/src/server/conversation/claudeProcessStart.js +214 -0
  35. package/src/server/conversation/claudePromptDelivery.js +183 -0
  36. package/src/server/conversation/claudeSessionCleanup.js +248 -0
  37. package/src/server/conversation/claudeTools.js +15 -3
  38. package/src/server/conversation/claudeTurn.js +212 -1388
  39. package/src/server/conversation/codexAccountReader.js +168 -0
  40. package/src/server/conversation/codexAuthPreflight.js +5 -4
  41. package/src/server/conversation/codexClient.js +18 -6
  42. package/src/server/conversation/codexConfiguration.js +8 -844
  43. package/src/server/conversation/codexConversationStops.js +377 -0
  44. package/src/server/conversation/codexConversationStore.js +119 -85
  45. package/src/server/conversation/codexConversationTurns.js +378 -0
  46. package/src/server/conversation/codexConversations.js +134 -866
  47. package/src/server/conversation/codexDetachedConversation.js +203 -0
  48. package/src/server/conversation/codexDetachedTurn.js +145 -104
  49. package/src/server/conversation/codexEvents.js +5 -200
  50. package/src/server/conversation/codexGoalCommands.js +14 -4
  51. package/src/server/conversation/codexHelperExecution.js +57 -57
  52. package/src/server/conversation/codexHelperThreadLedger.js +30 -288
  53. package/src/server/conversation/codexHelperThreadRecord.js +304 -0
  54. package/src/server/conversation/codexHelperThreadRecovery.js +54 -76
  55. package/src/server/conversation/codexHelperThreads.js +94 -93
  56. package/src/server/conversation/codexHistoryAdapter.js +13 -8
  57. package/src/server/conversation/codexIsolation.js +672 -0
  58. package/src/server/conversation/codexLiveItems.js +379 -0
  59. package/src/server/conversation/codexMessageCommands.js +68 -286
  60. package/src/server/conversation/codexMessageDelivery.js +46 -37
  61. package/src/server/conversation/codexModelCatalog.js +86 -7
  62. package/src/server/conversation/codexNotificationObserver.js +81 -88
  63. package/src/server/conversation/codexNotificationQueue.js +21 -10
  64. package/src/server/conversation/codexObservationControl.js +105 -89
  65. package/src/server/conversation/codexOutput.js +84 -419
  66. package/src/server/conversation/codexProcess.js +29 -1053
  67. package/src/server/conversation/codexProcessLeader.js +1 -0
  68. package/src/server/conversation/codexPromptDispatch.js +241 -0
  69. package/src/server/conversation/codexProvider.js +147 -1807
  70. package/src/server/conversation/codexProviderAuth.js +348 -0
  71. package/src/server/conversation/codexProviderInvalidation.js +371 -0
  72. package/src/server/conversation/codexProviderInventories.js +437 -0
  73. package/src/server/conversation/codexProviderOwner.js +149 -957
  74. package/src/server/conversation/codexProviderRelease.js +465 -0
  75. package/src/server/conversation/codexProviderSelection.js +26 -15
  76. package/src/server/conversation/codexProviderThreads.js +698 -0
  77. package/src/server/conversation/codexProviderTurns.js +453 -0
  78. package/src/server/conversation/codexReasoning.js +32 -23
  79. package/src/server/conversation/codexRenewalCommands.js +18 -6
  80. package/src/server/conversation/codexRenewalThreads.js +7 -22
  81. package/src/server/conversation/codexResultSettlement.js +70 -88
  82. package/src/server/conversation/codexRunJournal.js +91 -97
  83. package/src/server/conversation/codexRuntime.js +426 -0
  84. package/src/server/conversation/codexRuntimeInventory.js +113 -0
  85. package/src/server/conversation/codexRuntimeLifecycle.js +39 -13
  86. package/src/server/conversation/codexRuntimeStart.js +431 -0
  87. package/src/server/conversation/codexRuntimeStop.js +324 -0
  88. package/src/server/conversation/codexSessionCleanup.js +25 -10
  89. package/src/server/conversation/codexSessionReconciliation.js +21 -7
  90. package/src/server/conversation/codexThreadReadiness.js +49 -52
  91. package/src/server/conversation/codexThreadSnapshot.js +210 -0
  92. package/src/server/conversation/codexThreadStatus.js +48 -62
  93. package/src/server/conversation/codexTurn.js +171 -55
  94. package/src/server/conversation/codexTurnActivity.js +210 -0
  95. package/src/server/conversation/codexTurnControl.js +44 -48
  96. package/src/server/conversation/codexTurnEndings.js +610 -0
  97. package/src/server/conversation/codexTurnRecovery.js +97 -848
  98. package/src/server/conversation/codexTurnState.js +138 -111
  99. package/src/server/conversation/completedResponses.js +227 -0
  100. package/src/server/conversation/configuration.js +2 -2
  101. package/src/server/conversation/continuity.js +43 -6
  102. package/src/server/conversation/conversationDelivery.js +394 -0
  103. package/src/server/conversation/conversationEntries.js +365 -0
  104. package/src/server/conversation/conversationEvents.js +192 -0
  105. package/src/server/conversation/conversationGoals.js +187 -0
  106. package/src/server/conversation/conversationHandles.js +237 -0
  107. package/src/server/conversation/conversationReads.js +206 -0
  108. package/src/server/conversation/conversationRefusals.js +58 -0
  109. package/src/server/conversation/conversationReplacement.js +254 -0
  110. package/src/server/conversation/conversationSending.js +273 -0
  111. package/src/server/conversation/conversationStopping.js +121 -0
  112. package/src/server/conversation/conversationTurnDelivery.js +413 -0
  113. package/src/server/conversation/conversationTurns.js +511 -0
  114. package/src/server/conversation/deliveryTiming.js +25 -3
  115. package/src/server/conversation/fileStorage.js +11 -6
  116. package/src/server/conversation/hookBridge.js +14 -3
  117. package/src/server/conversation/index.js +1 -1
  118. package/src/server/conversation/localExecution.js +82 -625
  119. package/src/server/conversation/nativeCommandCallbacks.js +10 -0
  120. package/src/server/conversation/nativeConversationLifecycle.js +379 -0
  121. package/src/server/conversation/nativeHistoryExport.js +27 -18
  122. package/src/server/conversation/normalize.js +9 -0
  123. package/src/server/conversation/openCodeClient.js +295 -366
  124. package/src/server/conversation/openCodeNativeHistory.js +141 -0
  125. package/src/server/conversation/openCodeNativeSession.js +79 -0
  126. package/src/server/conversation/openCodeProcess.js +109 -53
  127. package/src/server/conversation/openCodeProcessOwner.js +565 -0
  128. package/src/server/conversation/openCodeRuntime.js +111 -1814
  129. package/src/server/conversation/openCodeSessionTurns.js +547 -0
  130. package/src/server/conversation/openCodeTemporaryConversations.js +394 -0
  131. package/src/server/conversation/openCodeTools.js +28 -14
  132. package/src/server/conversation/openCodeTurn.js +80 -74
  133. package/src/server/conversation/openCodeTurnMonitor.js +388 -0
  134. package/src/server/conversation/processIdentity.js +582 -0
  135. package/src/server/conversation/provider.js +21 -6
  136. package/src/server/conversation/providers/api.js +268 -107
  137. package/src/server/conversation/providers/claude.js +29 -6
  138. package/src/server/conversation/providers/claudeDriver.js +325 -250
  139. package/src/server/conversation/providers/codex.js +69 -33
  140. package/src/server/conversation/providers/codexDriver.js +503 -1081
  141. package/src/server/conversation/providers/codexDriverConnection.js +331 -0
  142. package/src/server/conversation/providers/codexDriverTurns.js +464 -0
  143. package/src/server/conversation/providers/opencode.js +30 -4
  144. package/src/server/conversation/providers/opencodeDriver.js +321 -659
  145. package/src/server/conversation/providers/opencodeStandalone.js +475 -0
  146. package/src/server/conversation/providers/scoped.js +64 -19
  147. package/src/server/conversation/runtime.js +171 -2863
  148. package/src/server/conversation/storage.js +91 -50
  149. package/src/server/conversation/streams.js +15 -2
  150. package/src/server/conversation/structuredOutput.js +7 -11
  151. package/src/server/conversation/systemPrompt.js +13 -1
  152. package/src/server/conversation/tools.js +47 -15
  153. package/src/server/conversation/transcript.js +49 -20
  154. package/src/server/hosts/claudeTurn.js +2 -4
  155. package/src/server/hosts/codexConfiguration.js +6 -8
  156. package/src/server/hosts/codexEvents.js +4 -2
  157. package/src/server/hosts/codexProcess.js +1 -1
  158. package/src/server/hosts/codexProvider.js +11 -9
  159. package/src/server/hosts/codexTurn.js +3 -3
  160. package/src/server/hosts/openCodeClient.js +4 -2
  161. package/src/server/index.js +0 -2
  162. package/src/server/lib/aiConnectionClient.js +35 -25
  163. package/src/server/lib/ndjson.js +1 -0
  164. package/src/server/lib/providers/anthropicClient.js +15 -6
  165. package/src/server/lib/providers/common.js +10 -6
  166. package/src/server/lib/providers/openAiCompatibleClient.js +40 -23
  167. package/src/server/lib/serviceToolCatalog.js +29 -283
  168. package/src/server/lib/serviceToolEntries.js +270 -0
  169. package/src/server/types.js +78 -0
  170. package/src/shared/assistantResource.js +0 -23
  171. package/src/shared/conversation/answerChoiceSugar.js +2 -14
  172. package/src/shared/conversation/messageInputSugar.js +18 -0
  173. package/src/shared/conversation/numberedQuestionSugar.js +6 -16
  174. package/src/shared/conversation/pagination.js +1 -1
  175. package/src/shared/conversation/questions.js +1 -0
  176. package/src/shared/conversation/streaming.js +1 -0
  177. package/src/shared/index.js +0 -1
  178. package/src/testing/conversationStorageContract.js +20 -0
  179. package/test/aiConnectionClient.test.js +42 -1
  180. package/test/apiConversationDriver.test.js +217 -38
  181. package/test/assistantBoundedToolLoop.test.js +1 -1
  182. package/test/claudeConversationSession.test.js +15 -11
  183. package/test/claudeInstructionResume.test.js +1 -1
  184. package/test/claudeProcess.test.js +9 -9
  185. package/test/claudeTurn.test.js +21 -8
  186. package/test/codexAccountChange.test.js +5 -3
  187. package/test/codexConversationSession.test.js +22 -21
  188. package/test/codexEvents.test.js +3 -1
  189. package/test/codexHelperDeletion.test.js +3 -7
  190. package/test/codexIsolation.test.js +6 -6
  191. package/test/codexModelCatalog.test.js +6 -7
  192. package/test/codexProcess.test.js +3 -3
  193. package/test/codexThreadSelection.test.js +4 -1
  194. package/test/codexTurn.test.js +29 -20
  195. package/test/conversationApiFacilities.test.js +11 -9
  196. package/test/conversationAttachments.test.js +3 -3
  197. package/test/conversationConfiguration.test.js +4 -4
  198. package/test/conversationNativeStorage.test.js +11 -10
  199. package/test/conversationReplacement.test.js +13 -13
  200. package/test/conversationRuntime.test.js +9 -5
  201. package/test/conversationSession.test.js +78 -22
  202. package/test/conversationTools.test.js +47 -26
  203. package/test/fileConversationStorage.test.js +10 -3
  204. package/test/fixtures/codexHelperThreadLedger.js +3 -3
  205. package/test/frameworkActions.test.js +33 -18
  206. package/test/localConversationExecution.test.js +4 -4
  207. package/test/localExecution.test.js +1 -1
  208. package/test/openCodeConnectionChange.test.js +3 -2
  209. package/test/openCodeRuntime.test.js +8 -7
  210. package/test/openCodeTools.test.js +1 -1
  211. package/test/opencodeConversationSession.test.js +4 -3
  212. package/test/serviceToolCatalog.test.js +3 -8
  213. package/src/server/lib/assistantCompletion.js +0 -190
  214. package/src/server/lib/assistantToolLoop.js +0 -259
@@ -1,10 +1,7 @@
1
1
  import { normalizeNullableText as normalizeAgentText } from "./normalize.js";
2
2
  import { codexAppServerProjectHookTrustConfig, codexAppServerTextHasControlCharacters } from "./codexConfiguration.js";
3
- import {
4
- codexAppServerRequestIsInvalid,
5
- CODEX_APP_SERVER_THREAD_INVENTORY_ID_MAX_LENGTH,
6
- CODEX_APP_SERVER_THREAD_INVENTORY_MAX_COUNT
7
- } from "./codexProvider.js";
3
+ import { codexAppServerRequestIsInvalid } from "./codexProviderThreads.js";
4
+ import { CODEX_APP_SERVER_THREAD_INVENTORY_ID_MAX_LENGTH, CODEX_APP_SERVER_THREAD_INVENTORY_MAX_COUNT } from "./codexProviderInventories.js";
8
5
 
9
6
  // Renewal thread operations: resume the exact retained thread, or prove a
10
7
  // genuinely fresh successor thread for one renewal operation.
@@ -41,7 +38,7 @@ export function defineCodexRenewalThreadIds(value = [], {
41
38
  }
42
39
 
43
40
  async function listCodexRenewalThreadIds(provider, workdir, errorCode) {
44
- if (typeof provider?.listAppServerThreadsForCwd !== "function") {
41
+ if (!provider) {
45
42
  throw codexRenewalThreadError(
46
43
  errorCode,
47
44
  "The assistant provider cannot inventory the successor's exact session threads."
@@ -118,10 +115,7 @@ async function readCodexRenewalSuccessorThreadSnapshot({
118
115
  { threadId, workdir, errorCode }
119
116
  );
120
117
  } catch (error) {
121
- if (
122
- !codexRenewalThreadNeedsStatusRead(error, threadId) ||
123
- typeof provider?.readThreadStatus !== "function"
124
- ) {
118
+ if (!codexRenewalThreadNeedsStatusRead(error, threadId)) {
125
119
  throw error;
126
120
  }
127
121
  return assertCodexRenewalThreadSnapshot(
@@ -163,11 +157,7 @@ export async function resumeExactCodexAppServerThread({
163
157
  } = {}) {
164
158
  const normalizedWorkdir = normalizeAgentText(workdir);
165
159
  const normalizedExpectedThreadId = normalizeAgentText(expectedThreadId);
166
- if (
167
- typeof provider?.ensureRuntime !== "function" ||
168
- typeof provider?.resumeThread !== "function" ||
169
- typeof provider?.readThread !== "function"
170
- ) {
160
+ if (!provider) {
171
161
  throw codexRenewalThreadError(
172
162
  errorCode,
173
163
  "The old assistant provider cannot read its exact main thread.",
@@ -224,7 +214,7 @@ export async function resumeExactCodexAppServerThread({
224
214
  });
225
215
  }
226
216
 
227
- /** Preserve the original baseline → create/adopt → durable identity → first-read order. */
217
+ /** Starts a thread in order: baseline, create or adopt, durable identity, first read. */
228
218
  export async function startFreshCodexAppServerThread({
229
219
  provider,
230
220
  settings,
@@ -247,12 +237,7 @@ export async function startFreshCodexAppServerThread({
247
237
  { forbiddenThreadId: normalizedForbiddenThreadId }
248
238
  );
249
239
  }
250
- if (
251
- typeof provider?.ensureRuntime !== "function" ||
252
- typeof provider?.resumeThread !== "function" ||
253
- typeof provider?.readThread !== "function" ||
254
- typeof provider?.startThread !== "function"
255
- ) {
240
+ if (!provider) {
256
241
  throw codexRenewalThreadError(
257
242
  errorCode,
258
243
  "The assistant provider cannot prove a genuinely fresh renewal thread."
@@ -1,49 +1,29 @@
1
- import {
2
- normalizeCodexRunText,
3
- CODEX_APP_SERVER_AGENT_RUN_ID,
4
- CODEX_APP_SERVER_RESULT_PROCESSED_EVENT,
5
- codexAppServerTurnCanReceiveProviderCompletion,
6
- codexAppServerProcessedResultEvent,
7
- codexAppServerTurnAwaitsProviderIdentity,
8
- codexAppServerTurnCanAdoptSuccessor,
9
- codexAppServerAgentRun,
10
- CODEX_APP_SERVER_RUN_STATE,
11
- codexAppServerTurnKey
12
- } from "./codexTurnState.js";
1
+ import { CODEX_APP_SERVER_AGENT_RUN_ID, CODEX_APP_SERVER_RESULT_PROCESSED_EVENT, codexAppServerTurnCanReceiveProviderCompletion, codexAppServerProcessedResultEvent, codexAppServerTurnAwaitsProviderIdentity, codexAppServerTurnCanAdoptSuccessor, codexAppServerAgentRun, CODEX_APP_SERVER_RUN_STATE, codexAppServerTurnKey } from "./codexTurnState.js";
2
+ import { normalizeText } from "@jskit-ai/kernel/shared/support/normalize";
13
3
 
14
- // Original result settlement and successor adoption for one retained run owner.
15
- // Journal/output collections remain with their owners and are shared by reference.
4
+ /**
5
+ * Result settlement and successor adoption for one retained run owner. Journal and output collections remain with
6
+ * their owners and are shared by reference.
7
+ * @param {object} dependencies
8
+ * @param {import("./codexRunJournal.js").CodexRunJournal} dependencies.journal
9
+ * @param {import("./codexOutput.js").CodexAppServerOutput} dependencies.output
10
+ * @param {import("./codexTurn.js").CodexCreateRuntime} dependencies.createRuntime
11
+ * @param {import("./codexTurn.js").CodexPublish} dependencies.publish
12
+ * @param {import("./codexTurn.js").CodexDebugLog} dependencies.debugLog
13
+ * @param {import("./codexTurn.js").CodexDebugError} dependencies.debugError
14
+ * @param {import("./codexTurn.js").CodexTurnStateReader} dependencies.turnState
15
+ */
16
16
  export function createCodexResultSettlement({ journal, output, createRuntime, publish, debugLog, debugError, turnState }) {
17
- const {
18
- processedTurns: codexAppServerProcessedTurns,
19
- completedTurns: codexAppServerCompletedTurns,
20
- agentRunPatch,
21
- markTurnIdle: markCodexAppServerTurnIdle,
22
- turnResultWasProcessed: codexAppServerTurnResultWasProcessed,
23
- turnWasCompleted: codexAppServerTurnWasCompleted,
24
- runInputSource: codexAppServerRunInputSource,
25
- clearFinalizingTimer: clearCodexAppServerFinalizingTimer,
26
- agentRunRealtimePayload: codexAppServerAgentRunRealtimePayload,
27
- clearActiveTimer: clearCodexAppServerActiveTimer
28
- } = journal;
29
- const {
30
- finalizedTurns: codexAppServerFinalizedTurns,
31
- resultFinalizationKey: codexAppServerResultFinalizationKey,
32
- cleanupUntrackedTurn: cleanupCodexAppServerUntrackedTurn,
33
- submitAssistantResult: submitCodexAppServerAssistantResult,
34
- flushReasoningPersist: flushCodexAppServerReasoningPersist,
35
- readFinalAssistantResult: readCodexAppServerFinalAssistantResult,
36
- persistAssistantReply: persistCodexAppServerAssistantReply
37
- } = output;
17
+ const { agentRunPatch } = journal;
38
18
  const codexAppServerResultFinalizations = new Map();
39
19
 
40
20
  async function recordCodexAppServerProcessedResult(runtime, sessionId = "", threadId = "", turnId = "", result = {}) {
41
21
  await runtime.store.writeAgentRunEvent(sessionId, CODEX_APP_SERVER_AGENT_RUN_ID, {
42
22
  event: {
43
23
  kind: CODEX_APP_SERVER_RESULT_PROCESSED_EVENT,
44
- providerThreadId: normalizeCodexRunText(threadId),
45
- providerTurnId: normalizeCodexRunText(turnId),
46
- resultReason: normalizeCodexRunText(result.reason)
24
+ providerThreadId: normalizeText(threadId),
25
+ providerTurnId: normalizeText(turnId),
26
+ resultReason: normalizeText(result.reason)
47
27
  },
48
28
  patch: {}
49
29
  });
@@ -57,17 +37,17 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
57
37
  },
58
38
  status = "completed"
59
39
  } = {}) {
60
- const normalizedSessionId = normalizeCodexRunText(sessionId);
61
- const normalizedThreadId = normalizeCodexRunText(threadId);
62
- const normalizedTurnId = normalizeCodexRunText(turnId);
63
- const key = codexAppServerResultFinalizationKey(normalizedSessionId, normalizedThreadId, normalizedTurnId);
40
+ const normalizedSessionId = normalizeText(sessionId);
41
+ const normalizedThreadId = normalizeText(threadId);
42
+ const normalizedTurnId = normalizeText(turnId);
43
+ const key = output.resultFinalizationKey(normalizedSessionId, normalizedThreadId, normalizedTurnId);
64
44
  const runtime = await createRuntime();
65
45
  const session = await runtime.getSession(normalizedSessionId);
66
46
  const turn = turnState(session);
67
47
  if (!codexAppServerTurnCanReceiveProviderCompletion(turn, normalizedThreadId, normalizedTurnId)) {
68
- codexAppServerProcessedTurns.delete(key);
69
- codexAppServerFinalizedTurns.add(key);
70
- cleanupCodexAppServerUntrackedTurn(normalizedThreadId, normalizedTurnId);
48
+ journal.processedTurns.delete(key);
49
+ output.finalizedTurns.add(key);
50
+ output.cleanupUntrackedTurn(normalizedThreadId, normalizedTurnId);
71
51
  debugLog("appServerAgentResult.processedSettlementStale", {
72
52
  currentState: turn.state,
73
53
  currentStatus: turn.status,
@@ -82,14 +62,14 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
82
62
  reason: "stale_turn_state"
83
63
  };
84
64
  }
85
- await markCodexAppServerTurnIdle(normalizedSessionId, {
65
+ await journal.markTurnIdle(normalizedSessionId, {
86
66
  status,
87
67
  threadId: normalizedThreadId,
88
68
  turnId: normalizedTurnId
89
69
  });
90
- codexAppServerProcessedTurns.delete(key);
91
- codexAppServerFinalizedTurns.add(key);
92
- cleanupCodexAppServerUntrackedTurn(normalizedThreadId, normalizedTurnId);
70
+ journal.processedTurns.delete(key);
71
+ output.finalizedTurns.add(key);
72
+ output.cleanupUntrackedTurn(normalizedThreadId, normalizedTurnId);
93
73
  return result;
94
74
  }
95
75
 
@@ -97,10 +77,10 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
97
77
  recoverFromProvider = false,
98
78
  status = "completed"
99
79
  } = {}) {
100
- const normalizedSessionId = normalizeCodexRunText(sessionId);
101
- const normalizedThreadId = normalizeCodexRunText(threadId);
102
- const normalizedTurnId = normalizeCodexRunText(turnId);
103
- const key = codexAppServerResultFinalizationKey(normalizedSessionId, normalizedThreadId, normalizedTurnId);
80
+ const normalizedSessionId = normalizeText(sessionId);
81
+ const normalizedThreadId = normalizeText(threadId);
82
+ const normalizedTurnId = normalizeText(turnId);
83
+ const key = output.resultFinalizationKey(normalizedSessionId, normalizedThreadId, normalizedTurnId);
104
84
  if (!normalizedSessionId || !normalizedThreadId || !normalizedTurnId) {
105
85
  return {
106
86
  ok: false,
@@ -108,7 +88,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
108
88
  reason: "missing_turn"
109
89
  };
110
90
  }
111
- if (codexAppServerProcessedTurns.has(key)) {
91
+ if (journal.processedTurns.has(key)) {
112
92
  return settleCodexAppServerProcessedTurn(
113
93
  normalizedSessionId,
114
94
  normalizedThreadId,
@@ -118,7 +98,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
118
98
  }
119
99
  );
120
100
  }
121
- if (codexAppServerFinalizedTurns.has(key)) {
101
+ if (output.finalizedTurns.has(key)) {
122
102
  return {
123
103
  ok: true,
124
104
  processed: true,
@@ -139,7 +119,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
139
119
  normalizedTurnId
140
120
  );
141
121
  if (processedEvent) {
142
- codexAppServerProcessedTurns.add(key);
122
+ journal.processedTurns.add(key);
143
123
  return settleCodexAppServerProcessedTurn(
144
124
  normalizedSessionId,
145
125
  normalizedThreadId,
@@ -148,7 +128,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
148
128
  result: {
149
129
  ok: true,
150
130
  processed: true,
151
- reason: normalizeCodexRunText(processedEvent.resultReason) || "already_processed"
131
+ reason: normalizeText(processedEvent.resultReason) || "already_processed"
152
132
  },
153
133
  status
154
134
  }
@@ -162,8 +142,8 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
162
142
  };
163
143
  }
164
144
  if (!codexAppServerTurnCanReceiveProviderCompletion(turn, normalizedThreadId, normalizedTurnId)) {
165
- codexAppServerFinalizedTurns.add(key);
166
- cleanupCodexAppServerUntrackedTurn(normalizedThreadId, normalizedTurnId);
145
+ output.finalizedTurns.add(key);
146
+ output.cleanupUntrackedTurn(normalizedThreadId, normalizedTurnId);
167
147
  debugLog("appServerAgentResult.stale", {
168
148
  currentState: turn.state,
169
149
  currentStatus: turn.status,
@@ -179,7 +159,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
179
159
  reason: "stale_turn_state"
180
160
  };
181
161
  }
182
- const result = await submitCodexAppServerAssistantResult(
162
+ const result = await output.submitAssistantResult(
183
163
  normalizedSessionId,
184
164
  normalizedThreadId,
185
165
  normalizedTurnId,
@@ -188,7 +168,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
188
168
  }
189
169
  );
190
170
  if (result?.processed) {
191
- codexAppServerProcessedTurns.add(key);
171
+ journal.processedTurns.add(key);
192
172
  await recordCodexAppServerProcessedResult(
193
173
  runtime,
194
174
  normalizedSessionId,
@@ -237,7 +217,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
237
217
  }
238
218
  const runtime = await createRuntime();
239
219
  const session = await runtime.getSession(sessionId);
240
- return codexAppServerTurnResultWasProcessed(session, threadId, turnId)
220
+ return journal.turnResultWasProcessed(session, threadId, turnId)
241
221
  ? result
242
222
  : {
243
223
  ...result,
@@ -247,10 +227,10 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
247
227
  }
248
228
 
249
229
  async function adoptCodexAppServerSuccessorTurn(sessionId = "", input = {}) {
250
- const normalizedSessionId = normalizeCodexRunText(sessionId);
251
- const normalizedThreadId = normalizeCodexRunText(input.threadId);
252
- const normalizedTurnId = normalizeCodexRunText(input.turnId);
253
- const expectedPreviousTurnId = normalizeCodexRunText(input.previousTurnId);
230
+ const normalizedSessionId = normalizeText(sessionId);
231
+ const normalizedThreadId = normalizeText(input.threadId);
232
+ const normalizedTurnId = normalizeText(input.turnId);
233
+ const expectedPreviousTurnId = normalizeText(input.previousTurnId);
254
234
  if (!normalizedSessionId || !normalizedThreadId || !normalizedTurnId || !expectedPreviousTurnId) {
255
235
  return {
256
236
  ok: true,
@@ -270,8 +250,8 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
270
250
  const currentSession = await runtime.getSession(normalizedSessionId);
271
251
  const currentTurn = turnState(currentSession);
272
252
  if (
273
- normalizeCodexRunText(currentTurn.threadId) === normalizedThreadId &&
274
- normalizeCodexRunText(currentTurn.turnId) === normalizedTurnId
253
+ normalizeText(currentTurn.threadId) === normalizedThreadId &&
254
+ normalizeText(currentTurn.turnId) === normalizedTurnId
275
255
  ) {
276
256
  outcome = {
277
257
  ok: true,
@@ -280,7 +260,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
280
260
  };
281
261
  return currentSession;
282
262
  }
283
- if (codexAppServerTurnWasCompleted(currentSession, normalizedThreadId, normalizedTurnId)) {
263
+ if (journal.turnWasCompleted(currentSession, normalizedThreadId, normalizedTurnId)) {
284
264
  outcome = {
285
265
  ok: true,
286
266
  processed: false,
@@ -289,7 +269,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
289
269
  return currentSession;
290
270
  }
291
271
  if (
292
- normalizeCodexRunText(currentTurn.turnId) !== expectedPreviousTurnId ||
272
+ normalizeText(currentTurn.turnId) !== expectedPreviousTurnId ||
293
273
  !codexAppServerTurnCanAdoptSuccessor(currentTurn, normalizedThreadId, normalizedTurnId)
294
274
  ) {
295
275
  outcome = {
@@ -299,17 +279,17 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
299
279
  };
300
280
  return currentSession;
301
281
  }
302
- previousTurnId = normalizeCodexRunText(currentTurn.turnId);
282
+ previousTurnId = normalizeText(currentTurn.turnId);
303
283
  const updatedAt = new Date().toISOString();
304
284
  runPatch = agentRunPatch({
305
285
  runState: CODEX_APP_SERVER_RUN_STATE.ACTIVE,
306
286
  session: currentSession,
307
- status: normalizeCodexRunText(input.status) || "inProgress",
287
+ status: normalizeText(input.status) || "inProgress",
308
288
  threadId: normalizedThreadId,
309
289
  turnId: normalizedTurnId,
310
290
  updatedAt
311
291
  });
312
- const currentInputSource = codexAppServerRunInputSource(codexAppServerAgentRun(currentSession));
292
+ const currentInputSource = journal.runInputSource(codexAppServerAgentRun(currentSession));
313
293
  if (currentInputSource) {
314
294
  runPatch.inputSource = currentInputSource;
315
295
  }
@@ -321,7 +301,7 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
321
301
  previousProviderTurnId: previousTurnId,
322
302
  providerThreadId: normalizedThreadId,
323
303
  providerTurnId: normalizedTurnId,
324
- source: normalizeCodexRunText(input.source),
304
+ source: normalizeText(input.source),
325
305
  state: runPatch.state
326
306
  },
327
307
  patch: runPatch
@@ -340,35 +320,35 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
340
320
  return outcome;
341
321
  }
342
322
 
343
- clearCodexAppServerFinalizingTimer(
323
+ journal.clearFinalizingTimer(
344
324
  normalizedSessionId,
345
325
  normalizedThreadId,
346
326
  previousTurnId
347
327
  );
348
- codexAppServerCompletedTurns.add(codexAppServerTurnKey(
328
+ journal.completedTurns.add(codexAppServerTurnKey(
349
329
  normalizedThreadId,
350
330
  previousTurnId
351
331
  ));
352
- const previousResultKey = codexAppServerResultFinalizationKey(
332
+ const previousResultKey = output.resultFinalizationKey(
353
333
  normalizedSessionId,
354
334
  normalizedThreadId,
355
335
  previousTurnId
356
336
  );
357
- codexAppServerProcessedTurns.delete(previousResultKey);
358
- codexAppServerFinalizedTurns.add(previousResultKey);
337
+ journal.processedTurns.delete(previousResultKey);
338
+ output.finalizedTurns.add(previousResultKey);
359
339
  try {
360
- await flushCodexAppServerReasoningPersist(
340
+ await output.flushReasoningPersist(
361
341
  normalizedSessionId,
362
342
  normalizedThreadId,
363
343
  previousTurnId
364
344
  );
365
- const previousAssistantResult = readCodexAppServerFinalAssistantResult(
345
+ const previousAssistantResult = output.readFinalAssistantResult(
366
346
  normalizedSessionId,
367
347
  normalizedThreadId,
368
348
  previousTurnId
369
349
  );
370
350
  if (previousAssistantResult?.text) {
371
- await persistCodexAppServerAssistantReply(
351
+ await output.persistAssistantReply(
372
352
  runtime,
373
353
  normalizedSessionId,
374
354
  previousAssistantResult
@@ -383,27 +363,29 @@ export function createCodexResultSettlement({ journal, output, createRuntime, pu
383
363
  turnId: normalizedTurnId
384
364
  });
385
365
  }
386
- cleanupCodexAppServerUntrackedTurn(normalizedThreadId, previousTurnId);
366
+ output.cleanupUntrackedTurn(normalizedThreadId, previousTurnId);
387
367
  await publish(normalizedSessionId, {
388
- payload: codexAppServerAgentRunRealtimePayload(runPatch),
368
+ payload: journal.agentRunRealtimePayload(runPatch),
389
369
  reason: "codex-app-server-turn-active",
390
370
  session: updatedSession
391
371
  });
392
372
  debugLog("appServerTurn.continued", {
393
373
  previousTurnId,
394
374
  sessionId: normalizedSessionId,
395
- source: normalizeCodexRunText(input.source),
375
+ source: normalizeText(input.source),
396
376
  threadId: normalizedThreadId,
397
377
  turnId: normalizedTurnId
398
378
  });
399
- clearCodexAppServerActiveTimer(normalizedSessionId);
379
+ journal.clearActiveTimer(normalizedSessionId);
400
380
  return outcome;
401
381
  }
402
382
 
403
- return {
383
+ return Object.freeze({
404
384
  resultFinalizations: codexAppServerResultFinalizations,
405
385
  finalizeAssistantResult: finalizeCodexAppServerAssistantResult,
406
386
  recoverFinalResponseBeforeOutcome: recoverCodexAppServerFinalResponseBeforeOutcome,
407
387
  adoptSuccessorTurn: adoptCodexAppServerSuccessorTurn
408
- };
388
+ });
409
389
  }
390
+
391
+ /** @typedef {ReturnType<typeof createCodexResultSettlement>} CodexResultSettlement */