@jskit-ai/assistant-core 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/examples/conversation/package.json +5 -5
- package/package.json +18 -7
- package/src/client/browser.js +21 -0
- package/src/client/conversation/AssistantAttachmentQueue.vue +25 -108
- package/src/client/conversation/AssistantComposerActions.vue +1 -1
- package/src/client/conversation/AssistantConversationElement.vue +14 -52
- package/src/client/conversation/AssistantGoalControl.vue +13 -10
- package/src/client/conversation/AssistantPromptInput.vue +6 -91
- package/src/client/conversation/AssistantTranscript.css +505 -0
- package/src/client/conversation/AssistantTranscript.vue +24 -1197
- package/src/client/conversation/attachmentFiles.js +158 -0
- package/src/client/conversation/attachmentQueueItems.js +121 -0
- package/src/client/conversation/attachmentUploadRows.js +265 -0
- package/src/client/conversation/conversationDisplay.js +54 -0
- package/src/client/conversation/messageDelivery.js +13 -9
- package/src/client/conversation/retainedConversation.js +14 -3
- package/src/client/conversation/submitText.js +13 -2
- package/src/client/conversation/transcriptEntries.js +225 -0
- package/src/client/conversation/useAssistantAttachments.js +86 -388
- package/src/client/conversation/useAssistantQuestions.js +16 -3
- package/src/client/conversation/useAssistantSuggestions.js +16 -2
- package/src/client/conversation/useScrollToBottom.js +17 -19
- package/src/client/conversation/useTextareaAutoGrow.js +115 -0
- package/src/client/conversation/useTranscriptScrollFollow.js +525 -0
- package/src/client/lib/assistantApi.js +192 -161
- package/src/client/types.js +110 -0
- package/src/server/conversation/attachments.js +21 -6
- package/src/server/conversation/boundedToolLoop.js +1 -0
- package/src/server/conversation/claudeClient.js +71 -20
- package/src/server/conversation/claudeCommandRun.js +191 -0
- package/src/server/conversation/claudeHistory.js +7 -0
- package/src/server/conversation/claudeNativeTurn.js +708 -0
- package/src/server/conversation/claudeProcess.js +186 -112
- package/src/server/conversation/claudeProcessStart.js +214 -0
- package/src/server/conversation/claudePromptDelivery.js +183 -0
- package/src/server/conversation/claudeSessionCleanup.js +248 -0
- package/src/server/conversation/claudeTools.js +15 -3
- package/src/server/conversation/claudeTurn.js +212 -1388
- package/src/server/conversation/codexAccountReader.js +168 -0
- package/src/server/conversation/codexAuthPreflight.js +5 -4
- package/src/server/conversation/codexClient.js +18 -6
- package/src/server/conversation/codexConfiguration.js +8 -844
- package/src/server/conversation/codexConversationStops.js +377 -0
- package/src/server/conversation/codexConversationStore.js +119 -85
- package/src/server/conversation/codexConversationTurns.js +378 -0
- package/src/server/conversation/codexConversations.js +134 -866
- package/src/server/conversation/codexDetachedConversation.js +203 -0
- package/src/server/conversation/codexDetachedTurn.js +145 -104
- package/src/server/conversation/codexEvents.js +5 -200
- package/src/server/conversation/codexGoalCommands.js +14 -4
- package/src/server/conversation/codexHelperExecution.js +57 -57
- package/src/server/conversation/codexHelperThreadLedger.js +30 -288
- package/src/server/conversation/codexHelperThreadRecord.js +304 -0
- package/src/server/conversation/codexHelperThreadRecovery.js +54 -76
- package/src/server/conversation/codexHelperThreads.js +94 -93
- package/src/server/conversation/codexHistoryAdapter.js +13 -8
- package/src/server/conversation/codexIsolation.js +672 -0
- package/src/server/conversation/codexLiveItems.js +379 -0
- package/src/server/conversation/codexMessageCommands.js +68 -286
- package/src/server/conversation/codexMessageDelivery.js +46 -37
- package/src/server/conversation/codexModelCatalog.js +86 -7
- package/src/server/conversation/codexNotificationObserver.js +81 -88
- package/src/server/conversation/codexNotificationQueue.js +21 -10
- package/src/server/conversation/codexObservationControl.js +105 -89
- package/src/server/conversation/codexOutput.js +84 -419
- package/src/server/conversation/codexProcess.js +29 -1053
- package/src/server/conversation/codexProcessLeader.js +1 -0
- package/src/server/conversation/codexPromptDispatch.js +241 -0
- package/src/server/conversation/codexProvider.js +147 -1807
- package/src/server/conversation/codexProviderAuth.js +348 -0
- package/src/server/conversation/codexProviderInvalidation.js +371 -0
- package/src/server/conversation/codexProviderInventories.js +437 -0
- package/src/server/conversation/codexProviderOwner.js +149 -957
- package/src/server/conversation/codexProviderRelease.js +465 -0
- package/src/server/conversation/codexProviderSelection.js +26 -15
- package/src/server/conversation/codexProviderThreads.js +698 -0
- package/src/server/conversation/codexProviderTurns.js +453 -0
- package/src/server/conversation/codexReasoning.js +32 -23
- package/src/server/conversation/codexRenewalCommands.js +18 -6
- package/src/server/conversation/codexRenewalThreads.js +7 -22
- package/src/server/conversation/codexResultSettlement.js +70 -88
- package/src/server/conversation/codexRunJournal.js +91 -97
- package/src/server/conversation/codexRuntime.js +426 -0
- package/src/server/conversation/codexRuntimeInventory.js +113 -0
- package/src/server/conversation/codexRuntimeLifecycle.js +39 -13
- package/src/server/conversation/codexRuntimeStart.js +431 -0
- package/src/server/conversation/codexRuntimeStop.js +324 -0
- package/src/server/conversation/codexSessionCleanup.js +25 -10
- package/src/server/conversation/codexSessionReconciliation.js +21 -7
- package/src/server/conversation/codexThreadReadiness.js +49 -52
- package/src/server/conversation/codexThreadSnapshot.js +210 -0
- package/src/server/conversation/codexThreadStatus.js +48 -62
- package/src/server/conversation/codexTurn.js +171 -55
- package/src/server/conversation/codexTurnActivity.js +210 -0
- package/src/server/conversation/codexTurnControl.js +44 -48
- package/src/server/conversation/codexTurnEndings.js +610 -0
- package/src/server/conversation/codexTurnRecovery.js +97 -848
- package/src/server/conversation/codexTurnState.js +138 -111
- package/src/server/conversation/completedResponses.js +227 -0
- package/src/server/conversation/configuration.js +2 -2
- package/src/server/conversation/continuity.js +43 -6
- package/src/server/conversation/conversationDelivery.js +394 -0
- package/src/server/conversation/conversationEntries.js +365 -0
- package/src/server/conversation/conversationEvents.js +192 -0
- package/src/server/conversation/conversationGoals.js +187 -0
- package/src/server/conversation/conversationHandles.js +237 -0
- package/src/server/conversation/conversationReads.js +206 -0
- package/src/server/conversation/conversationRefusals.js +58 -0
- package/src/server/conversation/conversationReplacement.js +254 -0
- package/src/server/conversation/conversationSending.js +273 -0
- package/src/server/conversation/conversationStopping.js +121 -0
- package/src/server/conversation/conversationTurnDelivery.js +413 -0
- package/src/server/conversation/conversationTurns.js +511 -0
- package/src/server/conversation/deliveryTiming.js +25 -3
- package/src/server/conversation/fileStorage.js +11 -6
- package/src/server/conversation/hookBridge.js +14 -3
- package/src/server/conversation/index.js +1 -1
- package/src/server/conversation/localExecution.js +82 -625
- package/src/server/conversation/nativeCommandCallbacks.js +10 -0
- package/src/server/conversation/nativeConversationLifecycle.js +379 -0
- package/src/server/conversation/nativeHistoryExport.js +27 -18
- package/src/server/conversation/normalize.js +9 -0
- package/src/server/conversation/openCodeClient.js +295 -366
- package/src/server/conversation/openCodeNativeHistory.js +141 -0
- package/src/server/conversation/openCodeNativeSession.js +79 -0
- package/src/server/conversation/openCodeProcess.js +109 -53
- package/src/server/conversation/openCodeProcessOwner.js +565 -0
- package/src/server/conversation/openCodeRuntime.js +111 -1814
- package/src/server/conversation/openCodeSessionTurns.js +547 -0
- package/src/server/conversation/openCodeTemporaryConversations.js +394 -0
- package/src/server/conversation/openCodeTools.js +28 -14
- package/src/server/conversation/openCodeTurn.js +80 -74
- package/src/server/conversation/openCodeTurnMonitor.js +388 -0
- package/src/server/conversation/processIdentity.js +582 -0
- package/src/server/conversation/provider.js +21 -6
- package/src/server/conversation/providers/api.js +268 -107
- package/src/server/conversation/providers/claude.js +29 -6
- package/src/server/conversation/providers/claudeDriver.js +325 -250
- package/src/server/conversation/providers/codex.js +69 -33
- package/src/server/conversation/providers/codexDriver.js +503 -1081
- package/src/server/conversation/providers/codexDriverConnection.js +331 -0
- package/src/server/conversation/providers/codexDriverTurns.js +464 -0
- package/src/server/conversation/providers/opencode.js +30 -4
- package/src/server/conversation/providers/opencodeDriver.js +321 -659
- package/src/server/conversation/providers/opencodeStandalone.js +475 -0
- package/src/server/conversation/providers/scoped.js +64 -19
- package/src/server/conversation/runtime.js +171 -2863
- package/src/server/conversation/storage.js +91 -50
- package/src/server/conversation/streams.js +15 -2
- package/src/server/conversation/structuredOutput.js +7 -11
- package/src/server/conversation/systemPrompt.js +13 -1
- package/src/server/conversation/tools.js +47 -15
- package/src/server/conversation/transcript.js +49 -20
- package/src/server/hosts/claudeTurn.js +2 -4
- package/src/server/hosts/codexConfiguration.js +6 -8
- package/src/server/hosts/codexEvents.js +4 -2
- package/src/server/hosts/codexProcess.js +1 -1
- package/src/server/hosts/codexProvider.js +11 -9
- package/src/server/hosts/codexTurn.js +3 -3
- package/src/server/hosts/openCodeClient.js +4 -2
- package/src/server/index.js +0 -2
- package/src/server/lib/aiConnectionClient.js +35 -25
- package/src/server/lib/ndjson.js +1 -0
- package/src/server/lib/providers/anthropicClient.js +15 -6
- package/src/server/lib/providers/common.js +10 -6
- package/src/server/lib/providers/openAiCompatibleClient.js +40 -23
- package/src/server/lib/serviceToolCatalog.js +29 -283
- package/src/server/lib/serviceToolEntries.js +270 -0
- package/src/server/types.js +78 -0
- package/src/shared/assistantResource.js +0 -23
- package/src/shared/conversation/answerChoiceSugar.js +2 -14
- package/src/shared/conversation/messageInputSugar.js +18 -0
- package/src/shared/conversation/numberedQuestionSugar.js +6 -16
- package/src/shared/conversation/pagination.js +1 -1
- package/src/shared/conversation/questions.js +1 -0
- package/src/shared/conversation/streaming.js +1 -0
- package/src/shared/index.js +0 -1
- package/src/testing/conversationStorageContract.js +20 -0
- package/test/aiConnectionClient.test.js +42 -1
- package/test/apiConversationDriver.test.js +217 -38
- package/test/assistantBoundedToolLoop.test.js +1 -1
- package/test/claudeConversationSession.test.js +15 -11
- package/test/claudeInstructionResume.test.js +1 -1
- package/test/claudeProcess.test.js +9 -9
- package/test/claudeTurn.test.js +21 -8
- package/test/codexAccountChange.test.js +5 -3
- package/test/codexConversationSession.test.js +22 -21
- package/test/codexEvents.test.js +3 -1
- package/test/codexHelperDeletion.test.js +3 -7
- package/test/codexIsolation.test.js +6 -6
- package/test/codexModelCatalog.test.js +6 -7
- package/test/codexProcess.test.js +3 -3
- package/test/codexThreadSelection.test.js +4 -1
- package/test/codexTurn.test.js +29 -20
- package/test/conversationApiFacilities.test.js +11 -9
- package/test/conversationAttachments.test.js +3 -3
- package/test/conversationConfiguration.test.js +4 -4
- package/test/conversationNativeStorage.test.js +11 -10
- package/test/conversationReplacement.test.js +13 -13
- package/test/conversationRuntime.test.js +9 -5
- package/test/conversationSession.test.js +78 -22
- package/test/conversationTools.test.js +47 -26
- package/test/fileConversationStorage.test.js +10 -3
- package/test/fixtures/codexHelperThreadLedger.js +3 -3
- package/test/frameworkActions.test.js +33 -18
- package/test/localConversationExecution.test.js +4 -4
- package/test/localExecution.test.js +1 -1
- package/test/openCodeConnectionChange.test.js +3 -2
- package/test/openCodeRuntime.test.js +8 -7
- package/test/openCodeTools.test.js +1 -1
- package/test/opencodeConversationSession.test.js +4 -3
- package/test/serviceToolCatalog.test.js +3 -8
- package/src/server/lib/assistantCompletion.js +0 -190
- 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
|
-
|
|
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 (
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|
-
|
|
15
|
-
|
|
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:
|
|
45
|
-
providerTurnId:
|
|
46
|
-
resultReason:
|
|
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 =
|
|
61
|
-
const normalizedThreadId =
|
|
62
|
-
const normalizedTurnId =
|
|
63
|
-
const key =
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
|
65
|
+
await journal.markTurnIdle(normalizedSessionId, {
|
|
86
66
|
status,
|
|
87
67
|
threadId: normalizedThreadId,
|
|
88
68
|
turnId: normalizedTurnId
|
|
89
69
|
});
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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 =
|
|
101
|
-
const normalizedThreadId =
|
|
102
|
-
const normalizedTurnId =
|
|
103
|
-
const key =
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
166
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
251
|
-
const normalizedThreadId =
|
|
252
|
-
const normalizedTurnId =
|
|
253
|
-
const expectedPreviousTurnId =
|
|
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
|
-
|
|
274
|
-
|
|
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 (
|
|
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
|
-
|
|
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 =
|
|
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:
|
|
287
|
+
status: normalizeText(input.status) || "inProgress",
|
|
308
288
|
threadId: normalizedThreadId,
|
|
309
289
|
turnId: normalizedTurnId,
|
|
310
290
|
updatedAt
|
|
311
291
|
});
|
|
312
|
-
const currentInputSource =
|
|
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:
|
|
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
|
-
|
|
323
|
+
journal.clearFinalizingTimer(
|
|
344
324
|
normalizedSessionId,
|
|
345
325
|
normalizedThreadId,
|
|
346
326
|
previousTurnId
|
|
347
327
|
);
|
|
348
|
-
|
|
328
|
+
journal.completedTurns.add(codexAppServerTurnKey(
|
|
349
329
|
normalizedThreadId,
|
|
350
330
|
previousTurnId
|
|
351
331
|
));
|
|
352
|
-
const previousResultKey =
|
|
332
|
+
const previousResultKey = output.resultFinalizationKey(
|
|
353
333
|
normalizedSessionId,
|
|
354
334
|
normalizedThreadId,
|
|
355
335
|
previousTurnId
|
|
356
336
|
);
|
|
357
|
-
|
|
358
|
-
|
|
337
|
+
journal.processedTurns.delete(previousResultKey);
|
|
338
|
+
output.finalizedTurns.add(previousResultKey);
|
|
359
339
|
try {
|
|
360
|
-
await
|
|
340
|
+
await output.flushReasoningPersist(
|
|
361
341
|
normalizedSessionId,
|
|
362
342
|
normalizedThreadId,
|
|
363
343
|
previousTurnId
|
|
364
344
|
);
|
|
365
|
-
const previousAssistantResult =
|
|
345
|
+
const previousAssistantResult = output.readFinalAssistantResult(
|
|
366
346
|
normalizedSessionId,
|
|
367
347
|
normalizedThreadId,
|
|
368
348
|
previousTurnId
|
|
369
349
|
);
|
|
370
350
|
if (previousAssistantResult?.text) {
|
|
371
|
-
await
|
|
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
|
-
|
|
366
|
+
output.cleanupUntrackedTurn(normalizedThreadId, previousTurnId);
|
|
387
367
|
await publish(normalizedSessionId, {
|
|
388
|
-
payload:
|
|
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:
|
|
375
|
+
source: normalizeText(input.source),
|
|
396
376
|
threadId: normalizedThreadId,
|
|
397
377
|
turnId: normalizedTurnId
|
|
398
378
|
});
|
|
399
|
-
|
|
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 */
|