@cmmd-center/forge 0.9.17 → 0.9.18
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/dist/bin.cjs +716 -405
- package/dist/bin.mjs +743 -444
- package/dist/client/assets/{CanvasPanel-D9sKevpO.js → CanvasPanel-DO2u5-Xk.js} +2 -2
- package/dist/client/assets/{CompositeItem-Bsi2e5qV.js → CompositeItem-BNUtGUNS.js} +2 -2
- package/dist/client/assets/{DiffPanel-ClMWe6-c.js → DiffPanel-CiOqFcOU.js} +2 -2
- package/dist/client/assets/{DiffPanel.logic-o7tDdTzf.js → DiffPanel.logic-CcUKnHmG.js} +2 -2
- package/dist/client/assets/{DiffPanelShell-R1Q66jTc.js → DiffPanelShell-B8YmcyIS.js} +33 -33
- package/dist/client/assets/{DiffWorkerPoolProvider-lEFZi8QR.js → DiffWorkerPoolProvider-XttvFu9p.js} +2 -2
- package/dist/client/assets/{PullRequestCodePanel-BpbniIb5.js → PullRequestCodePanel-BwnGKUmC.js} +2 -2
- package/dist/client/assets/{Virtualizer-B5NXbN5f.js → Virtualizer-DD1kZz4_.js} +2 -2
- package/dist/client/assets/{canvasStateStore-qioLqOoT.js → canvasStateStore-BVOZ0hkY.js} +2 -2
- package/dist/client/assets/{cmmdAuthRedirect-lmPzseq5.js → cmmdAuthRedirect-COJsfxk2.js} +2 -2
- package/dist/client/assets/{index-D0769c3n.js → index-B6v3s1Ki.js} +57 -57
- package/dist/client/assets/{index-4a61qSZ4.css → index-BUnBt2Vq.css} +1 -1
- package/dist/client/assets/{src-BL6J64vk.js → src-DEn2qb9-.js} +3 -3
- package/dist/client/assets/{toggle-CW3yNjj1.js → toggle-vjiHllrh.js} +2 -2
- package/dist/client/assets/{useTriggerFocusGuards-mvO6ygs-.js → useTriggerFocusGuards-DMJ0Xu3Z.js} +2 -2
- package/dist/client/index.html +11 -11
- package/dist/{open-FIgTDosf.mjs → open-D8mGyWmt.mjs} +3 -3
- package/package.json +1 -1
package/dist/bin.cjs
CHANGED
|
@@ -19196,6 +19196,23 @@ const ProjectAvailability = require_Schema$1.Literals([
|
|
|
19196
19196
|
"missing",
|
|
19197
19197
|
"unknown"
|
|
19198
19198
|
]);
|
|
19199
|
+
/**
|
|
19200
|
+
* The CMMD record that places one Forge Project onto one Environment.
|
|
19201
|
+
*
|
|
19202
|
+
* The organization and the CMMD project together are the durable identity of a
|
|
19203
|
+
* Checkout on that Environment, and the key every lookup uses; a directory path
|
|
19204
|
+
* only breaks ties. A Forge Cloud Environment is per (organization, user), so
|
|
19205
|
+
* every Checkout on it reports the same workspace root and, once connected,
|
|
19206
|
+
* an empty `cwd` — nothing about a directory can tell them apart.
|
|
19207
|
+
*
|
|
19208
|
+
* Optional everywhere it appears: a project created before this field existed,
|
|
19209
|
+
* or one added by hand rather than from a Registration, carries none and is
|
|
19210
|
+
* still matched by the directory rules.
|
|
19211
|
+
*/
|
|
19212
|
+
const CmmdRegistration = require_Schema$1.Struct({
|
|
19213
|
+
cmmdOrganizationId: PositiveInt,
|
|
19214
|
+
cmmdProjectId: PositiveInt
|
|
19215
|
+
});
|
|
19199
19216
|
const OrchestrationProject = require_Schema$1.Struct({
|
|
19200
19217
|
id: ProjectId,
|
|
19201
19218
|
title: TrimmedNonEmptyString,
|
|
@@ -19204,6 +19221,7 @@ const OrchestrationProject = require_Schema$1.Struct({
|
|
|
19204
19221
|
availability: require_Schema$1.optional(ProjectAvailability),
|
|
19205
19222
|
defaultModelSelection: require_Schema$1.NullOr(ModelSelection),
|
|
19206
19223
|
defaultThreadEnvMode: require_Schema$1.optional(require_Schema$1.NullOr(ThreadEnvMode)),
|
|
19224
|
+
cmmdRegistration: require_Schema$1.optional(require_Schema$1.NullOr(CmmdRegistration)),
|
|
19207
19225
|
scripts: require_Schema$1.ArraySchema(ProjectScript),
|
|
19208
19226
|
createdAt: IsoDateTime,
|
|
19209
19227
|
updatedAt: IsoDateTime,
|
|
@@ -19476,6 +19494,7 @@ const OrchestrationProjectShell = require_Schema$1.Struct({
|
|
|
19476
19494
|
availability: require_Schema$1.optional(ProjectAvailability),
|
|
19477
19495
|
defaultModelSelection: require_Schema$1.NullOr(ModelSelection),
|
|
19478
19496
|
defaultThreadEnvMode: require_Schema$1.optional(require_Schema$1.NullOr(ThreadEnvMode)),
|
|
19497
|
+
cmmdRegistration: require_Schema$1.optional(require_Schema$1.NullOr(CmmdRegistration)),
|
|
19479
19498
|
scripts: require_Schema$1.ArraySchema(ProjectScript),
|
|
19480
19499
|
createdAt: IsoDateTime,
|
|
19481
19500
|
updatedAt: IsoDateTime
|
|
@@ -19555,6 +19574,7 @@ const ProjectCreateCommand = require_Schema$1.Struct({
|
|
|
19555
19574
|
workspaceRoot: TrimmedNonEmptyString,
|
|
19556
19575
|
defaultModelSelection: require_Schema$1.optional(require_Schema$1.NullOr(ModelSelection)),
|
|
19557
19576
|
defaultThreadEnvMode: require_Schema$1.optional(require_Schema$1.NullOr(ThreadEnvMode)),
|
|
19577
|
+
cmmdRegistration: require_Schema$1.optional(require_Schema$1.NullOr(CmmdRegistration)),
|
|
19558
19578
|
createdAt: IsoDateTime
|
|
19559
19579
|
});
|
|
19560
19580
|
const ProjectMetaUpdateCommand = require_Schema$1.Struct({
|
|
@@ -19565,6 +19585,7 @@ const ProjectMetaUpdateCommand = require_Schema$1.Struct({
|
|
|
19565
19585
|
workspaceRoot: require_Schema$1.optional(TrimmedNonEmptyString),
|
|
19566
19586
|
defaultModelSelection: require_Schema$1.optional(require_Schema$1.NullOr(ModelSelection)),
|
|
19567
19587
|
defaultThreadEnvMode: require_Schema$1.optional(require_Schema$1.NullOr(ThreadEnvMode)),
|
|
19588
|
+
cmmdRegistration: require_Schema$1.optional(require_Schema$1.NullOr(CmmdRegistration)),
|
|
19568
19589
|
scripts: require_Schema$1.optional(require_Schema$1.ArraySchema(ProjectScript))
|
|
19569
19590
|
});
|
|
19570
19591
|
const ProjectDeleteCommand = require_Schema$1.Struct({
|
|
@@ -19975,6 +19996,7 @@ const ProjectCreatedPayload$1 = require_Schema$1.Struct({
|
|
|
19975
19996
|
repositoryIdentity: require_Schema$1.optional(require_Schema$1.NullOr(RepositoryIdentity)),
|
|
19976
19997
|
defaultModelSelection: require_Schema$1.NullOr(ModelSelection),
|
|
19977
19998
|
defaultThreadEnvMode: require_Schema$1.optional(require_Schema$1.NullOr(ThreadEnvMode)),
|
|
19999
|
+
cmmdRegistration: require_Schema$1.optional(require_Schema$1.NullOr(CmmdRegistration)),
|
|
19978
20000
|
scripts: require_Schema$1.ArraySchema(ProjectScript),
|
|
19979
20001
|
createdAt: IsoDateTime,
|
|
19980
20002
|
updatedAt: IsoDateTime
|
|
@@ -19986,6 +20008,7 @@ const ProjectMetaUpdatedPayload$1 = require_Schema$1.Struct({
|
|
|
19986
20008
|
repositoryIdentity: require_Schema$1.optional(require_Schema$1.NullOr(RepositoryIdentity)),
|
|
19987
20009
|
defaultModelSelection: require_Schema$1.optional(require_Schema$1.NullOr(ModelSelection)),
|
|
19988
20010
|
defaultThreadEnvMode: require_Schema$1.optional(require_Schema$1.NullOr(ThreadEnvMode)),
|
|
20011
|
+
cmmdRegistration: require_Schema$1.optional(require_Schema$1.NullOr(CmmdRegistration)),
|
|
19989
20012
|
scripts: require_Schema$1.optional(require_Schema$1.ArraySchema(ProjectScript)),
|
|
19990
20013
|
updatedAt: IsoDateTime
|
|
19991
20014
|
});
|
|
@@ -20923,7 +20946,30 @@ const ThreadTokenUsageSnapshot = require_Schema$1.Struct({
|
|
|
20923
20946
|
durationMs: require_Schema$1.optional(NonNegativeInt),
|
|
20924
20947
|
compactsAutomatically: require_Schema$1.optional(require_Schema$1.Boolean)
|
|
20925
20948
|
});
|
|
20926
|
-
|
|
20949
|
+
/**
|
|
20950
|
+
* What one turn spent, as the adapter saw it on the wire, in the disjoint
|
|
20951
|
+
* buckets Forge's usage contract totals. Separate from the context-meter
|
|
20952
|
+
* snapshot above on purpose: that snapshot answers "how full is the window",
|
|
20953
|
+
* this answers "what did the turn cost", and the two providers report the
|
|
20954
|
+
* second differently.
|
|
20955
|
+
*
|
|
20956
|
+
* `turn-total` is the whole turn so far (Claude reports it once, from the
|
|
20957
|
+
* result message). `call-delta` is one provider call (Codex reports one per
|
|
20958
|
+
* token update, and a turn's total is the sum of its deltas after dropping
|
|
20959
|
+
* consecutive duplicates, exactly as the transcript scanner does).
|
|
20960
|
+
*/
|
|
20961
|
+
const ProviderTurnUsage = require_Schema$1.Struct({
|
|
20962
|
+
scope: require_Schema$1.Literals(["turn-total", "call-delta"]),
|
|
20963
|
+
uncachedInputTokens: NonNegativeInt,
|
|
20964
|
+
cachedInputTokens: NonNegativeInt,
|
|
20965
|
+
cacheCreationTokens: NonNegativeInt,
|
|
20966
|
+
outputTokens: NonNegativeInt,
|
|
20967
|
+
reasoningTokens: NonNegativeInt
|
|
20968
|
+
});
|
|
20969
|
+
const ThreadTokenUsageUpdatedPayload = require_Schema$1.Struct({
|
|
20970
|
+
usage: ThreadTokenUsageSnapshot,
|
|
20971
|
+
turnUsage: require_Schema$1.optional(ProviderTurnUsage)
|
|
20972
|
+
});
|
|
20927
20973
|
const ThreadRealtimeStartedPayload = require_Schema$1.Struct({ realtimeSessionId: require_Schema$1.optional(TrimmedNonEmptyStringSchema$2) });
|
|
20928
20974
|
const ThreadRealtimeItemAddedPayload = require_Schema$1.Struct({ item: require_Schema$1.Unknown });
|
|
20929
20975
|
const ThreadRealtimeAudioDeltaPayload = require_Schema$1.Struct({ audio: require_Schema$1.Unknown });
|
|
@@ -65160,7 +65206,7 @@ function normalizeNumberish(value) {
|
|
|
65160
65206
|
}
|
|
65161
65207
|
//#endregion
|
|
65162
65208
|
//#region package.json
|
|
65163
|
-
var version$1 = "0.9.
|
|
65209
|
+
var version$1 = "0.9.18";
|
|
65164
65210
|
//#endregion
|
|
65165
65211
|
//#region src/sentry.ts
|
|
65166
65212
|
const SERVER_APP_NAME = "forge-server";
|
|
@@ -68306,7 +68352,8 @@ function fixPath(options = {}) {
|
|
|
68306
68352
|
if (shellPath) break;
|
|
68307
68353
|
}
|
|
68308
68354
|
const launchctlPath = platform === "darwin" && !shellPath ? (options.readLaunchctlPath ?? readPathFromLaunchctl)() : void 0;
|
|
68309
|
-
const
|
|
68355
|
+
const hydratedPath = shellPath ?? launchctlPath;
|
|
68356
|
+
const mergedPath = options.preferProcessPath ? mergePathEntries(env.PATH, hydratedPath, platform) : mergePathEntries(hydratedPath, env.PATH, platform);
|
|
68310
68357
|
if (mergedPath) env.PATH = mergedPath;
|
|
68311
68358
|
} catch (error) {
|
|
68312
68359
|
logWarning("Failed to hydrate PATH from the user environment.", error);
|
|
@@ -92194,306 +92241,6 @@ var AnalyticsService = class AnalyticsService extends require_Schema$1.Service()
|
|
|
92194
92241
|
});
|
|
92195
92242
|
};
|
|
92196
92243
|
//#endregion
|
|
92197
|
-
//#region src/cmmdSync/CmmdSyncClient.ts
|
|
92198
|
-
const SYNC_TIMEOUT_MS = 1e4;
|
|
92199
|
-
var CmmdSyncError = class extends require_Schema$1.TaggedError("CmmdSyncError") {};
|
|
92200
|
-
var CmmdSyncClient = class extends require_Schema$1.Service()("forge/cmmdSync/CmmdSyncClient") {};
|
|
92201
|
-
const CmmdSyncClientLive = require_Schema$1.effect(CmmdSyncClient, require_Schema$1.gen(function* () {
|
|
92202
|
-
const serverSettings = yield* ServerSettingsService;
|
|
92203
|
-
const syncTurn = (payload) => require_Schema$1.gen(function* () {
|
|
92204
|
-
const { baseUrl, apiKey } = (yield* serverSettings.getSettings.pipe(require_Schema$1.orDie)).providers.cmmd;
|
|
92205
|
-
const url = `${baseUrl.replace(/\/$/, "")}/api/forge/turns`;
|
|
92206
|
-
const headers = { "Content-Type": "application/json" };
|
|
92207
|
-
if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
|
|
92208
|
-
const response = yield* require_Schema$1.tryPromise({
|
|
92209
|
-
try: () => fetch(url, {
|
|
92210
|
-
method: "POST",
|
|
92211
|
-
headers,
|
|
92212
|
-
body: JSON.stringify(payload),
|
|
92213
|
-
signal: AbortSignal.timeout(SYNC_TIMEOUT_MS)
|
|
92214
|
-
}),
|
|
92215
|
-
catch: (cause) => new CmmdSyncError({
|
|
92216
|
-
statusCode: 0,
|
|
92217
|
-
body: String(cause)
|
|
92218
|
-
})
|
|
92219
|
-
});
|
|
92220
|
-
const body = yield* require_Schema$1.tryPromise({
|
|
92221
|
-
try: () => response.text(),
|
|
92222
|
-
catch: (cause) => new CmmdSyncError({
|
|
92223
|
-
statusCode: response.status,
|
|
92224
|
-
body: String(cause)
|
|
92225
|
-
})
|
|
92226
|
-
});
|
|
92227
|
-
if (!response.ok) return yield* new CmmdSyncError({
|
|
92228
|
-
statusCode: response.status,
|
|
92229
|
-
body
|
|
92230
|
-
});
|
|
92231
|
-
return yield* require_Schema$1.try_({
|
|
92232
|
-
try: () => JSON.parse(body),
|
|
92233
|
-
catch: (cause) => new CmmdSyncError({
|
|
92234
|
-
statusCode: 200,
|
|
92235
|
-
body: String(cause)
|
|
92236
|
-
})
|
|
92237
|
-
});
|
|
92238
|
-
});
|
|
92239
|
-
return { syncTurn };
|
|
92240
|
-
}));
|
|
92241
|
-
//#endregion
|
|
92242
|
-
//#region src/persistence/Services/ProjectionProjects.ts
|
|
92243
|
-
/**
|
|
92244
|
-
* ProjectionProjectRepository - Projection repository interface for projects.
|
|
92245
|
-
*
|
|
92246
|
-
* Owns persistence operations for project rows in the orchestration projection
|
|
92247
|
-
* read model.
|
|
92248
|
-
*
|
|
92249
|
-
* @module ProjectionProjectRepository
|
|
92250
|
-
*/
|
|
92251
|
-
const ProjectionProject = require_Schema$1.Struct({
|
|
92252
|
-
projectId: ProjectId,
|
|
92253
|
-
title: require_Schema$1.String,
|
|
92254
|
-
workspaceRoot: require_Schema$1.String,
|
|
92255
|
-
defaultModelSelection: require_Schema$1.NullOr(ModelSelection),
|
|
92256
|
-
defaultThreadEnvMode: require_Schema$1.NullOr(ThreadEnvMode),
|
|
92257
|
-
scripts: require_Schema$1.ArraySchema(ProjectScript),
|
|
92258
|
-
createdAt: IsoDateTime,
|
|
92259
|
-
updatedAt: IsoDateTime,
|
|
92260
|
-
deletedAt: require_Schema$1.NullOr(IsoDateTime)
|
|
92261
|
-
});
|
|
92262
|
-
const GetProjectionProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
92263
|
-
const DeleteProjectionProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
92264
|
-
/**
|
|
92265
|
-
* ProjectionProjectRepository - Service tag for project projection persistence.
|
|
92266
|
-
*/
|
|
92267
|
-
var ProjectionProjectRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {};
|
|
92268
|
-
//#endregion
|
|
92269
|
-
//#region src/persistence/Services/ProjectionThreadMessages.ts
|
|
92270
|
-
/**
|
|
92271
|
-
* ProjectionThreadMessageRepository - Projection repository interface for messages.
|
|
92272
|
-
*
|
|
92273
|
-
* Owns persistence operations for projected thread messages rendered in the
|
|
92274
|
-
* orchestration read model.
|
|
92275
|
-
*
|
|
92276
|
-
* @module ProjectionThreadMessageRepository
|
|
92277
|
-
*/
|
|
92278
|
-
const ProjectionThreadMessage = require_Schema$1.Struct({
|
|
92279
|
-
messageId: MessageId,
|
|
92280
|
-
threadId: ThreadId,
|
|
92281
|
-
turnId: require_Schema$1.NullOr(TurnId),
|
|
92282
|
-
role: OrchestrationMessageRole,
|
|
92283
|
-
text: require_Schema$1.String,
|
|
92284
|
-
attachments: require_Schema$1.optional(require_Schema$1.ArraySchema(ChatAttachment)),
|
|
92285
|
-
isStreaming: require_Schema$1.Boolean,
|
|
92286
|
-
createdAt: IsoDateTime,
|
|
92287
|
-
updatedAt: IsoDateTime
|
|
92288
|
-
});
|
|
92289
|
-
const ListProjectionThreadMessagesInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92290
|
-
const GetProjectionThreadMessageInput = require_Schema$1.Struct({ messageId: MessageId });
|
|
92291
|
-
const DeleteProjectionThreadMessagesInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92292
|
-
/**
|
|
92293
|
-
* ProjectionThreadMessageRepository - Service tag for message projection persistence.
|
|
92294
|
-
*/
|
|
92295
|
-
var ProjectionThreadMessageRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreadMessages/ProjectionThreadMessageRepository") {};
|
|
92296
|
-
//#endregion
|
|
92297
|
-
//#region src/persistence/Services/ProjectionThreads.ts
|
|
92298
|
-
/**
|
|
92299
|
-
* ProjectionThreadRepository - Projection repository interface for threads.
|
|
92300
|
-
*
|
|
92301
|
-
* Owns persistence operations for projected thread records in the
|
|
92302
|
-
* orchestration read model.
|
|
92303
|
-
*
|
|
92304
|
-
* @module ProjectionThreadRepository
|
|
92305
|
-
*/
|
|
92306
|
-
const ProjectionThread = require_Schema$1.Struct({
|
|
92307
|
-
threadId: ThreadId,
|
|
92308
|
-
projectId: ProjectId,
|
|
92309
|
-
title: require_Schema$1.String,
|
|
92310
|
-
modelSelection: ModelSelection,
|
|
92311
|
-
runtimeMode: RuntimeMode$1,
|
|
92312
|
-
interactionMode: ProviderInteractionMode,
|
|
92313
|
-
branch: require_Schema$1.NullOr(require_Schema$1.String),
|
|
92314
|
-
worktreePath: require_Schema$1.NullOr(require_Schema$1.String),
|
|
92315
|
-
latestTurnId: require_Schema$1.NullOr(TurnId),
|
|
92316
|
-
createdAt: IsoDateTime,
|
|
92317
|
-
updatedAt: IsoDateTime,
|
|
92318
|
-
archivedAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92319
|
-
settledAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92320
|
-
settledOverride: require_Schema$1.NullOr(require_Schema$1.Literals(["settled", "active"])),
|
|
92321
|
-
latestUserMessageAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92322
|
-
pendingApprovalCount: NonNegativeInt,
|
|
92323
|
-
pendingUserInputCount: NonNegativeInt,
|
|
92324
|
-
hasActionableProposedPlan: NonNegativeInt,
|
|
92325
|
-
deletedAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92326
|
-
kind: ThreadKind.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("master"))),
|
|
92327
|
-
parentThreadId: require_Schema$1.NullOr(ThreadId).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92328
|
-
anchorKind: CmmdAnchorKind.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("scratch"))),
|
|
92329
|
-
anchorCmmdId: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92330
|
-
linkedPullRequest: require_Schema$1.optionalKey(require_Schema$1.NullOr(LinkedPullRequest)),
|
|
92331
|
-
status: ThreadStatus.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("idle"))),
|
|
92332
|
-
workerRole: require_Schema$1.NullOr(WorkerRole).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92333
|
-
goal: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92334
|
-
titleRegeneration: require_Schema$1.NullOr(ThreadTitleRegeneration).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92335
|
-
pendingAutoCreatePrompt: require_Schema$1.optional(require_Schema$1.NullOr(AutoCreateTaskPrompt)).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92336
|
-
rateLimitStatus: require_Schema$1.optional(require_Schema$1.ArraySchema(ThreadProviderRateLimitStatus)).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed([])))
|
|
92337
|
-
});
|
|
92338
|
-
const GetProjectionThreadInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92339
|
-
const DeleteProjectionThreadInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92340
|
-
const ListProjectionThreadsByProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
92341
|
-
/**
|
|
92342
|
-
* ProjectionThreadRepository - Service tag for thread projection persistence.
|
|
92343
|
-
*/
|
|
92344
|
-
var ProjectionThreadRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreads/ProjectionThreadRepository") {};
|
|
92345
|
-
//#endregion
|
|
92346
|
-
//#region src/cmmdSync/TurnSerializer.ts
|
|
92347
|
-
var TurnSerializer = class extends require_Schema$1.Service()("forge/cmmdSync/TurnSerializer") {};
|
|
92348
|
-
const TurnSerializerLive = require_Schema$1.effect(TurnSerializer, require_Schema$1.gen(function* () {
|
|
92349
|
-
const threadRepo = yield* ProjectionThreadRepository;
|
|
92350
|
-
const projectRepo = yield* ProjectionProjectRepository;
|
|
92351
|
-
const messageRepo = yield* ProjectionThreadMessageRepository;
|
|
92352
|
-
const buildPayload = (threadId, turnId, completedAt) => require_Schema$1.gen(function* () {
|
|
92353
|
-
const maybeThread = yield* threadRepo.getById({ threadId }).pipe(require_Schema$1.orDie);
|
|
92354
|
-
if (require_Schema$1.isNone(maybeThread)) return yield* require_Schema$1.die(/* @__PURE__ */ new Error(`Thread ${threadId} not found for CMMD sync`));
|
|
92355
|
-
const thread = maybeThread.value;
|
|
92356
|
-
const maybeProject = yield* projectRepo.getById({ projectId: thread.projectId }).pipe(require_Schema$1.orDie);
|
|
92357
|
-
if (require_Schema$1.isNone(maybeProject)) return yield* require_Schema$1.die(/* @__PURE__ */ new Error(`Project ${thread.projectId} not found for CMMD sync`));
|
|
92358
|
-
const project = maybeProject.value;
|
|
92359
|
-
const turnMsgs = (yield* messageRepo.listByThreadId({ threadId }).pipe(require_Schema$1.orDie)).filter((m) => m.turnId === turnId);
|
|
92360
|
-
const userMsg = turnMsgs.find((m) => m.role === "user")?.text ?? "";
|
|
92361
|
-
const assistantMsg = turnMsgs.find((m) => m.role === "assistant")?.text ?? "";
|
|
92362
|
-
const startedAt = turnMsgs.find((m) => m.role === "user")?.createdAt ?? completedAt;
|
|
92363
|
-
return {
|
|
92364
|
-
forgeSessionId: threadId,
|
|
92365
|
-
forgeTurnId: turnId,
|
|
92366
|
-
workspaceId: null,
|
|
92367
|
-
userId: null,
|
|
92368
|
-
projectPath: project.workspaceRoot,
|
|
92369
|
-
projectTitle: project.title,
|
|
92370
|
-
threadTitle: thread.title,
|
|
92371
|
-
model: thread.modelSelection.model,
|
|
92372
|
-
branch: thread.branch,
|
|
92373
|
-
userMessage: userMsg,
|
|
92374
|
-
assistantMessage: assistantMsg,
|
|
92375
|
-
toolCalls: [],
|
|
92376
|
-
status: "complete",
|
|
92377
|
-
startedAt,
|
|
92378
|
-
completedAt,
|
|
92379
|
-
forgeVersion: version$1
|
|
92380
|
-
};
|
|
92381
|
-
});
|
|
92382
|
-
return { buildPayload };
|
|
92383
|
-
}));
|
|
92384
|
-
//#endregion
|
|
92385
|
-
//#region src/cmmdSync/TurnCompletionWatcher.ts
|
|
92386
|
-
var TurnCompletionWatcher = class extends require_Schema$1.Service()("forge/cmmdSync/TurnCompletionWatcher") {};
|
|
92387
|
-
const isTurnDiffCompleted = (e) => e.type === "thread.turn-diff-completed";
|
|
92388
|
-
const TurnCompletionWatcherLive = require_Schema$1.effect(TurnCompletionWatcher, require_Schema$1.gen(function* () {
|
|
92389
|
-
const engine = yield* OrchestrationEngineService;
|
|
92390
|
-
const serializer = yield* TurnSerializer;
|
|
92391
|
-
const syncClient = yield* CmmdSyncClient;
|
|
92392
|
-
const serverSettings = yield* ServerSettingsService;
|
|
92393
|
-
const sql = yield* require_SqlError.SqlClient;
|
|
92394
|
-
const enqueueForRetry = (threadId, turnId, payloadJson) => sql`
|
|
92395
|
-
INSERT INTO cmmd_session_sync_queue
|
|
92396
|
-
(thread_id, turn_id, payload_json, status, attempt_count, created_at)
|
|
92397
|
-
VALUES
|
|
92398
|
-
(${threadId}, ${turnId}, ${payloadJson}, 'pending', 0, ${(/* @__PURE__ */ new Date()).toISOString()})
|
|
92399
|
-
ON CONFLICT (turn_id) DO NOTHING
|
|
92400
|
-
`.pipe(require_Schema$1.orDie);
|
|
92401
|
-
const processEvent = (event) => require_Schema$1.gen(function* () {
|
|
92402
|
-
const settings = yield* serverSettings.getSettings.pipe(require_Schema$1.orDie);
|
|
92403
|
-
if (!settings.providers.cmmd.enabled || !settings.providers.cmmd.apiKey) return;
|
|
92404
|
-
const { threadId, turnId, completedAt } = event.payload;
|
|
92405
|
-
const turnPayload = yield* serializer.buildPayload(threadId, turnId, completedAt);
|
|
92406
|
-
yield* syncClient.syncTurn(turnPayload).pipe(require_Schema$1.catch_((err) => require_Schema$1.gen(function* () {
|
|
92407
|
-
yield* require_Schema$1.logWarning("CMMD sync: push failed, queuing for retry", {
|
|
92408
|
-
threadId,
|
|
92409
|
-
turnId,
|
|
92410
|
-
statusCode: err.statusCode
|
|
92411
|
-
});
|
|
92412
|
-
if (err.statusCode === 0 || err.statusCode >= 500) yield* enqueueForRetry(threadId, turnId, JSON.stringify(turnPayload));
|
|
92413
|
-
})));
|
|
92414
|
-
}).pipe(require_Schema$1.catchCause((cause) => require_Schema$1.logError("CMMD sync: unhandled error in turn watcher", {
|
|
92415
|
-
cause,
|
|
92416
|
-
threadId: event.payload.threadId,
|
|
92417
|
-
turnId: event.payload.turnId
|
|
92418
|
-
})));
|
|
92419
|
-
const start = () => engine.streamDomainEvents.pipe(require_Path.filter(isTurnDiffCompleted), require_Path.mapEffect(processEvent, { concurrency: 1 }), require_Path.runDrain, require_Schema$1.forkScoped, require_Schema$1.asVoid);
|
|
92420
|
-
return { start };
|
|
92421
|
-
}));
|
|
92422
|
-
//#endregion
|
|
92423
|
-
//#region src/cmmdSync/SyncWorker.ts
|
|
92424
|
-
const MAX_ATTEMPTS = 5;
|
|
92425
|
-
const DRAIN_BATCH = 10;
|
|
92426
|
-
var CmmdSyncWorker = class extends require_Schema$1.Service()("forge/cmmdSync/CmmdSyncWorker") {};
|
|
92427
|
-
/**
|
|
92428
|
-
* Recovers rows that were set to 'in_flight' before a server crash.
|
|
92429
|
-
*
|
|
92430
|
-
* Exported so regression tests can call it directly through the test's SqlClient
|
|
92431
|
-
* (same ambient context) while verifying the exact production SQL path.
|
|
92432
|
-
* `start()` delegates to this constant.
|
|
92433
|
-
*/
|
|
92434
|
-
const resetOrphanedInFlightRows = require_Schema$1.gen(function* () {
|
|
92435
|
-
yield* (yield* require_SqlError.SqlClient)`
|
|
92436
|
-
UPDATE cmmd_session_sync_queue SET status = 'pending'
|
|
92437
|
-
WHERE status = 'in_flight'
|
|
92438
|
-
`.pipe(require_Schema$1.orDie);
|
|
92439
|
-
});
|
|
92440
|
-
const CmmdSyncWorkerLive = require_Schema$1.effect(CmmdSyncWorker, require_Schema$1.gen(function* () {
|
|
92441
|
-
const syncClient = yield* CmmdSyncClient;
|
|
92442
|
-
const serverSettings = yield* ServerSettingsService;
|
|
92443
|
-
const sql = yield* require_SqlError.SqlClient;
|
|
92444
|
-
const processRow = (row) => require_Schema$1.gen(function* () {
|
|
92445
|
-
yield* sql`
|
|
92446
|
-
UPDATE cmmd_session_sync_queue
|
|
92447
|
-
SET status = 'in_flight', attempt_count = attempt_count + 1, last_attempted_at = ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
92448
|
-
WHERE turn_id = ${row.turn_id}
|
|
92449
|
-
`.pipe(require_Schema$1.orDie);
|
|
92450
|
-
const payload = JSON.parse(row.payload_json);
|
|
92451
|
-
yield* syncClient.syncTurn(payload).pipe(require_Schema$1.flatMap(() => sql`DELETE FROM cmmd_session_sync_queue WHERE turn_id = ${row.turn_id}`.pipe(require_Schema$1.orDie)), require_Schema$1.catch_((err) => require_Schema$1.gen(function* () {
|
|
92452
|
-
const isClientError = err.statusCode >= 400 && err.statusCode < 500;
|
|
92453
|
-
const exhausted = row.attempt_count + 1 >= MAX_ATTEMPTS;
|
|
92454
|
-
const nextStatus = isClientError || exhausted ? "failed" : "pending";
|
|
92455
|
-
yield* sql`
|
|
92456
|
-
UPDATE cmmd_session_sync_queue
|
|
92457
|
-
SET status = ${nextStatus}
|
|
92458
|
-
WHERE turn_id = ${row.turn_id}
|
|
92459
|
-
`.pipe(require_Schema$1.orDie);
|
|
92460
|
-
if (nextStatus === "failed") yield* require_Schema$1.logWarning("CMMD sync: turn permanently failed", {
|
|
92461
|
-
turnId: row.turn_id,
|
|
92462
|
-
threadId: row.thread_id,
|
|
92463
|
-
statusCode: err.statusCode,
|
|
92464
|
-
attempts: row.attempt_count + 1
|
|
92465
|
-
});
|
|
92466
|
-
})), require_Schema$1.catchCause((cause) => require_Schema$1.gen(function* () {
|
|
92467
|
-
const nextStatus = row.attempt_count + 1 >= MAX_ATTEMPTS ? "failed" : "pending";
|
|
92468
|
-
yield* sql`
|
|
92469
|
-
UPDATE cmmd_session_sync_queue
|
|
92470
|
-
SET status = ${nextStatus}
|
|
92471
|
-
WHERE turn_id = ${row.turn_id}
|
|
92472
|
-
`.pipe(require_Schema$1.orDie);
|
|
92473
|
-
yield* require_Schema$1.logError("CMMD sync: unhandled defect in processRow", {
|
|
92474
|
-
turnId: row.turn_id,
|
|
92475
|
-
threadId: row.thread_id,
|
|
92476
|
-
cause,
|
|
92477
|
-
nextStatus
|
|
92478
|
-
});
|
|
92479
|
-
})));
|
|
92480
|
-
});
|
|
92481
|
-
const drainQueue = require_Schema$1.gen(function* () {
|
|
92482
|
-
const settings = yield* serverSettings.getSettings.pipe(require_Schema$1.orDie);
|
|
92483
|
-
if (!settings.providers.cmmd.enabled || !settings.providers.cmmd.apiKey) return;
|
|
92484
|
-
const rows = yield* sql`
|
|
92485
|
-
SELECT turn_id, thread_id, payload_json, attempt_count
|
|
92486
|
-
FROM cmmd_session_sync_queue
|
|
92487
|
-
WHERE status = 'pending'
|
|
92488
|
-
ORDER BY created_at ASC
|
|
92489
|
-
LIMIT ${DRAIN_BATCH}
|
|
92490
|
-
`.pipe(require_Schema$1.orDie);
|
|
92491
|
-
yield* require_Schema$1.forEach(rows, processRow, { concurrency: 1 });
|
|
92492
|
-
});
|
|
92493
|
-
const start = () => resetOrphanedInFlightRows.pipe(require_Schema$1.provideService(require_SqlError.SqlClient, sql), require_Schema$1.andThen(drainQueue.pipe(require_Schema$1.catchCause((cause) => require_Schema$1.logError("CMMD sync worker: unexpected error during drain", { cause })), require_Schema$1.repeat(require_Schema$1.spaced("30 seconds")), require_Schema$1.forkScoped, require_Schema$1.asVoid)));
|
|
92494
|
-
return { start };
|
|
92495
|
-
}));
|
|
92496
|
-
//#endregion
|
|
92497
92244
|
//#region src/runtimeReplication/Services/RuntimeReplication.ts
|
|
92498
92245
|
var RuntimeReplication = class extends require_Schema$1.Service()("forge/runtimeReplication/Services/RuntimeReplication") {};
|
|
92499
92246
|
//#endregion
|
|
@@ -92962,8 +92709,33 @@ const replicaEventKinds = new Set([
|
|
|
92962
92709
|
"activity_summary",
|
|
92963
92710
|
"turn_status",
|
|
92964
92711
|
"error_summary",
|
|
92965
|
-
"tool_call"
|
|
92712
|
+
"tool_call",
|
|
92713
|
+
"turn_usage"
|
|
92966
92714
|
]);
|
|
92715
|
+
const turnUsageTokenKeys = [
|
|
92716
|
+
"uncachedInputTokens",
|
|
92717
|
+
"cachedInputTokens",
|
|
92718
|
+
"cacheCreationTokens",
|
|
92719
|
+
"outputTokens",
|
|
92720
|
+
"reasoningTokens"
|
|
92721
|
+
];
|
|
92722
|
+
function isNonNegativeInt(value) {
|
|
92723
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
92724
|
+
}
|
|
92725
|
+
/** `usage` is null for an Unreported turn, otherwise exactly the five buckets. */
|
|
92726
|
+
function isValidTurnUsageTokens(value) {
|
|
92727
|
+
if (value === null) return true;
|
|
92728
|
+
if (!isRecord$16(value)) return false;
|
|
92729
|
+
return turnUsageTokenKeys.every((key) => isNonNegativeInt(value[key])) && Object.keys(value).every((key) => turnUsageTokenKeys.includes(key));
|
|
92730
|
+
}
|
|
92731
|
+
/** A turn_usage row: no text, no status, and its record in `payload`. */
|
|
92732
|
+
function hasValidTurnUsagePayload(value) {
|
|
92733
|
+
const payload = value.payload;
|
|
92734
|
+
return value.text === null && value.status === null && typeof value.turnId === "string" && value.turnId.length > 0 && isRecord$16(payload) && isNonBlankString(payload.provider) && isNonBlankString(payload.model) && "usage" in payload && isValidTurnUsageTokens(payload.usage);
|
|
92735
|
+
}
|
|
92736
|
+
function hasValidEventTurn(value) {
|
|
92737
|
+
return !("turnId" in value) || value.turnId === null || isNonBlankString(value.turnId);
|
|
92738
|
+
}
|
|
92967
92739
|
const replicaTurnStatuses$1 = new Set([
|
|
92968
92740
|
"pending",
|
|
92969
92741
|
"running",
|
|
@@ -92983,9 +92755,10 @@ function hasEventPayloadKey(value) {
|
|
|
92983
92755
|
return value.kind !== "tool_call" || "payload" in value;
|
|
92984
92756
|
}
|
|
92985
92757
|
function hasValidEventFields(value) {
|
|
92986
|
-
return hasValidEventSequence(value.sequence) && isNonBlankString(value.eventId) && replicaEventKinds.has(value.kind) && nullableString(value.text) && hasValidEventStatus(value) && hasEventPayloadKey(value) && isIsoDateTime(value.occurredAt);
|
|
92758
|
+
return hasValidEventSequence(value.sequence) && isNonBlankString(value.eventId) && replicaEventKinds.has(value.kind) && hasValidEventTurn(value) && nullableString(value.text) && hasValidEventStatus(value) && hasEventPayloadKey(value) && isIsoDateTime(value.occurredAt);
|
|
92987
92759
|
}
|
|
92988
92760
|
function hasValidEventPayload(value) {
|
|
92761
|
+
if (value.kind === "turn_usage") return hasValidTurnUsagePayload(value);
|
|
92989
92762
|
if (value.kind === "turn_status") return value.text === null && value.status !== null;
|
|
92990
92763
|
if (value.kind === "tool_call") return isNonBlankString(value.text) && value.status !== null;
|
|
92991
92764
|
return isNonBlankString(value.text) && value.status === null;
|
|
@@ -93092,28 +92865,41 @@ const REPLICA_MESSAGE_ID_PREFIX = "replica-source-v1:";
|
|
|
93092
92865
|
function isReservedReplicaSourceMessageId(value) {
|
|
93093
92866
|
return value.startsWith(REPLICA_MESSAGE_ID_PREFIX);
|
|
93094
92867
|
}
|
|
92868
|
+
/**
|
|
92869
|
+
* A hydrated message keeps its CMMD turn inside its id rather than in the
|
|
92870
|
+
* projection's `turnId`: `retainThreadMessagesAfterRevert` drops messages whose
|
|
92871
|
+
* turn is not among the local checkpoints, and a hydrated thread has none, so
|
|
92872
|
+
* a later local revert would erase recovered history. The id is the one slot
|
|
92873
|
+
* the serializer can read back without touching revert semantics.
|
|
92874
|
+
*/
|
|
93095
92875
|
function encodeReplicaSourceMessageId(input) {
|
|
93096
|
-
|
|
92876
|
+
const base = `${REPLICA_MESSAGE_ID_PREFIX}${input.sequence}:${Buffer.from(input.scope).toString("base64url")}:${Buffer.from(input.eventId).toString("base64url")}`;
|
|
92877
|
+
return input.turnId ? `${base}:${Buffer.from(input.turnId).toString("base64url")}` : base;
|
|
92878
|
+
}
|
|
92879
|
+
/** Decodes one base64url segment, or null when it does not round-trip exactly. */
|
|
92880
|
+
function decodeExactSegment(encoded) {
|
|
92881
|
+
const decoded = Buffer.from(encoded, "base64url").toString("utf8");
|
|
92882
|
+
return decoded.length > 0 && Buffer.from(decoded).toString("base64url") === encoded ? decoded : null;
|
|
93097
92883
|
}
|
|
93098
92884
|
function decodeReplicaSourceMessageId(value) {
|
|
93099
92885
|
if (!value.startsWith(REPLICA_MESSAGE_ID_PREFIX)) return null;
|
|
93100
|
-
const
|
|
93101
|
-
|
|
93102
|
-
|
|
93103
|
-
const sequence = Number(value.slice(18, sequenceSeparator));
|
|
92886
|
+
const [sequenceText, encodedScope, encodedEventId, encodedTurnId, ...rest] = value.slice(18).split(":");
|
|
92887
|
+
if (rest.length > 0 || encodedScope === void 0 || encodedEventId === void 0) return null;
|
|
92888
|
+
const sequence = Number(sequenceText);
|
|
93104
92889
|
if (!Number.isSafeInteger(sequence) || sequence <= 0) return null;
|
|
93105
|
-
|
|
93106
|
-
|
|
93107
|
-
|
|
93108
|
-
|
|
93109
|
-
|
|
93110
|
-
|
|
93111
|
-
|
|
93112
|
-
|
|
93113
|
-
|
|
93114
|
-
|
|
93115
|
-
|
|
93116
|
-
|
|
92890
|
+
const scope = decodeExactSegment(encodedScope);
|
|
92891
|
+
const eventId = decodeExactSegment(encodedEventId);
|
|
92892
|
+
if (scope === null || eventId === null) return null;
|
|
92893
|
+
if (encodedTurnId === void 0) return {
|
|
92894
|
+
sequence,
|
|
92895
|
+
eventId
|
|
92896
|
+
};
|
|
92897
|
+
const turnId = decodeExactSegment(encodedTurnId);
|
|
92898
|
+
return turnId === null ? null : {
|
|
92899
|
+
sequence,
|
|
92900
|
+
eventId,
|
|
92901
|
+
turnId
|
|
92902
|
+
};
|
|
93117
92903
|
}
|
|
93118
92904
|
var RuntimeThreadHistoryConflict = class extends Error {
|
|
93119
92905
|
constructor(message) {
|
|
@@ -93131,22 +92917,50 @@ function runtimeThreadFinalGenerationId(runtimeId, streamKey, events) {
|
|
|
93131
92917
|
const projectionHash = node_crypto.createHash("sha256").update(JSON.stringify(events)).digest("base64url");
|
|
93132
92918
|
return `${runtimeThreadGenerationId(runtimeId, streamKey)}:final:${projectionHash}`;
|
|
93133
92919
|
}
|
|
92920
|
+
function canonicalKindFields(event) {
|
|
92921
|
+
switch (event.kind) {
|
|
92922
|
+
case "user_message":
|
|
92923
|
+
case "assistant_message": return { text: event.text };
|
|
92924
|
+
case "activity_summary":
|
|
92925
|
+
case "error_summary": return { summary: event.summary };
|
|
92926
|
+
case "turn_status": return { status: event.status };
|
|
92927
|
+
case "tool_call": return {
|
|
92928
|
+
summary: event.summary,
|
|
92929
|
+
status: event.status,
|
|
92930
|
+
...event.payload !== void 0 ? { payload: event.payload } : {}
|
|
92931
|
+
};
|
|
92932
|
+
case "turn_usage": return canonicalTurnUsageFields(event);
|
|
92933
|
+
}
|
|
92934
|
+
}
|
|
92935
|
+
/**
|
|
92936
|
+
* CMMD's forge-runtime-thread-replication-protocol.ts builds this object in
|
|
92937
|
+
* the same order and rejects a batch whose hash differs. `turnId` comes after
|
|
92938
|
+
* every kind-specific field so an event sent without one hashes byte for byte
|
|
92939
|
+
* as it did before recorded turns existed.
|
|
92940
|
+
*/
|
|
93134
92941
|
function canonicalEventPayload(event) {
|
|
93135
92942
|
return JSON.stringify({
|
|
93136
92943
|
sequence: event.sequence,
|
|
93137
92944
|
eventId: event.eventId,
|
|
93138
92945
|
occurredAt: event.occurredAt,
|
|
93139
92946
|
kind: event.kind,
|
|
93140
|
-
...event
|
|
93141
|
-
...event.
|
|
93142
|
-
...event.kind === "turn_status" ? { status: event.status } : {},
|
|
93143
|
-
...event.kind === "tool_call" ? {
|
|
93144
|
-
summary: event.summary,
|
|
93145
|
-
status: event.status,
|
|
93146
|
-
...event.payload !== void 0 ? { payload: event.payload } : {}
|
|
93147
|
-
} : {}
|
|
92947
|
+
...canonicalKindFields(event),
|
|
92948
|
+
...event.turnId !== void 0 ? { turnId: event.turnId } : {}
|
|
93148
92949
|
});
|
|
93149
92950
|
}
|
|
92951
|
+
function canonicalTurnUsageFields(event) {
|
|
92952
|
+
return {
|
|
92953
|
+
provider: event.provider,
|
|
92954
|
+
model: event.model,
|
|
92955
|
+
usage: event.usage === null ? null : {
|
|
92956
|
+
uncachedInputTokens: event.usage.uncachedInputTokens,
|
|
92957
|
+
cachedInputTokens: event.usage.cachedInputTokens,
|
|
92958
|
+
cacheCreationTokens: event.usage.cacheCreationTokens,
|
|
92959
|
+
outputTokens: event.usage.outputTokens,
|
|
92960
|
+
reasoningTokens: event.usage.reasoningTokens
|
|
92961
|
+
}
|
|
92962
|
+
};
|
|
92963
|
+
}
|
|
93150
92964
|
function hashRuntimeThreadEvent(event) {
|
|
93151
92965
|
return sha256$3(canonicalEventPayload(event));
|
|
93152
92966
|
}
|
|
@@ -93267,7 +93081,8 @@ function replicaMessage(runtimeId, generationId, event) {
|
|
|
93267
93081
|
id: MessageId.make(encodeReplicaSourceMessageId({
|
|
93268
93082
|
sequence: event.sequence,
|
|
93269
93083
|
scope: stableReplicaDigest(runtimeId, generationId),
|
|
93270
|
-
eventId: event.eventId
|
|
93084
|
+
eventId: event.eventId,
|
|
93085
|
+
turnId: event.turnId ?? null
|
|
93271
93086
|
})),
|
|
93272
93087
|
role: event.kind === "user_message" ? "user" : "assistant",
|
|
93273
93088
|
text: event.text ?? "",
|
|
@@ -93277,11 +93092,33 @@ function replicaMessage(runtimeId, generationId, event) {
|
|
|
93277
93092
|
updatedAt: event.occurredAt
|
|
93278
93093
|
};
|
|
93279
93094
|
}
|
|
93280
|
-
function
|
|
93281
|
-
const
|
|
93095
|
+
function replicaTurnUsage(event) {
|
|
93096
|
+
const payload = event.payload;
|
|
93097
|
+
return {
|
|
93098
|
+
eventId: event.eventId,
|
|
93099
|
+
occurredAt: event.occurredAt,
|
|
93100
|
+
kind: "turn_usage",
|
|
93101
|
+
turnId: event.turnId,
|
|
93102
|
+
provider: payload.provider,
|
|
93103
|
+
model: payload.model,
|
|
93104
|
+
usage: payload.usage === null ? null : {
|
|
93105
|
+
uncachedInputTokens: payload.usage.uncachedInputTokens,
|
|
93106
|
+
cachedInputTokens: payload.usage.cachedInputTokens,
|
|
93107
|
+
cacheCreationTokens: payload.usage.cacheCreationTokens,
|
|
93108
|
+
outputTokens: payload.usage.outputTokens,
|
|
93109
|
+
reasoningTokens: payload.usage.reasoningTokens
|
|
93110
|
+
}
|
|
93111
|
+
};
|
|
93112
|
+
}
|
|
93113
|
+
function replicaEventBase(event) {
|
|
93114
|
+
const turn = typeof event.turnId === "string" ? { turnId: event.turnId } : {};
|
|
93115
|
+
return {
|
|
93282
93116
|
eventId: event.eventId,
|
|
93283
|
-
occurredAt: event.occurredAt
|
|
93117
|
+
occurredAt: event.occurredAt,
|
|
93118
|
+
...turn
|
|
93284
93119
|
};
|
|
93120
|
+
}
|
|
93121
|
+
function replicaTextEvent(event, base) {
|
|
93285
93122
|
switch (event.kind) {
|
|
93286
93123
|
case "user_message":
|
|
93287
93124
|
case "assistant_message": return {
|
|
@@ -93295,31 +93132,50 @@ function replicaSourceEvent(event) {
|
|
|
93295
93132
|
kind: event.kind,
|
|
93296
93133
|
summary: event.text
|
|
93297
93134
|
};
|
|
93298
|
-
|
|
93299
|
-
...base,
|
|
93300
|
-
kind: event.kind,
|
|
93301
|
-
status: event.status
|
|
93302
|
-
};
|
|
93303
|
-
case "tool_call": return {
|
|
93304
|
-
...base,
|
|
93305
|
-
kind: event.kind,
|
|
93306
|
-
summary: event.text,
|
|
93307
|
-
status: event.status,
|
|
93308
|
-
payload: event.payload ?? void 0
|
|
93309
|
-
};
|
|
93135
|
+
default: return null;
|
|
93310
93136
|
}
|
|
93311
93137
|
}
|
|
93138
|
+
function replicaSourceEvent(event) {
|
|
93139
|
+
const base = replicaEventBase(event);
|
|
93140
|
+
const textEvent = replicaTextEvent(event, base);
|
|
93141
|
+
if (textEvent !== null) return textEvent;
|
|
93142
|
+
if (event.kind === "turn_usage") return replicaTurnUsage(event);
|
|
93143
|
+
if (event.kind === "turn_status") return {
|
|
93144
|
+
...base,
|
|
93145
|
+
kind: event.kind,
|
|
93146
|
+
status: replicaTurnStatus(event)
|
|
93147
|
+
};
|
|
93148
|
+
return {
|
|
93149
|
+
...base,
|
|
93150
|
+
kind: "tool_call",
|
|
93151
|
+
summary: event.text,
|
|
93152
|
+
status: event.status,
|
|
93153
|
+
payload: event.payload ?? void 0
|
|
93154
|
+
};
|
|
93155
|
+
}
|
|
93156
|
+
function replicaTurnStatus(event) {
|
|
93157
|
+
return event.status;
|
|
93158
|
+
}
|
|
93159
|
+
function replicaActivitySummary(event) {
|
|
93160
|
+
if (event.kind === "turn_status") return event.status ?? "unknown";
|
|
93161
|
+
if (event.kind === "turn_usage") return "Turn usage recorded";
|
|
93162
|
+
return event.text ?? "";
|
|
93163
|
+
}
|
|
93164
|
+
function replicaActivityTone(event) {
|
|
93165
|
+
const failed = event.kind === "turn_status" && event.status === "failed";
|
|
93166
|
+
return event.kind === "error_summary" || failed ? "error" : "info";
|
|
93167
|
+
}
|
|
93312
93168
|
function replicaActivity(runtimeId, generationId, event) {
|
|
93313
|
-
const summary = event.kind === "turn_status" ? event.status ?? "unknown" : event.text ?? "";
|
|
93314
93169
|
return {
|
|
93315
93170
|
id: EventId.make("replica:" + stableReplicaDigest(runtimeId, generationId, event.eventId, "activity")),
|
|
93316
|
-
tone: event
|
|
93171
|
+
tone: replicaActivityTone(event),
|
|
93317
93172
|
kind: "replica." + event.kind,
|
|
93318
|
-
summary,
|
|
93173
|
+
summary: replicaActivitySummary(event),
|
|
93319
93174
|
payload: {
|
|
93320
93175
|
sourceEventId: event.eventId,
|
|
93321
93176
|
sourceGenerationId: generationId,
|
|
93322
93177
|
sourceRuntimeId: runtimeId,
|
|
93178
|
+
sourceTurnId: typeof event.turnId === "string" ? event.turnId : null,
|
|
93323
93179
|
status: event.status,
|
|
93324
93180
|
text: event.text,
|
|
93325
93181
|
payload: event.payload
|
|
@@ -94047,8 +93903,6 @@ const makeServerRuntimeStartup = require_Schema$1.gen(function* () {
|
|
|
94047
93903
|
const serverConfig = yield* ServerConfig;
|
|
94048
93904
|
const keybindings = yield* Keybindings;
|
|
94049
93905
|
const orchestrationReactor = yield* OrchestrationReactor;
|
|
94050
|
-
const turnCompletionWatcher = yield* TurnCompletionWatcher;
|
|
94051
|
-
const cmmdSyncWorker = yield* CmmdSyncWorker;
|
|
94052
93906
|
const runtimeReplication = yield* RuntimeReplication;
|
|
94053
93907
|
const localAutomationRunReconciler = yield* LocalAutomationRunReconciler;
|
|
94054
93908
|
const agentProtocol = yield* AgentProtocolReactor;
|
|
@@ -94085,8 +93939,6 @@ const makeServerRuntimeStartup = require_Schema$1.gen(function* () {
|
|
|
94085
93939
|
yield* runStartupPhase("reactors.start", orchestrationReactor.start().pipe(require_Schema$1.provide$2(reactorScope)));
|
|
94086
93940
|
yield* require_Schema$1.logDebug("startup phase: reconciling local automation runs");
|
|
94087
93941
|
yield* runStartupPhase("local-automations.reconcile", localAutomationRunReconciler.start().pipe(require_Schema$1.provide$2(reactorScope)));
|
|
94088
|
-
yield* require_Schema$1.logDebug("startup phase: starting CMMD session sync");
|
|
94089
|
-
yield* runStartupPhase("cmmd-sync.start", require_Schema$1.all([turnCompletionWatcher.start().pipe(require_Schema$1.provide$2(reactorScope)), cmmdSyncWorker.start().pipe(require_Schema$1.provide$2(reactorScope))]).pipe(require_Schema$1.asVoid));
|
|
94090
93942
|
yield* require_Schema$1.logDebug("startup phase: starting CMMD runtime replication");
|
|
94091
93943
|
yield* runStartupPhase("runtime-replication.start", runtimeReplication.start().pipe(require_Schema$1.provide$2(reactorScope)));
|
|
94092
93944
|
yield* require_Schema$1.logDebug("startup phase: starting CMMD pipeline reactors");
|
|
@@ -94420,36 +94272,92 @@ function finiteNumber$1(value) {
|
|
|
94420
94272
|
* Entries without both an input and an output rate are dropped: a half-priced
|
|
94421
94273
|
* model would silently under-report cost, which is worse than reporting the
|
|
94422
94274
|
* model as unpriced.
|
|
94275
|
+
*
|
|
94276
|
+
* Entries keep their full normalized key. Collapsing `claude-opus-5` and
|
|
94277
|
+
* `deepinfra/anthropic/claude-opus-5` onto one key let the last one listed win,
|
|
94278
|
+
* and the DeepInfra entry carries no cache-read rate, so cached Claude tokens
|
|
94279
|
+
* were priced at the full input rate. A bare name is aliased only when no
|
|
94280
|
+
* canonical entry claims it and every qualified entry agrees on the rate.
|
|
94423
94281
|
*/
|
|
94424
94282
|
function parseRateTable(document) {
|
|
94425
94283
|
const table = /* @__PURE__ */ new Map();
|
|
94426
94284
|
if (typeof document !== "object" || document === null) return table;
|
|
94427
94285
|
for (const [name, raw] of Object.entries(document)) {
|
|
94428
|
-
|
|
94429
|
-
const
|
|
94430
|
-
|
|
94431
|
-
|
|
94432
|
-
if (input === null || output === null) continue;
|
|
94433
|
-
table.set(normalizeModelName(name), {
|
|
94434
|
-
inputCostPerToken: input,
|
|
94435
|
-
outputCostPerToken: output,
|
|
94436
|
-
cacheReadCostPerToken: finiteNumber$1(entry.cache_read_input_token_cost) ?? input,
|
|
94437
|
-
cacheCreationCostPerToken: finiteNumber$1(entry.cache_creation_input_token_cost) ?? input
|
|
94438
|
-
});
|
|
94286
|
+
const rate = readRate(raw);
|
|
94287
|
+
const key = normalizeRateKey(name);
|
|
94288
|
+
if (rate === null || key.length === 0) continue;
|
|
94289
|
+
table.set(key, rate);
|
|
94439
94290
|
}
|
|
94291
|
+
addBareNameAliases(table);
|
|
94440
94292
|
return table;
|
|
94441
94293
|
}
|
|
94294
|
+
/** One LiteLLM entry's rates, or `null` when it is not priced in full. */
|
|
94295
|
+
function readRate(raw) {
|
|
94296
|
+
if (typeof raw !== "object" || raw === null) return null;
|
|
94297
|
+
const entry = raw;
|
|
94298
|
+
const input = finiteNumber$1(entry.input_cost_per_token);
|
|
94299
|
+
const output = finiteNumber$1(entry.output_cost_per_token);
|
|
94300
|
+
if (input === null || output === null) return null;
|
|
94301
|
+
return {
|
|
94302
|
+
inputCostPerToken: input,
|
|
94303
|
+
outputCostPerToken: output,
|
|
94304
|
+
cacheReadCostPerToken: finiteNumber$1(entry.cache_read_input_token_cost) ?? input,
|
|
94305
|
+
cacheCreationCostPerToken: finiteNumber$1(entry.cache_creation_input_token_cost) ?? input
|
|
94306
|
+
};
|
|
94307
|
+
}
|
|
94442
94308
|
/**
|
|
94443
|
-
*
|
|
94309
|
+
* Lets a bare name resolve when the table only carries qualified spellings of
|
|
94310
|
+
* it, which is how a transcript's `gpt-5.6-terra` reaches `azure/gpt-5.6-terra`.
|
|
94444
94311
|
*
|
|
94445
|
-
*
|
|
94446
|
-
*
|
|
94447
|
-
* about casing.
|
|
94312
|
+
* A canonical entry always wins, and a bare name claimed at two different rates
|
|
94313
|
+
* gets no alias at all: document order is not a tiebreaker.
|
|
94448
94314
|
*/
|
|
94449
|
-
function
|
|
94450
|
-
const
|
|
94451
|
-
|
|
94452
|
-
|
|
94315
|
+
function addBareNameAliases(table) {
|
|
94316
|
+
for (const [alias, rate] of bareNameAliasCandidates(table)) if (rate !== null) table.set(alias, rate);
|
|
94317
|
+
}
|
|
94318
|
+
/** The bare name `key` could stand in for, or `null` when it cannot. */
|
|
94319
|
+
function aliasableBareName(table, key) {
|
|
94320
|
+
const alias = bareModelName(key);
|
|
94321
|
+
if (alias.length === 0 || alias === key) return null;
|
|
94322
|
+
return table.has(alias) ? null : alias;
|
|
94323
|
+
}
|
|
94324
|
+
/** Bare names to alias, mapped to `null` where the qualified rates disagree. */
|
|
94325
|
+
function bareNameAliasCandidates(table) {
|
|
94326
|
+
const candidates = /* @__PURE__ */ new Map();
|
|
94327
|
+
for (const [key, rate] of table) {
|
|
94328
|
+
const alias = aliasableBareName(table, key);
|
|
94329
|
+
if (alias === null) continue;
|
|
94330
|
+
const held = candidates.get(alias);
|
|
94331
|
+
if (held === void 0) candidates.set(alias, rate);
|
|
94332
|
+
else if (held !== null && !sameRate(held, rate)) candidates.set(alias, null);
|
|
94333
|
+
}
|
|
94334
|
+
return candidates;
|
|
94335
|
+
}
|
|
94336
|
+
function sameRate(a, b) {
|
|
94337
|
+
return a.inputCostPerToken === b.inputCostPerToken && a.outputCostPerToken === b.outputCostPerToken && a.cacheReadCostPerToken === b.cacheReadCostPerToken && a.cacheCreationCostPerToken === b.cacheCreationCostPerToken;
|
|
94338
|
+
}
|
|
94339
|
+
/**
|
|
94340
|
+
* The key an entry is stored under, and the key a reported model is looked up
|
|
94341
|
+
* by. Trimmed and lowercased only: transcripts are inconsistent about casing,
|
|
94342
|
+
* but a `provider/` prefix names a different row and must survive.
|
|
94343
|
+
*/
|
|
94344
|
+
function normalizeRateKey(model) {
|
|
94345
|
+
return model.trim().toLowerCase();
|
|
94346
|
+
}
|
|
94347
|
+
/** The key with any `provider/` prefix removed. */
|
|
94348
|
+
function bareModelName(key) {
|
|
94349
|
+
const slash = key.lastIndexOf("/");
|
|
94350
|
+
return slash === -1 ? key : key.slice(slash + 1);
|
|
94351
|
+
}
|
|
94352
|
+
/**
|
|
94353
|
+
* Drops a bracketed variant suffix such as `claude-opus-5[1m]`, which Claude
|
|
94354
|
+
* Code writes for the 1M context tier. The rate table only knows the base name,
|
|
94355
|
+
* and we price at the base tier anyway, so a turn on the wide-context tier
|
|
94356
|
+
* would otherwise come back unpriced.
|
|
94357
|
+
*/
|
|
94358
|
+
function stripVariantSuffix(key) {
|
|
94359
|
+
const bracket = key.indexOf("[");
|
|
94360
|
+
return bracket === -1 ? key : key.slice(0, bracket);
|
|
94453
94361
|
}
|
|
94454
94362
|
/**
|
|
94455
94363
|
* Models we never price, regardless of the table.
|
|
@@ -94467,9 +94375,10 @@ const UNPRICEABLE_MODELS = new Set([
|
|
|
94467
94375
|
"fable"
|
|
94468
94376
|
]);
|
|
94469
94377
|
function lookupRate(table, model) {
|
|
94470
|
-
const
|
|
94471
|
-
|
|
94472
|
-
|
|
94378
|
+
const key = stripVariantSuffix(normalizeRateKey(model));
|
|
94379
|
+
const bareName = bareModelName(key);
|
|
94380
|
+
if (bareName.length === 0 || UNPRICEABLE_MODELS.has(bareName)) return null;
|
|
94381
|
+
return table.get(key) ?? null;
|
|
94473
94382
|
}
|
|
94474
94383
|
/**
|
|
94475
94384
|
* Prices a bucket's tokens.
|
|
@@ -94756,7 +94665,15 @@ async function readTranscriptRecords(filePath, provider) {
|
|
|
94756
94665
|
}
|
|
94757
94666
|
//#endregion
|
|
94758
94667
|
//#region src/usage/usageScanCache.ts
|
|
94759
|
-
|
|
94668
|
+
/**
|
|
94669
|
+
* Bumped whenever cached records could differ from what a fresh parse produces.
|
|
94670
|
+
*
|
|
94671
|
+
* Version 1 was written before `parseCodexLine` suppressed the parent history a
|
|
94672
|
+
* forked rollout copies in, so those caches hold every copied record twice. A
|
|
94673
|
+
* transcript never changes after it is written, so a stale entry is a warm hit
|
|
94674
|
+
* forever: only the version discarding the file evicts them.
|
|
94675
|
+
*/
|
|
94676
|
+
const USAGE_SCAN_CACHE_VERSION = 2;
|
|
94760
94677
|
/** Appends `value` to `table` unless it is already there, returning its index. */
|
|
94761
94678
|
function intern(table, index, value) {
|
|
94762
94679
|
const existing = index.get(value);
|
|
@@ -94808,7 +94725,7 @@ function isStringTable(value) {
|
|
|
94808
94725
|
*
|
|
94809
94726
|
* The intern tables must be all strings: a numeric entry would pass the
|
|
94810
94727
|
* per-record undefined guard, land in a record's model, and crash the aggregate
|
|
94811
|
-
*
|
|
94728
|
+
* when that model is priced. A corrupt table rejects the whole cache.
|
|
94812
94729
|
*/
|
|
94813
94730
|
function decodeEnvelope$1(document) {
|
|
94814
94731
|
if (typeof document !== "object" || document === null) return null;
|
|
@@ -94973,7 +94890,7 @@ const RATES_CACHE_FILE = "usage-model-rates.json";
|
|
|
94973
94890
|
const SCAN_CACHE_FILE = "usage-scan-cache.json";
|
|
94974
94891
|
var UsageService = class extends require_Schema$1.Service()("forge/usage/UsageService") {};
|
|
94975
94892
|
require_Schema$1.succeed$1(UsageService, UsageService.of({ readSummary: (input) => require_Schema$1.succeed({
|
|
94976
|
-
contractVersion:
|
|
94893
|
+
contractVersion: 2,
|
|
94977
94894
|
readAt: "1970-01-01T00:00:00.000Z",
|
|
94978
94895
|
timeZone: input.timeZone,
|
|
94979
94896
|
sinceDay: input.sinceDay,
|
|
@@ -95253,7 +95170,7 @@ const make$15 = require_Schema$1.gen(function* () {
|
|
|
95253
95170
|
const readAt = yield* require_Schema$1.now;
|
|
95254
95171
|
const finishedAtMs = yield* require_Schema$1.currentTimeMillis;
|
|
95255
95172
|
return {
|
|
95256
|
-
contractVersion:
|
|
95173
|
+
contractVersion: 2,
|
|
95257
95174
|
readAt: require_Schema$1.formatIso(readAt),
|
|
95258
95175
|
timeZone: input.timeZone,
|
|
95259
95176
|
sinceDay: input.sinceDay,
|
|
@@ -108659,7 +108576,7 @@ const postgresSchemaStatements = [
|
|
|
108659
108576
|
"CREATE TABLE IF NOT EXISTS orchestration_command_receipts (\n command_id TEXT PRIMARY KEY,\n aggregate_kind TEXT NOT NULL,\n aggregate_id TEXT NOT NULL,\n accepted_at TEXT NOT NULL,\n result_sequence INTEGER NOT NULL,\n status TEXT NOT NULL,\n error TEXT\n )",
|
|
108660
108577
|
"CREATE TABLE IF NOT EXISTS checkpoint_diff_blobs (\n thread_id TEXT NOT NULL,\n from_turn_count INTEGER NOT NULL,\n to_turn_count INTEGER NOT NULL,\n diff TEXT NOT NULL,\n created_at TEXT NOT NULL,\n UNIQUE (thread_id, from_turn_count, to_turn_count)\n )",
|
|
108661
108578
|
"CREATE TABLE IF NOT EXISTS provider_session_runtime (\n thread_id TEXT PRIMARY KEY,\n provider_name TEXT NOT NULL,\n adapter_key TEXT NOT NULL,\n runtime_mode TEXT NOT NULL DEFAULT 'full-access',\n status TEXT NOT NULL,\n last_seen_at TEXT NOT NULL,\n resume_cursor_json TEXT,\n runtime_payload_json TEXT\n )",
|
|
108662
|
-
"CREATE TABLE IF NOT EXISTS projection_projects (\n project_id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n workspace_root TEXT NOT NULL,\n scripts_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT\n , default_model_selection_json TEXT, default_thread_env_mode TEXT)",
|
|
108579
|
+
"CREATE TABLE IF NOT EXISTS projection_projects (\n project_id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n workspace_root TEXT NOT NULL,\n scripts_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT\n , default_model_selection_json TEXT, default_thread_env_mode TEXT, cmmd_registration_json TEXT)",
|
|
108663
108580
|
"CREATE TABLE IF NOT EXISTS projection_threads (\n thread_id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n title TEXT NOT NULL,\n branch TEXT,\n worktree_path TEXT,\n latest_turn_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT\n , runtime_mode TEXT NOT NULL DEFAULT 'full-access', interaction_mode TEXT NOT NULL DEFAULT 'default', model_selection_json TEXT, archived_at TEXT, latest_user_message_at TEXT, pending_approval_count INTEGER NOT NULL DEFAULT 0, pending_user_input_count INTEGER NOT NULL DEFAULT 0, has_actionable_proposed_plan INTEGER NOT NULL DEFAULT 0, kind TEXT NOT NULL DEFAULT 'master', parent_thread_id TEXT, status TEXT NOT NULL DEFAULT 'idle', anchor_kind TEXT NOT NULL DEFAULT 'scratch', anchor_cmmd_id TEXT, worker_role TEXT DEFAULT NULL, goal TEXT, pending_auto_create_prompt_json TEXT, title_regeneration_json TEXT, rate_limit_status_json TEXT, linked_pull_request_json TEXT, settled_at TEXT, settled_override TEXT)",
|
|
108664
108581
|
"CREATE TABLE IF NOT EXISTS projection_thread_messages (\n message_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n turn_id TEXT,\n role TEXT NOT NULL,\n text TEXT NOT NULL,\n is_streaming INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n , attachments_json TEXT)",
|
|
108665
108582
|
"CREATE TABLE IF NOT EXISTS projection_thread_activities (\n activity_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n turn_id TEXT,\n tone TEXT NOT NULL,\n kind TEXT NOT NULL,\n summary TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n , sequence INTEGER)",
|
|
@@ -108930,7 +108847,8 @@ const postgresUpgradeMigrations = new Map([
|
|
|
108930
108847
|
thread_id TEXT NOT NULL PRIMARY KEY,
|
|
108931
108848
|
detail TEXT NOT NULL,
|
|
108932
108849
|
quarantined_at TEXT NOT NULL
|
|
108933
|
-
)`]]
|
|
108850
|
+
)`]],
|
|
108851
|
+
[74, [`ALTER TABLE projection_projects ADD COLUMN IF NOT EXISTS cmmd_registration_json TEXT`]]
|
|
108934
108852
|
]);
|
|
108935
108853
|
function requirePostgresUpgradeStatements(version) {
|
|
108936
108854
|
const statements = postgresUpgradeMigrations.get(version);
|
|
@@ -108956,15 +108874,15 @@ const runPostgresMigrations = require_Schema$1.fn("runPostgresMigrations")(funct
|
|
|
108956
108874
|
ORDER BY version DESC
|
|
108957
108875
|
LIMIT 1
|
|
108958
108876
|
`)[0]?.version ?? 0;
|
|
108959
|
-
if (currentVersion >
|
|
108877
|
+
if (currentVersion > 74) return yield* require_Schema$1.die(/* @__PURE__ */ new Error(`Forge Postgres schema ${currentVersion} is newer than server schema 74.`));
|
|
108960
108878
|
if (currentVersion === 0) {
|
|
108961
108879
|
for (const statement of postgresSchemaStatements) yield* sql.unsafe(statement);
|
|
108962
108880
|
yield* sql`
|
|
108963
108881
|
INSERT INTO forge_schema_migrations (version)
|
|
108964
|
-
VALUES (${
|
|
108882
|
+
VALUES (${74})
|
|
108965
108883
|
ON CONFLICT (version) DO NOTHING
|
|
108966
108884
|
`;
|
|
108967
|
-
} else for (let version = currentVersion + 1; version <=
|
|
108885
|
+
} else for (let version = currentVersion + 1; version <= 74; version += 1) {
|
|
108968
108886
|
const statements = yield* require_Schema$1.sync(() => requirePostgresUpgradeStatements(version));
|
|
108969
108887
|
for (const statement of statements) yield* sql.unsafe(statement);
|
|
108970
108888
|
yield* sql`
|
|
@@ -111623,6 +111541,31 @@ var _073_ReplicaThreadQuarantine_default = require_Schema$1.gen(function* () {
|
|
|
111623
111541
|
`;
|
|
111624
111542
|
});
|
|
111625
111543
|
//#endregion
|
|
111544
|
+
//#region src/persistence/Migrations/074_ProjectCmmdRegistration.ts
|
|
111545
|
+
/**
|
|
111546
|
+
* Let a Checkout say which Registration it was created from.
|
|
111547
|
+
*
|
|
111548
|
+
* A Forge Cloud Environment is per (organization, user), so one Environment
|
|
111549
|
+
* holds every Checkout its owner registered. They all report the sprite's own
|
|
111550
|
+
* root as their workspace root, and once connected they report an empty `cwd`,
|
|
111551
|
+
* so nothing about a path can tell them apart. The Registration is the durable
|
|
111552
|
+
* identity, and until now it lived only on the CMMD catalog row: the Checkout
|
|
111553
|
+
* itself could not answer which project it was.
|
|
111554
|
+
*
|
|
111555
|
+
* NULL is a Checkout that was not created from a Registration, and that is
|
|
111556
|
+
* every row written before this column existed. Those keep resolving through
|
|
111557
|
+
* the directory rules, so nothing is backfilled and no existing row is touched.
|
|
111558
|
+
*/
|
|
111559
|
+
var _074_ProjectCmmdRegistration_default = require_Schema$1.gen(function* () {
|
|
111560
|
+
const sql = yield* require_SqlError.SqlClient;
|
|
111561
|
+
if (!(yield* sql`
|
|
111562
|
+
PRAGMA table_info(projection_projects)
|
|
111563
|
+
`).some((column) => column.name === "cmmd_registration_json")) yield* sql`
|
|
111564
|
+
ALTER TABLE projection_projects
|
|
111565
|
+
ADD COLUMN cmmd_registration_json TEXT
|
|
111566
|
+
`;
|
|
111567
|
+
});
|
|
111568
|
+
//#endregion
|
|
111626
111569
|
//#region src/persistence/Migrations.ts
|
|
111627
111570
|
/**
|
|
111628
111571
|
* MigrationsLive - Migration runner with inline loader
|
|
@@ -112008,6 +111951,11 @@ const migrationEntries = [
|
|
|
112008
111951
|
73,
|
|
112009
111952
|
"ReplicaThreadQuarantine",
|
|
112010
111953
|
_073_ReplicaThreadQuarantine_default
|
|
111954
|
+
],
|
|
111955
|
+
[
|
|
111956
|
+
74,
|
|
111957
|
+
"ProjectCmmdRegistration",
|
|
111958
|
+
_074_ProjectCmmdRegistration_default
|
|
112011
111959
|
]
|
|
112012
111960
|
];
|
|
112013
111961
|
const makeMigrationLoader = (throughId) => fromRecord(Object.fromEntries(migrationEntries.filter(([id]) => throughId === void 0 || id <= throughId).map(([id, name, migration]) => [`${id}_${name}`, migration])));
|
|
@@ -204659,13 +204607,45 @@ function mapCodexThreadNameUpdatedEvent(event, canonicalThreadId, payload) {
|
|
|
204659
204607
|
}
|
|
204660
204608
|
}];
|
|
204661
204609
|
}
|
|
204610
|
+
/**
|
|
204611
|
+
* One provider call's spend, from Codex's `last_token_usage`. Codex reports
|
|
204612
|
+
* `input_tokens` inclusive of the cached and cache-write portions, so the
|
|
204613
|
+
* uncached bucket is the remainder; reasoning is reported inside output and
|
|
204614
|
+
* is surfaced separately without being added again. Mirrors
|
|
204615
|
+
* `parseCodexLine` in usage/usageTranscripts.ts so a Recorded turn and a
|
|
204616
|
+
* scanned transcript agree on the same numbers.
|
|
204617
|
+
*/
|
|
204618
|
+
function codexTurnUsageDelta(value) {
|
|
204619
|
+
const usage = asObject$2(value);
|
|
204620
|
+
const lastUsage = asObject$2(usage?.last_token_usage ?? usage?.last);
|
|
204621
|
+
if (!lastUsage) return void 0;
|
|
204622
|
+
const int = (key, alt) => Math.max(0, Math.trunc(asNumber(lastUsage[key]) ?? asNumber(lastUsage[alt]) ?? 0));
|
|
204623
|
+
const inputTokens = int("input_tokens", "inputTokens");
|
|
204624
|
+
const cachedInputTokens = int("cached_input_tokens", "cachedInputTokens");
|
|
204625
|
+
const cacheCreationTokens = int("cache_write_input_tokens", "cacheWriteInputTokens");
|
|
204626
|
+
const outputTokens = int("output_tokens", "outputTokens");
|
|
204627
|
+
if (inputTokens + cachedInputTokens + cacheCreationTokens + outputTokens === 0) return void 0;
|
|
204628
|
+
return {
|
|
204629
|
+
scope: "call-delta",
|
|
204630
|
+
uncachedInputTokens: Math.max(0, inputTokens - cachedInputTokens - cacheCreationTokens),
|
|
204631
|
+
cachedInputTokens,
|
|
204632
|
+
cacheCreationTokens,
|
|
204633
|
+
outputTokens,
|
|
204634
|
+
reasoningTokens: Math.min(outputTokens, int("reasoning_output_tokens", "reasoningOutputTokens"))
|
|
204635
|
+
};
|
|
204636
|
+
}
|
|
204662
204637
|
function mapCodexThreadTokenUsageEvent(event, canonicalThreadId, payload) {
|
|
204663
|
-
const
|
|
204638
|
+
const tokenUsage = asObject$2(payload?.tokenUsage);
|
|
204639
|
+
const normalizedUsage = normalizeCodexTokenUsage(tokenUsage ?? event.payload);
|
|
204664
204640
|
if (!normalizedUsage) return [];
|
|
204641
|
+
const turnUsage = codexTurnUsageDelta(tokenUsage ?? event.payload);
|
|
204665
204642
|
return [{
|
|
204666
204643
|
type: "thread.token-usage.updated",
|
|
204667
204644
|
...runtimeEventBase(event, canonicalThreadId),
|
|
204668
|
-
payload: {
|
|
204645
|
+
payload: {
|
|
204646
|
+
usage: normalizedUsage,
|
|
204647
|
+
...turnUsage ? { turnUsage } : {}
|
|
204648
|
+
}
|
|
204669
204649
|
}];
|
|
204670
204650
|
}
|
|
204671
204651
|
const codexThreadMethodMappers = {
|
|
@@ -207294,6 +207274,29 @@ function finiteNumberField(usage, key) {
|
|
|
207294
207274
|
function finiteNumberFieldOrZero(usage, key) {
|
|
207295
207275
|
return finiteNumberField(usage, key) ?? 0;
|
|
207296
207276
|
}
|
|
207277
|
+
/**
|
|
207278
|
+
* The whole turn's spend from the SDK result message, cache split intact.
|
|
207279
|
+
* Claude reports `input_tokens` exclusive of the cached and cache-creation
|
|
207280
|
+
* portions, so the buckets are already disjoint. Claude does not report
|
|
207281
|
+
* reasoning separately.
|
|
207282
|
+
*/
|
|
207283
|
+
function claudeTurnUsageTotal(value) {
|
|
207284
|
+
const usage = asClaudeUsageRecord(value);
|
|
207285
|
+
if (!usage) return void 0;
|
|
207286
|
+
const uncachedInputTokens = finiteNumberFieldOrZero(usage, "input_tokens");
|
|
207287
|
+
const cachedInputTokens = finiteNumberFieldOrZero(usage, "cache_read_input_tokens");
|
|
207288
|
+
const cacheCreationTokens = finiteNumberFieldOrZero(usage, "cache_creation_input_tokens");
|
|
207289
|
+
const outputTokens = finiteNumberFieldOrZero(usage, "output_tokens");
|
|
207290
|
+
if (uncachedInputTokens + cachedInputTokens + cacheCreationTokens + outputTokens <= 0) return;
|
|
207291
|
+
return {
|
|
207292
|
+
scope: "turn-total",
|
|
207293
|
+
uncachedInputTokens: Math.trunc(uncachedInputTokens),
|
|
207294
|
+
cachedInputTokens: Math.trunc(cachedInputTokens),
|
|
207295
|
+
cacheCreationTokens: Math.trunc(cacheCreationTokens),
|
|
207296
|
+
outputTokens: Math.trunc(outputTokens),
|
|
207297
|
+
reasoningTokens: 0
|
|
207298
|
+
};
|
|
207299
|
+
}
|
|
207297
207300
|
function normalizedClaudeInputTokens(usage) {
|
|
207298
207301
|
return finiteNumberFieldOrZero(usage, "input_tokens") + finiteNumberFieldOrZero(usage, "cache_creation_input_tokens") + finiteNumberFieldOrZero(usage, "cache_read_input_tokens");
|
|
207299
207302
|
}
|
|
@@ -207937,8 +207940,9 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207937
207940
|
}
|
|
207938
207941
|
});
|
|
207939
207942
|
});
|
|
207940
|
-
const emitTurnUsageUpdated = require_Schema$1.fn("emitTurnUsageUpdated")(function* (context, turnState, usageSnapshot) {
|
|
207943
|
+
const emitTurnUsageUpdated = require_Schema$1.fn("emitTurnUsageUpdated")(function* (context, turnState, usageSnapshot, result) {
|
|
207941
207944
|
if (!usageSnapshot) return;
|
|
207945
|
+
const turnUsage = claudeTurnUsageTotal(result?.usage);
|
|
207942
207946
|
const usageStamp = yield* makeEventStamp();
|
|
207943
207947
|
yield* offerRuntimeEvent({
|
|
207944
207948
|
type: "thread.token-usage.updated",
|
|
@@ -207947,7 +207951,10 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207947
207951
|
createdAt: usageStamp.createdAt,
|
|
207948
207952
|
threadId: context.session.threadId,
|
|
207949
207953
|
...turnState ? { turnId: turnState.turnId } : {},
|
|
207950
|
-
payload: {
|
|
207954
|
+
payload: {
|
|
207955
|
+
usage: usageSnapshot,
|
|
207956
|
+
...turnUsage ? { turnUsage } : {}
|
|
207957
|
+
},
|
|
207951
207958
|
providerRefs: turnState ? nativeProviderRefs(context) : {}
|
|
207952
207959
|
});
|
|
207953
207960
|
});
|
|
@@ -207965,7 +207972,7 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207965
207972
|
});
|
|
207966
207973
|
});
|
|
207967
207974
|
const emitTurnCompletionWithoutActiveTurn = require_Schema$1.fn("emitTurnCompletionWithoutActiveTurn")(function* (context, status, errorMessage, result, usageSnapshot) {
|
|
207968
|
-
yield* emitTurnUsageUpdated(context, void 0, usageSnapshot);
|
|
207975
|
+
yield* emitTurnUsageUpdated(context, void 0, usageSnapshot, result);
|
|
207969
207976
|
yield* emitTurnCompleted(context, void 0, status, errorMessage, result);
|
|
207970
207977
|
});
|
|
207971
207978
|
const completeInFlightTools = require_Schema$1.fn("completeInFlightTools")(function* (context, turnState, status, result) {
|
|
@@ -208029,7 +208036,7 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
208029
208036
|
yield* completeInFlightTools(context, turnState, status, result);
|
|
208030
208037
|
yield* completePendingAssistantTextBlocks(context, turnState, status, result);
|
|
208031
208038
|
recordCompletedTurn(context, turnState);
|
|
208032
|
-
yield* emitTurnUsageUpdated(context, turnState, usageSnapshot);
|
|
208039
|
+
yield* emitTurnUsageUpdated(context, turnState, usageSnapshot, result);
|
|
208033
208040
|
yield* emitTurnCompleted(context, turnState, status, errorMessage, result);
|
|
208034
208041
|
yield* finalizeTurnSession(context, status, errorMessage);
|
|
208035
208042
|
});
|
|
@@ -277819,6 +277826,83 @@ var PlanTaskCreationReactor = class extends require_Schema$1.Service()("forge/or
|
|
|
277819
277826
|
*/
|
|
277820
277827
|
var SpriteTaskHoldReactor = class extends require_Schema$1.Service()("forge/orchestration/Services/SpriteTaskHoldReactor") {};
|
|
277821
277828
|
//#endregion
|
|
277829
|
+
//#region src/persistence/Services/ProjectionProjects.ts
|
|
277830
|
+
/**
|
|
277831
|
+
* ProjectionProjectRepository - Projection repository interface for projects.
|
|
277832
|
+
*
|
|
277833
|
+
* Owns persistence operations for project rows in the orchestration projection
|
|
277834
|
+
* read model.
|
|
277835
|
+
*
|
|
277836
|
+
* @module ProjectionProjectRepository
|
|
277837
|
+
*/
|
|
277838
|
+
const ProjectionProject = require_Schema$1.Struct({
|
|
277839
|
+
projectId: ProjectId,
|
|
277840
|
+
title: require_Schema$1.String,
|
|
277841
|
+
workspaceRoot: require_Schema$1.String,
|
|
277842
|
+
defaultModelSelection: require_Schema$1.NullOr(ModelSelection),
|
|
277843
|
+
defaultThreadEnvMode: require_Schema$1.NullOr(ThreadEnvMode),
|
|
277844
|
+
cmmdRegistration: require_Schema$1.NullOr(CmmdRegistration),
|
|
277845
|
+
scripts: require_Schema$1.ArraySchema(ProjectScript),
|
|
277846
|
+
createdAt: IsoDateTime,
|
|
277847
|
+
updatedAt: IsoDateTime,
|
|
277848
|
+
deletedAt: require_Schema$1.NullOr(IsoDateTime)
|
|
277849
|
+
});
|
|
277850
|
+
const GetProjectionProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
277851
|
+
const DeleteProjectionProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
277852
|
+
/**
|
|
277853
|
+
* ProjectionProjectRepository - Service tag for project projection persistence.
|
|
277854
|
+
*/
|
|
277855
|
+
var ProjectionProjectRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {};
|
|
277856
|
+
//#endregion
|
|
277857
|
+
//#region src/persistence/Services/ProjectionThreads.ts
|
|
277858
|
+
/**
|
|
277859
|
+
* ProjectionThreadRepository - Projection repository interface for threads.
|
|
277860
|
+
*
|
|
277861
|
+
* Owns persistence operations for projected thread records in the
|
|
277862
|
+
* orchestration read model.
|
|
277863
|
+
*
|
|
277864
|
+
* @module ProjectionThreadRepository
|
|
277865
|
+
*/
|
|
277866
|
+
const ProjectionThread = require_Schema$1.Struct({
|
|
277867
|
+
threadId: ThreadId,
|
|
277868
|
+
projectId: ProjectId,
|
|
277869
|
+
title: require_Schema$1.String,
|
|
277870
|
+
modelSelection: ModelSelection,
|
|
277871
|
+
runtimeMode: RuntimeMode$1,
|
|
277872
|
+
interactionMode: ProviderInteractionMode,
|
|
277873
|
+
branch: require_Schema$1.NullOr(require_Schema$1.String),
|
|
277874
|
+
worktreePath: require_Schema$1.NullOr(require_Schema$1.String),
|
|
277875
|
+
latestTurnId: require_Schema$1.NullOr(TurnId),
|
|
277876
|
+
createdAt: IsoDateTime,
|
|
277877
|
+
updatedAt: IsoDateTime,
|
|
277878
|
+
archivedAt: require_Schema$1.NullOr(IsoDateTime),
|
|
277879
|
+
settledAt: require_Schema$1.NullOr(IsoDateTime),
|
|
277880
|
+
settledOverride: require_Schema$1.NullOr(require_Schema$1.Literals(["settled", "active"])),
|
|
277881
|
+
latestUserMessageAt: require_Schema$1.NullOr(IsoDateTime),
|
|
277882
|
+
pendingApprovalCount: NonNegativeInt,
|
|
277883
|
+
pendingUserInputCount: NonNegativeInt,
|
|
277884
|
+
hasActionableProposedPlan: NonNegativeInt,
|
|
277885
|
+
deletedAt: require_Schema$1.NullOr(IsoDateTime),
|
|
277886
|
+
kind: ThreadKind.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("master"))),
|
|
277887
|
+
parentThreadId: require_Schema$1.NullOr(ThreadId).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
277888
|
+
anchorKind: CmmdAnchorKind.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("scratch"))),
|
|
277889
|
+
anchorCmmdId: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
277890
|
+
linkedPullRequest: require_Schema$1.optionalKey(require_Schema$1.NullOr(LinkedPullRequest)),
|
|
277891
|
+
status: ThreadStatus.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("idle"))),
|
|
277892
|
+
workerRole: require_Schema$1.NullOr(WorkerRole).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
277893
|
+
goal: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
277894
|
+
titleRegeneration: require_Schema$1.NullOr(ThreadTitleRegeneration).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
277895
|
+
pendingAutoCreatePrompt: require_Schema$1.optional(require_Schema$1.NullOr(AutoCreateTaskPrompt)).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
277896
|
+
rateLimitStatus: require_Schema$1.optional(require_Schema$1.ArraySchema(ThreadProviderRateLimitStatus)).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed([])))
|
|
277897
|
+
});
|
|
277898
|
+
const GetProjectionThreadInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
277899
|
+
const DeleteProjectionThreadInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
277900
|
+
const ListProjectionThreadsByProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
277901
|
+
/**
|
|
277902
|
+
* ProjectionThreadRepository - Service tag for thread projection persistence.
|
|
277903
|
+
*/
|
|
277904
|
+
var ProjectionThreadRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreads/ProjectionThreadRepository") {};
|
|
277905
|
+
//#endregion
|
|
277822
277906
|
//#region src/orchestration/Layers/OrchestrationReactor.ts
|
|
277823
277907
|
const RETENTION_SWEEP_INTERVAL_MS = 300 * 1e3;
|
|
277824
277908
|
const makeOrchestrationReactor = require_Schema$1.gen(function* () {
|
|
@@ -280395,7 +280479,10 @@ function threadEventToActivities(event) {
|
|
|
280395
280479
|
tone: "info",
|
|
280396
280480
|
kind: "context-window.updated",
|
|
280397
280481
|
summary: "Context window updated",
|
|
280398
|
-
payload
|
|
280482
|
+
payload: {
|
|
280483
|
+
...payload,
|
|
280484
|
+
...event.payload.turnUsage ? { turnUsage: event.payload.turnUsage } : {}
|
|
280485
|
+
}
|
|
280399
280486
|
}] : [];
|
|
280400
280487
|
}
|
|
280401
280488
|
default: return;
|
|
@@ -286765,6 +286852,7 @@ const ProjectCheckoutDeletionLive = require_Schema$1.effect(ProjectCheckoutDelet
|
|
|
286765
286852
|
//#region src/persistence/Layers/ProjectionProjects.ts
|
|
286766
286853
|
const ProjectionProjectDbRow = ProjectionProject.mapFields(require_Schema$1.assign({
|
|
286767
286854
|
defaultModelSelection: require_Schema$1.NullOr(require_Schema$1.fromJsonString(ModelSelection)),
|
|
286855
|
+
cmmdRegistration: require_Schema$1.NullOr(require_Schema$1.fromJsonString(CmmdRegistration)),
|
|
286768
286856
|
scripts: require_Schema$1.fromJsonString(require_Schema$1.ArraySchema(ProjectScript))
|
|
286769
286857
|
}));
|
|
286770
286858
|
const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
@@ -286778,6 +286866,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286778
286866
|
workspace_root,
|
|
286779
286867
|
default_model_selection_json,
|
|
286780
286868
|
default_thread_env_mode,
|
|
286869
|
+
cmmd_registration_json,
|
|
286781
286870
|
scripts_json,
|
|
286782
286871
|
created_at,
|
|
286783
286872
|
updated_at,
|
|
@@ -286789,6 +286878,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286789
286878
|
${row.workspaceRoot},
|
|
286790
286879
|
${row.defaultModelSelection !== null ? JSON.stringify(row.defaultModelSelection) : null},
|
|
286791
286880
|
${row.defaultThreadEnvMode},
|
|
286881
|
+
${row.cmmdRegistration !== null ? JSON.stringify(row.cmmdRegistration) : null},
|
|
286792
286882
|
${JSON.stringify(row.scripts)},
|
|
286793
286883
|
${row.createdAt},
|
|
286794
286884
|
${row.updatedAt},
|
|
@@ -286800,6 +286890,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286800
286890
|
workspace_root = excluded.workspace_root,
|
|
286801
286891
|
default_model_selection_json = excluded.default_model_selection_json,
|
|
286802
286892
|
default_thread_env_mode = excluded.default_thread_env_mode,
|
|
286893
|
+
cmmd_registration_json = excluded.cmmd_registration_json,
|
|
286803
286894
|
scripts_json = excluded.scripts_json,
|
|
286804
286895
|
created_at = excluded.created_at,
|
|
286805
286896
|
updated_at = excluded.updated_at,
|
|
@@ -286816,6 +286907,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286816
286907
|
workspace_root AS "workspaceRoot",
|
|
286817
286908
|
default_model_selection_json AS "defaultModelSelection",
|
|
286818
286909
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
286910
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
286819
286911
|
scripts_json AS "scripts",
|
|
286820
286912
|
created_at AS "createdAt",
|
|
286821
286913
|
updated_at AS "updatedAt",
|
|
@@ -286834,6 +286926,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286834
286926
|
workspace_root AS "workspaceRoot",
|
|
286835
286927
|
default_model_selection_json AS "defaultModelSelection",
|
|
286836
286928
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
286929
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
286837
286930
|
scripts_json AS "scripts",
|
|
286838
286931
|
created_at AS "createdAt",
|
|
286839
286932
|
updated_at AS "updatedAt",
|
|
@@ -287998,7 +288091,7 @@ function resolveBuildCommitFromEnv(env) {
|
|
|
287998
288091
|
* environment descriptor down instead of reporting an honest "unknown".
|
|
287999
288092
|
*/
|
|
288000
288093
|
function readBakedBuildCommit() {
|
|
288001
|
-
return "
|
|
288094
|
+
return "0ef3571b544de985c96601544e36094a62787683";
|
|
288002
288095
|
}
|
|
288003
288096
|
async function resolveServerBuildCommit(input) {
|
|
288004
288097
|
if (isFullCommitSha(input.baked)) return input.baked;
|
|
@@ -288171,7 +288264,7 @@ const makeServerEnvironment = require_Schema$1.fn("makeServerEnvironment")(funct
|
|
|
288171
288264
|
os,
|
|
288172
288265
|
arch: platformArch()
|
|
288173
288266
|
},
|
|
288174
|
-
serverVersion:
|
|
288267
|
+
serverVersion: version$1,
|
|
288175
288268
|
...buildCommit !== void 0 ? { buildCommit } : {},
|
|
288176
288269
|
capabilities: {
|
|
288177
288270
|
...executionEnvironmentCapabilities(serverConfig),
|
|
@@ -291169,6 +291262,7 @@ const decideOrchestrationCommand = require_Schema$1.fn("decideOrchestrationComma
|
|
|
291169
291262
|
workspaceRoot: command.workspaceRoot,
|
|
291170
291263
|
defaultModelSelection: command.defaultModelSelection ?? null,
|
|
291171
291264
|
...command.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: command.defaultThreadEnvMode } : {},
|
|
291265
|
+
...command.cmmdRegistration !== void 0 ? { cmmdRegistration: command.cmmdRegistration } : {},
|
|
291172
291266
|
scripts: [],
|
|
291173
291267
|
createdAt: command.createdAt,
|
|
291174
291268
|
updatedAt: command.createdAt
|
|
@@ -291195,6 +291289,7 @@ const decideOrchestrationCommand = require_Schema$1.fn("decideOrchestrationComma
|
|
|
291195
291289
|
...command.workspaceRoot !== void 0 ? { workspaceRoot: command.workspaceRoot } : {},
|
|
291196
291290
|
...command.defaultModelSelection !== void 0 ? { defaultModelSelection: command.defaultModelSelection } : {},
|
|
291197
291291
|
...command.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: command.defaultThreadEnvMode } : {},
|
|
291292
|
+
...command.cmmdRegistration !== void 0 ? { cmmdRegistration: command.cmmdRegistration } : {},
|
|
291198
291293
|
...command.scripts !== void 0 ? { scripts: command.scripts } : {},
|
|
291199
291294
|
updatedAt: occurredAt
|
|
291200
291295
|
}
|
|
@@ -292056,6 +292151,7 @@ function projectProjectDomainEvent(nextBase, event) {
|
|
|
292056
292151
|
workspaceRoot: payload.workspaceRoot,
|
|
292057
292152
|
defaultModelSelection: payload.defaultModelSelection,
|
|
292058
292153
|
defaultThreadEnvMode: payload.defaultThreadEnvMode ?? null,
|
|
292154
|
+
cmmdRegistration: payload.cmmdRegistration ?? null,
|
|
292059
292155
|
scripts: payload.scripts,
|
|
292060
292156
|
createdAt: payload.createdAt,
|
|
292061
292157
|
updatedAt: payload.updatedAt,
|
|
@@ -292074,6 +292170,7 @@ function projectProjectDomainEvent(nextBase, event) {
|
|
|
292074
292170
|
...payload.workspaceRoot !== void 0 ? { workspaceRoot: payload.workspaceRoot } : {},
|
|
292075
292171
|
...payload.defaultModelSelection !== void 0 ? { defaultModelSelection: payload.defaultModelSelection } : {},
|
|
292076
292172
|
...payload.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: payload.defaultThreadEnvMode } : {},
|
|
292173
|
+
...payload.cmmdRegistration !== void 0 ? { cmmdRegistration: payload.cmmdRegistration } : {},
|
|
292077
292174
|
...payload.scripts !== void 0 ? { scripts: payload.scripts } : {},
|
|
292078
292175
|
updatedAt: payload.updatedAt
|
|
292079
292176
|
} : project)
|
|
@@ -292679,6 +292776,34 @@ const DeleteProjectionThreadActivitiesInput = require_Schema$1.Struct({ threadId
|
|
|
292679
292776
|
*/
|
|
292680
292777
|
var ProjectionThreadActivityRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreadActivities/ProjectionThreadActivityRepository") {};
|
|
292681
292778
|
//#endregion
|
|
292779
|
+
//#region src/persistence/Services/ProjectionThreadMessages.ts
|
|
292780
|
+
/**
|
|
292781
|
+
* ProjectionThreadMessageRepository - Projection repository interface for messages.
|
|
292782
|
+
*
|
|
292783
|
+
* Owns persistence operations for projected thread messages rendered in the
|
|
292784
|
+
* orchestration read model.
|
|
292785
|
+
*
|
|
292786
|
+
* @module ProjectionThreadMessageRepository
|
|
292787
|
+
*/
|
|
292788
|
+
const ProjectionThreadMessage = require_Schema$1.Struct({
|
|
292789
|
+
messageId: MessageId,
|
|
292790
|
+
threadId: ThreadId,
|
|
292791
|
+
turnId: require_Schema$1.NullOr(TurnId),
|
|
292792
|
+
role: OrchestrationMessageRole,
|
|
292793
|
+
text: require_Schema$1.String,
|
|
292794
|
+
attachments: require_Schema$1.optional(require_Schema$1.ArraySchema(ChatAttachment)),
|
|
292795
|
+
isStreaming: require_Schema$1.Boolean,
|
|
292796
|
+
createdAt: IsoDateTime,
|
|
292797
|
+
updatedAt: IsoDateTime
|
|
292798
|
+
});
|
|
292799
|
+
const ListProjectionThreadMessagesInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
292800
|
+
const GetProjectionThreadMessageInput = require_Schema$1.Struct({ messageId: MessageId });
|
|
292801
|
+
const DeleteProjectionThreadMessagesInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
292802
|
+
/**
|
|
292803
|
+
* ProjectionThreadMessageRepository - Service tag for message projection persistence.
|
|
292804
|
+
*/
|
|
292805
|
+
var ProjectionThreadMessageRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreadMessages/ProjectionThreadMessageRepository") {};
|
|
292806
|
+
//#endregion
|
|
292682
292807
|
//#region src/persistence/Services/ProjectionThreadProposedPlans.ts
|
|
292683
292808
|
const ProjectionThreadProposedPlan = require_Schema$1.Struct({
|
|
292684
292809
|
planId: OrchestrationProposedPlanId,
|
|
@@ -293630,6 +293755,7 @@ const makeOrchestrationProjectionPipeline = require_Schema$1.fn("makeOrchestrati
|
|
|
293630
293755
|
workspaceRoot: event.payload.workspaceRoot,
|
|
293631
293756
|
defaultModelSelection: event.payload.defaultModelSelection,
|
|
293632
293757
|
defaultThreadEnvMode: event.payload.defaultThreadEnvMode ?? null,
|
|
293758
|
+
cmmdRegistration: event.payload.cmmdRegistration ?? null,
|
|
293633
293759
|
scripts: event.payload.scripts,
|
|
293634
293760
|
createdAt: event.payload.createdAt,
|
|
293635
293761
|
updatedAt: event.payload.updatedAt,
|
|
@@ -293645,6 +293771,7 @@ const makeOrchestrationProjectionPipeline = require_Schema$1.fn("makeOrchestrati
|
|
|
293645
293771
|
...event.payload.workspaceRoot !== void 0 ? { workspaceRoot: event.payload.workspaceRoot } : {},
|
|
293646
293772
|
...event.payload.defaultModelSelection !== void 0 ? { defaultModelSelection: event.payload.defaultModelSelection } : {},
|
|
293647
293773
|
...event.payload.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: event.payload.defaultThreadEnvMode } : {},
|
|
293774
|
+
...event.payload.cmmdRegistration !== void 0 ? { cmmdRegistration: event.payload.cmmdRegistration } : {},
|
|
293648
293775
|
...event.payload.scripts !== void 0 ? { scripts: event.payload.scripts } : {},
|
|
293649
293776
|
updatedAt: event.payload.updatedAt
|
|
293650
293777
|
});
|
|
@@ -294540,6 +294667,7 @@ const decodeShellSnapshot = require_Schema$1.decodeUnknownEffect(OrchestrationSh
|
|
|
294540
294667
|
const decodeThread = require_Schema$1.decodeUnknownEffect(OrchestrationThread);
|
|
294541
294668
|
const ProjectionProjectDbRowSchema = ProjectionProject.mapFields(require_Schema$1.assign({
|
|
294542
294669
|
defaultModelSelection: require_Schema$1.NullOr(require_Schema$1.fromJsonString(ModelSelection)),
|
|
294670
|
+
cmmdRegistration: require_Schema$1.NullOr(require_Schema$1.fromJsonString(CmmdRegistration)),
|
|
294543
294671
|
scripts: require_Schema$1.fromJsonString(require_Schema$1.ArraySchema(ProjectScript))
|
|
294544
294672
|
}));
|
|
294545
294673
|
const ProjectionThreadMessageDbRowSchema = ProjectionThreadMessage.mapFields(require_Schema$1.assign({
|
|
@@ -294678,6 +294806,7 @@ function mapProjectShellRow(row, repositoryIdentity, availability) {
|
|
|
294678
294806
|
repositoryIdentity,
|
|
294679
294807
|
availability,
|
|
294680
294808
|
defaultModelSelection: row.defaultModelSelection,
|
|
294809
|
+
cmmdRegistration: row.cmmdRegistration,
|
|
294681
294810
|
scripts: row.scripts,
|
|
294682
294811
|
createdAt: row.createdAt,
|
|
294683
294812
|
updatedAt: row.updatedAt
|
|
@@ -294715,6 +294844,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
294715
294844
|
workspace_root AS "workspaceRoot",
|
|
294716
294845
|
default_model_selection_json AS "defaultModelSelection",
|
|
294717
294846
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
294847
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
294718
294848
|
scripts_json AS "scripts",
|
|
294719
294849
|
created_at AS "createdAt",
|
|
294720
294850
|
updated_at AS "updatedAt",
|
|
@@ -295010,6 +295140,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
295010
295140
|
workspace_root AS "workspaceRoot",
|
|
295011
295141
|
default_model_selection_json AS "defaultModelSelection",
|
|
295012
295142
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
295143
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
295013
295144
|
scripts_json AS "scripts",
|
|
295014
295145
|
created_at AS "createdAt",
|
|
295015
295146
|
updated_at AS "updatedAt",
|
|
@@ -295031,6 +295162,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
295031
295162
|
workspace_root AS "workspaceRoot",
|
|
295032
295163
|
default_model_selection_json AS "defaultModelSelection",
|
|
295033
295164
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
295165
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
295034
295166
|
scripts_json AS "scripts",
|
|
295035
295167
|
created_at AS "createdAt",
|
|
295036
295168
|
updated_at AS "updatedAt",
|
|
@@ -295051,6 +295183,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
295051
295183
|
workspace_root AS "workspaceRoot",
|
|
295052
295184
|
default_model_selection_json AS "defaultModelSelection",
|
|
295053
295185
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
295186
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
295054
295187
|
scripts_json AS "scripts",
|
|
295055
295188
|
created_at AS "createdAt",
|
|
295056
295189
|
updated_at AS "updatedAt",
|
|
@@ -295368,6 +295501,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
295368
295501
|
repositoryIdentity: repositoryIdentities.get(row.projectId) ?? null,
|
|
295369
295502
|
availability: projectAvailabilities.get(row.projectId) ?? "unknown",
|
|
295370
295503
|
defaultModelSelection: row.defaultModelSelection,
|
|
295504
|
+
cmmdRegistration: row.cmmdRegistration,
|
|
295371
295505
|
scripts: row.scripts,
|
|
295372
295506
|
createdAt: row.createdAt,
|
|
295373
295507
|
updatedAt: row.updatedAt,
|
|
@@ -298900,6 +299034,23 @@ const cmmdRenameDeviceRouteLayer = registerProxyRoute({
|
|
|
298900
299034
|
orgIdSource: "none",
|
|
298901
299035
|
responseShape: "unwrapData"
|
|
298902
299036
|
});
|
|
299037
|
+
/**
|
|
299038
|
+
* Name the caller's cloud Environment (FOR-36371).
|
|
299039
|
+
*
|
|
299040
|
+
* Owner JWT lane, like every other `/api/cmmd/forge-runtimes/*` control call.
|
|
299041
|
+
* CMMD scopes the rename to the caller's own Environment and answers 409
|
|
299042
|
+
* `environment_name_taken` when this Seat already has one by that name; both
|
|
299043
|
+
* the status and the code reach the browser unchanged, which is what lets the
|
|
299044
|
+
* rename field say something specific instead of "something went wrong".
|
|
299045
|
+
*/
|
|
299046
|
+
const cmmdRenameForgeRuntimeRouteLayer = registerProxyRoute({
|
|
299047
|
+
forgePath: "/api/cmmd/forge-runtimes/:runtimeId/rename",
|
|
299048
|
+
method: "POST",
|
|
299049
|
+
cmmdPath: "/api/forge/context/runtimes/:runtimeId/rename",
|
|
299050
|
+
orgIdSource: "none",
|
|
299051
|
+
responseShape: "unwrapData",
|
|
299052
|
+
successStatus: 200
|
|
299053
|
+
});
|
|
298903
299054
|
const cmmdRevokeDeviceRouteLayer = registerProxyRoute({
|
|
298904
299055
|
forgePath: "/api/cmmd/devices/:deviceId/revoke",
|
|
298905
299056
|
method: "POST",
|
|
@@ -300826,16 +300977,26 @@ const replicaTurnStatuses = new Set([
|
|
|
300826
300977
|
function isRecord$6(value) {
|
|
300827
300978
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
300828
300979
|
}
|
|
300980
|
+
function replicaSourceSequence(value) {
|
|
300981
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
|
|
300982
|
+
}
|
|
300983
|
+
function replicaSourceEventId(value) {
|
|
300984
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
300985
|
+
}
|
|
300986
|
+
function replicaSourceTurn(sourceTurnId) {
|
|
300987
|
+
return typeof sourceTurnId === "string" && sourceTurnId.length > 0 ? { turnId: sourceTurnId } : {};
|
|
300988
|
+
}
|
|
300829
300989
|
function replicaActivitySource(activity) {
|
|
300830
300990
|
if (!activity.kind.startsWith("replica.") || !isRecord$6(activity.payload)) return null;
|
|
300831
|
-
const sourceSequence = activity.sequence;
|
|
300832
|
-
const eventId = activity.payload.sourceEventId;
|
|
300833
|
-
if (sourceSequence ===
|
|
300834
|
-
return
|
|
300991
|
+
const sourceSequence = replicaSourceSequence(activity.sequence);
|
|
300992
|
+
const eventId = replicaSourceEventId(activity.payload.sourceEventId);
|
|
300993
|
+
if (sourceSequence === null || eventId === null) return null;
|
|
300994
|
+
return {
|
|
300835
300995
|
sourceSequence,
|
|
300836
300996
|
eventId,
|
|
300837
|
-
occurredAt: activity.createdAt
|
|
300838
|
-
|
|
300997
|
+
occurredAt: activity.createdAt,
|
|
300998
|
+
turn: replicaSourceTurn(activity.payload.sourceTurnId)
|
|
300999
|
+
};
|
|
300839
301000
|
}
|
|
300840
301001
|
function replicaSummaryEvent(activity, source) {
|
|
300841
301002
|
if (activity.kind !== "replica.activity_summary" && activity.kind !== "replica.error_summary") return null;
|
|
@@ -300845,6 +301006,7 @@ function replicaSummaryEvent(activity, source) {
|
|
|
300845
301006
|
event: {
|
|
300846
301007
|
eventId: source.eventId,
|
|
300847
301008
|
occurredAt: source.occurredAt,
|
|
301009
|
+
...source.turn,
|
|
300848
301010
|
kind: activity.kind.slice(8),
|
|
300849
301011
|
summary: typeof sourceText === "string" ? sourceText : activity.summary
|
|
300850
301012
|
}
|
|
@@ -300858,6 +301020,7 @@ function replicaTurnEvent(activity, source) {
|
|
|
300858
301020
|
event: {
|
|
300859
301021
|
eventId: source.eventId,
|
|
300860
301022
|
occurredAt: source.occurredAt,
|
|
301023
|
+
...source.turn,
|
|
300861
301024
|
kind: "turn_status",
|
|
300862
301025
|
status
|
|
300863
301026
|
}
|
|
@@ -300873,6 +301036,7 @@ function replicaToolCallEvent(activity, source) {
|
|
|
300873
301036
|
event: {
|
|
300874
301037
|
eventId: source.eventId,
|
|
300875
301038
|
occurredAt: source.occurredAt,
|
|
301039
|
+
...source.turn,
|
|
300876
301040
|
kind: "tool_call",
|
|
300877
301041
|
summary: sourceText,
|
|
300878
301042
|
status,
|
|
@@ -300880,9 +301044,36 @@ function replicaToolCallEvent(activity, source) {
|
|
|
300880
301044
|
}
|
|
300881
301045
|
};
|
|
300882
301046
|
}
|
|
301047
|
+
function replicaTurnUsageEvent(activity, source) {
|
|
301048
|
+
if (activity.kind !== "replica.turn_usage" || !isRecord$6(activity.payload)) return null;
|
|
301049
|
+
const usage = activity.payload.payload;
|
|
301050
|
+
if (!("turnId" in source.turn) || !isRecord$6(usage)) return null;
|
|
301051
|
+
const provider = usage.provider;
|
|
301052
|
+
const model = usage.model;
|
|
301053
|
+
if (typeof provider !== "string" || typeof model !== "string" || !("usage" in usage)) return null;
|
|
301054
|
+
const tokens = usage.usage;
|
|
301055
|
+
return {
|
|
301056
|
+
sourceSequence: source.sourceSequence,
|
|
301057
|
+
event: {
|
|
301058
|
+
eventId: source.eventId,
|
|
301059
|
+
occurredAt: source.occurredAt,
|
|
301060
|
+
kind: "turn_usage",
|
|
301061
|
+
turnId: source.turn.turnId,
|
|
301062
|
+
provider,
|
|
301063
|
+
model,
|
|
301064
|
+
usage: tokens === null ? null : {
|
|
301065
|
+
uncachedInputTokens: tokens.uncachedInputTokens,
|
|
301066
|
+
cachedInputTokens: tokens.cachedInputTokens,
|
|
301067
|
+
cacheCreationTokens: tokens.cacheCreationTokens,
|
|
301068
|
+
outputTokens: tokens.outputTokens,
|
|
301069
|
+
reasoningTokens: tokens.reasoningTokens
|
|
301070
|
+
}
|
|
301071
|
+
}
|
|
301072
|
+
};
|
|
301073
|
+
}
|
|
300883
301074
|
function serializeReplicaActivity(activity) {
|
|
300884
301075
|
const source = replicaActivitySource(activity);
|
|
300885
|
-
return source === null ? null : replicaSummaryEvent(activity, source) ?? replicaTurnEvent(activity, source) ?? replicaToolCallEvent(activity, source);
|
|
301076
|
+
return source === null ? null : replicaSummaryEvent(activity, source) ?? replicaTurnEvent(activity, source) ?? replicaToolCallEvent(activity, source) ?? replicaTurnUsageEvent(activity, source);
|
|
300886
301077
|
}
|
|
300887
301078
|
function serializeReplicaMessage(message) {
|
|
300888
301079
|
const source = decodeReplicaSourceMessageId(message.id);
|
|
@@ -300892,6 +301083,7 @@ function serializeReplicaMessage(message) {
|
|
|
300892
301083
|
event: {
|
|
300893
301084
|
eventId: source.eventId,
|
|
300894
301085
|
occurredAt: message.createdAt,
|
|
301086
|
+
...source.turnId === void 0 ? {} : { turnId: source.turnId },
|
|
300895
301087
|
kind: message.role === "user" ? "user_message" : "assistant_message",
|
|
300896
301088
|
text: message.text
|
|
300897
301089
|
}
|
|
@@ -300968,12 +301160,17 @@ function canonicalRuntimeEventTimestamp(value) {
|
|
|
300968
301160
|
if (Number.isNaN(timestamp.getTime())) throw new Error(`Invalid runtime event timestamp: ${value}`);
|
|
300969
301161
|
return timestamp.toISOString();
|
|
300970
301162
|
}
|
|
301163
|
+
/** Spread onto an event: present only when the projection knows the turn. */
|
|
301164
|
+
function eventTurn(turnId) {
|
|
301165
|
+
return turnId ? { turnId } : {};
|
|
301166
|
+
}
|
|
300971
301167
|
function orderedLocalMessageEvent(message, content) {
|
|
300972
301168
|
return {
|
|
300973
301169
|
sourceSequence: null,
|
|
300974
301170
|
event: {
|
|
300975
301171
|
eventId: `message:${message.id}`,
|
|
300976
301172
|
occurredAt: canonicalRuntimeEventTimestamp(message.createdAt),
|
|
301173
|
+
...eventTurn(message.turnId),
|
|
300977
301174
|
kind: message.role === "user" ? "user_message" : "assistant_message",
|
|
300978
301175
|
text: content
|
|
300979
301176
|
}
|
|
@@ -301004,6 +301201,7 @@ function serializeNativeToolActivity(activity) {
|
|
|
301004
301201
|
event: {
|
|
301005
301202
|
eventId: `activity:${activity.id}`,
|
|
301006
301203
|
occurredAt: canonicalRuntimeEventTimestamp(activity.createdAt),
|
|
301204
|
+
...eventTurn(activity.turnId),
|
|
301007
301205
|
kind: "tool_call",
|
|
301008
301206
|
summary,
|
|
301009
301207
|
status: activityStatus(activity),
|
|
@@ -301046,11 +301244,123 @@ function serializeProviderFailureActivity(activity) {
|
|
|
301046
301244
|
event: {
|
|
301047
301245
|
eventId: `activity:${activity.id}`,
|
|
301048
301246
|
occurredAt: canonicalRuntimeEventTimestamp(activity.createdAt),
|
|
301247
|
+
...eventTurn(activity.turnId),
|
|
301049
301248
|
kind: "error_summary",
|
|
301050
301249
|
summary: text(detail === null ? summary : `${summary}: ${detail}`, 4e3) ?? summary
|
|
301051
301250
|
}
|
|
301052
301251
|
};
|
|
301053
301252
|
}
|
|
301253
|
+
const turnUsageKeys = [
|
|
301254
|
+
"uncachedInputTokens",
|
|
301255
|
+
"cachedInputTokens",
|
|
301256
|
+
"cacheCreationTokens",
|
|
301257
|
+
"outputTokens",
|
|
301258
|
+
"reasoningTokens"
|
|
301259
|
+
];
|
|
301260
|
+
function isTurnUsageRecord(value) {
|
|
301261
|
+
if (!value || typeof value !== "object") return false;
|
|
301262
|
+
const record = value;
|
|
301263
|
+
return (record.scope === "turn-total" || record.scope === "call-delta") && turnUsageKeys.every((key) => Number.isSafeInteger(record[key]) && record[key] >= 0);
|
|
301264
|
+
}
|
|
301265
|
+
function providerTurnUsage(activity) {
|
|
301266
|
+
if (activity.kind !== "context-window.updated") return null;
|
|
301267
|
+
const payload = activity.payload;
|
|
301268
|
+
const usage = payload && typeof payload === "object" ? payload.turnUsage : void 0;
|
|
301269
|
+
return isTurnUsageRecord(usage) ? usage : null;
|
|
301270
|
+
}
|
|
301271
|
+
function tokensOf(usage) {
|
|
301272
|
+
return {
|
|
301273
|
+
uncachedInputTokens: usage.uncachedInputTokens,
|
|
301274
|
+
cachedInputTokens: usage.cachedInputTokens,
|
|
301275
|
+
cacheCreationTokens: usage.cacheCreationTokens,
|
|
301276
|
+
outputTokens: usage.outputTokens,
|
|
301277
|
+
reasoningTokens: usage.reasoningTokens
|
|
301278
|
+
};
|
|
301279
|
+
}
|
|
301280
|
+
/**
|
|
301281
|
+
* What one turn spent, from the usage the adapter reported while it ran.
|
|
301282
|
+
*
|
|
301283
|
+
* A `turn-total` (Claude, from the result message) is the whole turn, so the
|
|
301284
|
+
* last one wins. Otherwise the turn is the sum of its `call-delta` rows
|
|
301285
|
+
* (Codex, one per token update) after dropping consecutive duplicates, the
|
|
301286
|
+
* same rule usage/usageTranscripts.ts applies to a Codex rollout so a Recorded
|
|
301287
|
+
* turn and a scanned transcript agree. No usage at all is an Unreported turn.
|
|
301288
|
+
*/
|
|
301289
|
+
function turnUsageTokens(activities) {
|
|
301290
|
+
const reported = activities.map(providerTurnUsage).filter((usage) => usage !== null);
|
|
301291
|
+
const total = reported.findLast((usage) => usage.scope === "turn-total");
|
|
301292
|
+
if (total) return tokensOf(total);
|
|
301293
|
+
let summed = null;
|
|
301294
|
+
let previous = null;
|
|
301295
|
+
for (const delta of reported) {
|
|
301296
|
+
const signature = JSON.stringify(tokensOf(delta));
|
|
301297
|
+
if (signature === previous) continue;
|
|
301298
|
+
previous = signature;
|
|
301299
|
+
const tokens = tokensOf(delta);
|
|
301300
|
+
summed = summed ? {
|
|
301301
|
+
uncachedInputTokens: summed.uncachedInputTokens + tokens.uncachedInputTokens,
|
|
301302
|
+
cachedInputTokens: summed.cachedInputTokens + tokens.cachedInputTokens,
|
|
301303
|
+
cacheCreationTokens: summed.cacheCreationTokens + tokens.cacheCreationTokens,
|
|
301304
|
+
outputTokens: summed.outputTokens + tokens.outputTokens,
|
|
301305
|
+
reasoningTokens: summed.reasoningTokens + tokens.reasoningTokens
|
|
301306
|
+
} : tokens;
|
|
301307
|
+
}
|
|
301308
|
+
return summed;
|
|
301309
|
+
}
|
|
301310
|
+
/**
|
|
301311
|
+
* One Recorded turn per settled local turn: the turns named on this thread's
|
|
301312
|
+
* own messages and activities, minus the one still running (it would churn a
|
|
301313
|
+
* new generation on every token update). Hydrated replica rows carry no local
|
|
301314
|
+
* turn, so a recovered thread does not re-record turns CMMD already holds.
|
|
301315
|
+
*
|
|
301316
|
+
* Model and provider are the thread's current selection. The adapters do not
|
|
301317
|
+
* yet report which model answered a given turn, so a mid-thread model switch
|
|
301318
|
+
* is attributed to the selection in force when the thread is serialized.
|
|
301319
|
+
* Recorded on FOR-36388.
|
|
301320
|
+
*/
|
|
301321
|
+
/** Turns named on this thread's own rows; hydrated replica rows carry no local turn. */
|
|
301322
|
+
function localTurnIds(thread) {
|
|
301323
|
+
const fromMessages = thread.messages.filter((message) => !message.streaming).map((message) => message.turnId);
|
|
301324
|
+
const fromActivities = thread.activities.filter((activity) => !activity.kind.startsWith("replica.")).map((activity) => activity.turnId);
|
|
301325
|
+
const turnIds = /* @__PURE__ */ new Set();
|
|
301326
|
+
for (const turnId of [...fromMessages, ...fromActivities]) if (turnId) turnIds.add(turnId);
|
|
301327
|
+
return turnIds;
|
|
301328
|
+
}
|
|
301329
|
+
function settledTurnIds(thread) {
|
|
301330
|
+
const turnIds = localTurnIds(thread);
|
|
301331
|
+
if (thread.latestTurn?.state === "running") turnIds.delete(thread.latestTurn.turnId);
|
|
301332
|
+
return turnIds;
|
|
301333
|
+
}
|
|
301334
|
+
function turnActivities(thread, turnId) {
|
|
301335
|
+
return thread.activities.filter((activity) => activity.turnId === turnId).toSorted((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id));
|
|
301336
|
+
}
|
|
301337
|
+
/** The last thing that happened in the turn: what the Recorded turn is stamped with. */
|
|
301338
|
+
function turnLatestAt(thread, turnId, activities) {
|
|
301339
|
+
return [...activities.map((activity) => activity.createdAt), ...thread.messages.filter((message) => message.turnId === turnId).map((message) => message.createdAt)].toSorted().at(-1);
|
|
301340
|
+
}
|
|
301341
|
+
function recordedTurnEvent(thread, turnId) {
|
|
301342
|
+
const activities = turnActivities(thread, turnId);
|
|
301343
|
+
const latestAt = turnLatestAt(thread, turnId, activities);
|
|
301344
|
+
if (latestAt === void 0) return null;
|
|
301345
|
+
return {
|
|
301346
|
+
sourceSequence: null,
|
|
301347
|
+
event: {
|
|
301348
|
+
eventId: `usage:${turnId}`,
|
|
301349
|
+
occurredAt: canonicalRuntimeEventTimestamp(latestAt),
|
|
301350
|
+
kind: "turn_usage",
|
|
301351
|
+
turnId,
|
|
301352
|
+
provider: thread.modelSelection?.provider ?? "unknown",
|
|
301353
|
+
model: thread.modelSelection?.model ?? "unknown",
|
|
301354
|
+
usage: turnUsageTokens(activities)
|
|
301355
|
+
}
|
|
301356
|
+
};
|
|
301357
|
+
}
|
|
301358
|
+
function serializeRecordedTurns(thread) {
|
|
301359
|
+
return [...settledTurnIds(thread)].flatMap((turnId) => {
|
|
301360
|
+
const event = recordedTurnEvent(thread, turnId);
|
|
301361
|
+
return event === null ? [] : [event];
|
|
301362
|
+
});
|
|
301363
|
+
}
|
|
301054
301364
|
function serializeRuntimeThreadEvents(thread) {
|
|
301055
301365
|
const messages = thread.messages.flatMap(serializeThreadMessage);
|
|
301056
301366
|
const failureActivities = thread.activities.flatMap((activity) => {
|
|
@@ -301065,11 +301375,13 @@ function serializeRuntimeThreadEvents(thread) {
|
|
|
301065
301375
|
const event = serializeNativeToolActivity(activity);
|
|
301066
301376
|
return event === null ? [] : [event];
|
|
301067
301377
|
});
|
|
301378
|
+
const recordedTurns = serializeRecordedTurns(thread);
|
|
301068
301379
|
return [
|
|
301069
301380
|
...messages,
|
|
301070
301381
|
...replicaActivities,
|
|
301071
301382
|
...toolActivities,
|
|
301072
|
-
...failureActivities
|
|
301383
|
+
...failureActivities,
|
|
301384
|
+
...recordedTurns
|
|
301073
301385
|
].toSorted((left, right) => {
|
|
301074
301386
|
if (left.sourceSequence !== null && right.sourceSequence !== null) return left.sourceSequence - right.sourceSequence;
|
|
301075
301387
|
if (left.sourceSequence !== null) return -1;
|
|
@@ -310311,7 +310623,6 @@ const PlatformServicesLive = require_Schema$1.unwrap(require_Schema$1.gen(functi
|
|
|
310311
310623
|
return layer;
|
|
310312
310624
|
}
|
|
310313
310625
|
}));
|
|
310314
|
-
const CmmdSyncLayerLive = require_Schema$1.empty$1.pipe(require_Schema$1.provideMerge(TurnCompletionWatcherLive), require_Schema$1.provideMerge(CmmdSyncWorkerLive), require_Schema$1.provideMerge(TurnSerializerLive), require_Schema$1.provideMerge(CmmdSyncClientLive));
|
|
310315
310626
|
const RuntimeReplicationLayerLive = RuntimeReplicationLive.pipe(require_Schema$1.provideMerge(RuntimeReplicationClientLive), require_Schema$1.provideMerge(RuntimeReplicationOutboxLive), require_Schema$1.provideMerge(ActiveHourMeterLive.pipe(require_Schema$1.provide$1(RuntimeReplicationOutboxLive))));
|
|
310316
310627
|
const RuntimeDrainLayerLive = RuntimeDrainReporterLive.pipe(require_Schema$1.provideMerge(RuntimeDrainStateLive));
|
|
310317
310628
|
const RuntimeAwareProviderReactorsLive = require_Schema$1.mergeAll(ProviderRuntimeIngestionLive, ProviderCommandReactorLive).pipe(require_Schema$1.provide$1(RuntimeDrainLayerLive));
|
|
@@ -310319,7 +310630,7 @@ const PipelineWorkerCoordinatorLayerLive = PipelineWorkerCoordinatorLive.pipe(re
|
|
|
310319
310630
|
const AgentProtocolReactorLayerLive = AgentProtocolReactorLive.pipe(require_Schema$1.provideMerge(PipelineRunStoreLive));
|
|
310320
310631
|
const PipelineRunCoordinatorLayerLive = PipelineRunCoordinatorLive.pipe(require_Schema$1.provideMerge(PipelineProviderAuthorityInstallerLive), require_Schema$1.provideMerge(PipelineChangeInspectorLive), require_Schema$1.provideMerge(PipelineContextArtifactStoreLive), require_Schema$1.provideMerge(PipelineModelPolicyLive), require_Schema$1.provideMerge(PipelineRunClientLive), require_Schema$1.provideMerge(PipelineRunStoreLive), require_Schema$1.provideMerge(PipelineRunWorkspaceAllocatorLive), require_Schema$1.provideMerge(PipelineStagePolicyLive), require_Schema$1.provideMerge(PipelineWorkerCoordinatorLayerLive));
|
|
310321
310632
|
const PipelineRuntimeLayerLive = PipelineCoordinatorReactorLive.pipe(require_Schema$1.provideMerge(PipelineRunCoordinatorLayerLive), require_Schema$1.provideMerge(AgentProtocolReactorLayerLive));
|
|
310322
|
-
const ReactorLayerLive = require_Schema$1.empty$1.pipe(require_Schema$1.provideMerge(OrchestrationReactorLive), require_Schema$1.provideMerge(ApprovedWorkerPlanReactorLive), require_Schema$1.provideMerge(RuntimeAwareProviderReactorsLive), require_Schema$1.provideMerge(CheckpointReactorLive), require_Schema$1.provideMerge(SpriteTaskHoldReactorLive), require_Schema$1.provideMerge(PlanTaskCreationReactorLive), require_Schema$1.provideMerge(RuntimeReceiptBusLive), require_Schema$1.provideMerge(
|
|
310633
|
+
const ReactorLayerLive = require_Schema$1.empty$1.pipe(require_Schema$1.provideMerge(OrchestrationReactorLive), require_Schema$1.provideMerge(ApprovedWorkerPlanReactorLive), require_Schema$1.provideMerge(RuntimeAwareProviderReactorsLive), require_Schema$1.provideMerge(CheckpointReactorLive), require_Schema$1.provideMerge(SpriteTaskHoldReactorLive), require_Schema$1.provideMerge(PlanTaskCreationReactorLive), require_Schema$1.provideMerge(RuntimeReceiptBusLive), require_Schema$1.provideMerge(RuntimeReplicationLayerLive), require_Schema$1.provideMerge(PipelineRuntimeLayerLive), require_Schema$1.provideMerge(LocalAutomationRunReconcilerLive));
|
|
310323
310634
|
const CheckpointingLayerLive = require_Schema$1.empty$1.pipe(require_Schema$1.provideMerge(CheckpointDiffQueryLive), require_Schema$1.provideMerge(CheckpointStoreLive));
|
|
310324
310635
|
const ProviderLayerLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
|
|
310325
310636
|
const config = yield* ServerConfig;
|
|
@@ -310375,10 +310686,10 @@ const MiscRuntimeLayerLive = require_Schema$1.mergeAll(AnalyticsServiceLayerLive
|
|
|
310375
310686
|
const RuntimeDependenciesWithoutPullRequestsLive = ReactorLayerLive.pipe(require_Schema$1.provideMerge(CheckpointingLayerLive), require_Schema$1.provideMerge(GitLayerLive), require_Schema$1.provideMerge(OrchestrationLayerLive), require_Schema$1.provideMerge(ProviderLayerLive), require_Schema$1.provideMerge(TerminalLayerLive), require_Schema$1.provideMerge(AgentBrowserManagerLive), require_Schema$1.provideMerge(require_Schema$1.mergeAll(ThreadDevRuntimeLive, DevTunnelLive.pipe(require_Schema$1.provide$1(ThreadDevRuntimeLive)))), require_Schema$1.provideMerge(PersistenceLayerLive), require_Schema$1.provideMerge(KeybindingsLive), require_Schema$1.provideMerge(ProviderRegistryLive), require_Schema$1.provideMerge(require_Schema$1.mergeAll(ServerSettingsLive, UsageServiceLive.pipe(require_Schema$1.provide$1(ServerSettingsLive)))), require_Schema$1.provideMerge(WorkspaceLayerLive), require_Schema$1.provideMerge(WorkspaceReadinessStateLive), require_Schema$1.provideMerge(ProjectFaviconResolverLive), require_Schema$1.provideMerge(RepositoryIdentityResolverLive), require_Schema$1.provideMerge(ServerEnvironmentLive), require_Schema$1.provideMerge(AuthLayerLive), require_Schema$1.provideMerge(ServerSecretStoreLayerLive), require_Schema$1.provideMerge(require_Schema$1.mergeAll(CloudRedisCoordinationLive, CloudStateSyncLive.pipe(require_Schema$1.provide$1(PersistenceLayerLive)))), require_Schema$1.provideMerge(MiscRuntimeLayerLive));
|
|
310376
310687
|
const RuntimeDependenciesLive = pullRequestServiceFactoryLayer.pipe(require_Schema$1.provideMerge(RuntimeDependenciesWithoutPullRequestsLive), require_Schema$1.provideMerge(cmmdProjectIdentityResolverLive.pipe(require_Schema$1.provide$1(RuntimeDependenciesWithoutPullRequestsLive))), require_Schema$1.provideMerge(pullRequestProviderRuntimeLive));
|
|
310377
310688
|
const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(require_Schema$1.provideMerge(RuntimeDependenciesLive));
|
|
310378
|
-
const makeRoutesLayer = require_Schema$1.mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, authCmmdOAuthDeviceRouteLayer, authCmmdOAuthTokenRouteLayer, authCmmdPasswordTokenRouteLayer, authClientsRevokeOthersRouteLayer, authClientsRevokeRouteLayer, authClientsRouteLayer, authLogoutRouteLayer, authPairingLinksRevokeRouteLayer, authPairingLinksRouteLayer, authPairingCredentialRouteLayer, authSessionRouteLayer, authWebSocketTokenRouteLayer, authWebLoginRouteLayer, authWebCallbackRouteLayer, desktopLocalWebBridgePublishRouteLayer, desktopLocalWebBridgeBootstrapRouteLayer, desktopRelayControlPlaneRouteLayer, apiDocsHtmlRouteLayer, apiDocsOpenApiRouteLayer, pulseSignalStateListRouteLayer, pulseSignalStateUpsertRouteLayer, cmmdProfileRouteLayer, cmmdCreateBrainDocRouteLayer, cmmdUpdateTaskRouteLayer, cmmdUpsertTaskPullRequestRouteLayer, ...cmmdPullRequestRouteLayers, cmmdAddTaskCommentRouteLayer, cmmdWorkIntakeRouteLayer, cmmdWsTokenRouteLayer, cmmdSearchTasksRouteLayer, cmmdGetTaskCommentsRouteLayer, cmmdGetProjectCommentsRouteLayer, cmmdAddProjectCommentRouteLayer, cmmdUpdateProjectRouteLayer, cmmdGetOrgMembersRouteLayer, cmmdSimHostsRouteLayer, cmmdSimLeaseReadRouteLayer, cmmdSimLeaseClaimRouteLayer, cmmdSimLeaseReleaseRouteLayer, cmmdSimLeaseRenewRouteLayer, cmmdUploadTaskAttachmentRouteLayer, cmmdGetTaskAttachmentsRouteLayer, cmmdUpdateTaskCommentRouteLayer, cmmdDeleteTaskCommentRouteLayer, cmmdGetProjectRepositoryRouteLayer, cmmdListProjectRepositoriesRouteLayer, cmmdArchiveTaskRouteLayer, cmmdUnarchiveTaskRouteLayer, cmmdListTasksRouteLayer, cmmdCreateTaskRouteLayer, cmmdListCampaignsRouteLayer, cmmdGetCampaignRouteLayer, cmmdCreateCampaignRouteLayer, cmmdUpdateCampaignRouteLayer, cmmdDeleteCampaignRouteLayer, cmmdListSavedViewsRouteLayer, cmmdCreateSavedViewRouteLayer, cmmdImportSavedViewRouteLayer, cmmdUpdateSavedViewRouteLayer, cmmdDeleteSavedViewRouteLayer, cmmdListProjectsRouteLayer, cmmdGetProjectRouteLayer, cmmdCreateProjectRouteLayer, cmmdDeleteProjectRouteLayer, cmmdMoveProjectRouteLayer, cmmdGetProjectMembersRouteLayer, cmmdListWorkspaceMembersRouteLayer, cmmdAddProjectMemberRouteLayer, cmmdGetProjectMilestonesRouteLayer, cmmdCreateProjectMilestoneRouteLayer, cmmdUpdateProjectMilestoneRouteLayer, cmmdDeleteProjectMilestoneRouteLayer, cmmdGetProjectUpdatesRouteLayer, cmmdCreateProjectUpdateRouteLayer, cmmdUpdateProjectUpdateRouteLayer, cmmdDeleteProjectUpdateRouteLayer, cmmdImproveProjectContentRouteLayer, cmmdCreateProjectTaskDraftRouteLayer, cmmdGetProjectTaskDraftRouteLayer, cmmdUpdateProjectTaskDraftRouteLayer, cmmdPreviewProjectTaskDraftRouteLayer, cmmdCommitProjectTaskDraftRouteLayer, cmmdDiscardProjectTaskDraftRouteLayer, cmmdGetProjectLeadPlanRouteLayer, cmmdActivateProjectLeadAuthorityRouteLayer, cmmdGetProjectLeadReadinessRouteLayer, cmmdGetProjectLeadCapabilitiesRouteLayer, cmmdGetProjectLeadSummaryRouteLayer, cmmdGetProjectLeadDetailRouteLayer, cmmdGetProjectLeadBriefingRouteLayer, cmmdListProjectLeadEventsRouteLayer, cmmdExplainProjectLeadRouteLayer, cmmdPauseProjectLeadRouteLayer, cmmdResumeProjectLeadRouteLayer, cmmdReserveProjectLeadTaskRouteLayer, cmmdReleaseProjectLeadReservationRouteLayer, cmmdReconcileProjectLeadRouteLayer, cmmdResolveProjectLeadAttentionRouteLayer, cmmdClaimProjectLeadControllerRouteLayer, cmmdRenewProjectLeadControllerClaimRouteLayer, cmmdYieldProjectLeadControllerClaimRouteLayer, cmmdAcknowledgeProjectLeadControllerEventRouteLayer, cmmdRecordProjectLeadControllerDecisionRouteLayer, cmmdListForgeAutomationPresetsRouteLayer, cmmdListUserForgeAutomationRulesRouteLayer, cmmdCreateUserForgeAutomationRuleRouteLayer, cmmdUpdateUserForgeAutomationRuleRouteLayer, cmmdListUserForgeAutomationRunsRouteLayer, cmmdStartUserForgeAutomationRunRouteLayer, cmmdListForgeAutomationRulesRouteLayer, cmmdCreateForgeAutomationRuleRouteLayer, cmmdUpdateForgeAutomationRuleRouteLayer, cmmdListForgeAutomationRunsRouteLayer, cmmdStartForgeAutomationRunRouteLayer, cmmdGetForgeAutomationRunRouteLayer, cmmdRetryForgeAutomationRunRouteLayer, cmmdCancelForgeAutomationRunRouteLayer, cmmdApproveForgeAutomationEscalationRouteLayer, cmmdRejectForgeAutomationEscalationRouteLayer, cmmdListProjectAgentMembersRouteLayer, cmmdCreateProjectAgentMemberRouteLayer, cmmdGetProjectAgentMemberRouteLayer, cmmdRenameProjectAgentMemberRouteLayer, cmmdRetireProjectAgentMemberRouteLayer, cmmdUpdateProjectAgentMemberAvatarRouteLayer, cmmdListProjectAgentMemberInstancesRouteLayer, cmmdPreviewProjectAgentMemberConsolidationRouteLayer, cmmdApplyProjectAgentMemberConsolidationRouteLayer, cmmdPutProjectTaskAssignmentRouteLayer, cmmdListProjectBoardRouteLayer, cmmdGetProjectTaskWorkflowRouteLayer, cmmdUpdateProjectTaskWorkflowRouteLayer, cmmdCreateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskStatusRouteLayer, cmmdListTaskExecutionOptionsRouteLayer, cmmdCreateTaskWorkSessionRouteLayer, cmmdListProjectWorkSessionsRouteLayer, cmmdGetWorkSessionRouteLayer, cmmdUpdateWorkSessionRouteLayer, cmmdAttachWorkSessionThreadRouteLayer, cmmdListTaskConversationsRouteLayer, cmmdLinkTaskConversationRouteLayer, cmmdGetTaskHistoryRouteLayer, cmmdGetTaskConversationRouteLayer, cmmdSpawnForgeThreadFromBoardTaskRouteLayer, cmmdListCenterBoardRouteLayer, cmmdCreateCenterBoardTaskRouteLayer, cmmdCreateFeedbackRouteLayer, cmmdUpdateCenterBoardTaskRouteLayer, cmmdMoveCenterBoardTaskRouteLayer, cmmdMoveProjectBoardTaskRouteLayer, cmmdArchiveProjectBoardTaskRouteLayer, cmmdUnarchiveProjectBoardTaskRouteLayer, cmmdArchiveCenterBoardTaskRouteLayer, cmmdUnarchiveCenterBoardTaskRouteLayer, cmmdBootstrapRouteLayer, cmmdGetAccountPreferencesRouteLayer, cmmdUpdateAccountPreferencesRouteLayer, cmmdGetOrgProviderPolicyRouteLayer, cmmdListChatsRouteLayer, cmmdGetChatRouteLayer, cmmdListDevicesRouteLayer, runtimeReplicationStatusRouteLayer, cmmdRegisterDeviceRouteLayer, cmmdHeartbeatRuntimeRouteLayer, cmmdGrantRuntimeAccessRouteLayer, cmmdRevokeRuntimeAccessRouteLayer, cmmdCreateRelayControlRouteLayer, cmmdCreateRelayActionGrantRouteLayer, cmmdReplaceRuntimeInventoryRouteLayer, cmmdListRuntimeInventoryRouteLayer, cmmdGetRuntimeDiagnosticsRouteLayer, cmmdProvisionAuthRuntimeRouteLayer, cmmdGetAuthRuntimeRouteLayer, cmmdDestroyAuthRuntimeRouteLayer, cmmdConnectAuthRuntimeRouteLayer, cmmdGetProviderAccountsRouteLayer, cmmdDeleteProviderAccountRouteLayer, cmmdSetProviderAccountDefaultRouteLayer, cmmdGetProviderUsageRouteLayer, cmmdRefreshProviderUsageRouteLayer, cmmdGetUserCodexCredentialRouteLayer, cmmdDeleteUserCodexCredentialRouteLayer, cmmdGetUserClaudeCredentialRouteLayer, cmmdDeleteUserClaudeCredentialRouteLayer, cmmdGetClaudeRuntimeReadinessRouteLayer, cmmdAppendRuntimeThreadEventsRouteLayer, cmmdGetRuntimeThreadReplicaRouteLayer, cmmdRenameDeviceRouteLayer, cmmdRevokeDeviceRouteLayer, cmmdInstallConnectorRouteLayer, cmmdListConnectorsRouteLayer, cmmdForgeCloudProjectsListRouteLayer, cmmdForgeCloudProjectsEventsRouteLayer, cmmdForgeCloudProjectRegisterRouteLayer, cmmdForgeCloudProjectUnregisterRouteLayer, cmmdForgeCloudProjectLifecyclePreflightRouteLayer, cmmdForgeCloudProjectRemovalRouteLayer, cmmdForgeCloudProjectRemovalPreviewRouteLayer, cmmdForgeCloudProjectRemovalReceiptRouteLayer, cmmdForgeRuntimesEnsureRouteLayer, cmmdForgeRuntimesConnectRouteLayer, ownerRuntimeCodexReadinessRouteLayer, cmmdForgeRuntimesStatusRouteLayer, cmmdForgeRuntimesStartRouteLayer, cmmdForgeRuntimesStopRouteLayer, cmmdForgeRuntimesRecycleRouteLayer, cmmdForgeRuntimesUpdateCommitRouteLayer, cmmdForgeRuntimesDestroyRouteLayer, cmmdGetTaskRouteLayer, commandUpdateTaskRouteLayer, mobileProviderCatalogRouteLayer, cmmdUsageSummaryRouteLayer, cmmdBillingRouteLayer, cmmdBillingSeriesRouteLayer, attachmentsRouteLayer, orchestrationDispatchRouteLayer, orchestrationCmmdWorkRunEventRouteLayer, orchestrationAutomationStartThreadRouteLayer, orchestrationAutomationRebindRouteLayer, orchestrationAutomationTerminalReconcileRouteLayer, mobileGitRunStackedActionRouteLayer, pullRequestDiffRouteLayer, orchestrationSnapshotRouteLayer, localAutomationListRouteLayer, localAutomationCreateRouteLayer, localAutomationUpdateRouteLayer, localAutomationDeleteRouteLayer, localAutomationRunRouteLayer, otlpTracesProxyRouteLayer, devTunnelProxyRouteLayer, devTunnelLocalPortProxyRouteLayer, projectFaviconRouteLayer, serverEnvironmentRouteLayer, browserWebRtcReadinessRouteLayer, staticAndDevRouteLayer, githubStatusRouteLayer, githubAuthorizeUrlRouteLayer, githubDisconnectRouteLayer, githubReposRouteLayer, githubCloneRouteLayer, githubCloneJobStartRouteLayer, githubCloneJobStatusRouteLayer, githubRefreshCredentialsRouteLayer, githubToolConfirmationApproveRouteLayer, projectLinkGetRouteLayer, projectLinkListRouteLayer, projectLinkSetRouteLayer, projectLinkDeleteRouteLayer, cmmdWorkspacesRouteLayer, cmmdCampaignsRouteLayer, cmmdProjectLinksRouteLayer, cmmdEnsureGitHubProjectContextRouteLayer, cmmdProjectRepositoryEnsureRouteLayer, cmmdProjectsGetRouteLayer, cmmdProjectsCreateRouteLayer, workspaceReadinessRouteLayer, runtimeLivenessRouteLayer, claudeNativeGenerationProofRouteLayer, claudeUsageRouteLayer, codexRuntimeProviderReadinessRouteLayer, runtimeDiagnosticsRouteLayer, cloudFoldersRouteLayer, cloudProjectCreateRouteLayer, gitUrlCloneRouteLayer, websocketRpcRouteLayer).pipe(require_Schema$1.provide$1(browserApiCorsLayer));
|
|
310689
|
+
const makeRoutesLayer = require_Schema$1.mergeAll(authBearerBootstrapRouteLayer, authBootstrapRouteLayer, authCommandBearerBootstrapRouteLayer, authCommandBootstrapRouteLayer, authOAuthTokenExchangeRouteLayer, authWebSocketTicketRouteLayer, authCmmdOAuthDeviceRouteLayer, authCmmdOAuthTokenRouteLayer, authCmmdPasswordTokenRouteLayer, authClientsRevokeOthersRouteLayer, authClientsRevokeRouteLayer, authClientsRouteLayer, authLogoutRouteLayer, authPairingLinksRevokeRouteLayer, authPairingLinksRouteLayer, authPairingCredentialRouteLayer, authSessionRouteLayer, authWebSocketTokenRouteLayer, authWebLoginRouteLayer, authWebCallbackRouteLayer, desktopLocalWebBridgePublishRouteLayer, desktopLocalWebBridgeBootstrapRouteLayer, desktopRelayControlPlaneRouteLayer, apiDocsHtmlRouteLayer, apiDocsOpenApiRouteLayer, pulseSignalStateListRouteLayer, pulseSignalStateUpsertRouteLayer, cmmdProfileRouteLayer, cmmdCreateBrainDocRouteLayer, cmmdUpdateTaskRouteLayer, cmmdUpsertTaskPullRequestRouteLayer, ...cmmdPullRequestRouteLayers, cmmdAddTaskCommentRouteLayer, cmmdWorkIntakeRouteLayer, cmmdWsTokenRouteLayer, cmmdSearchTasksRouteLayer, cmmdGetTaskCommentsRouteLayer, cmmdGetProjectCommentsRouteLayer, cmmdAddProjectCommentRouteLayer, cmmdUpdateProjectRouteLayer, cmmdGetOrgMembersRouteLayer, cmmdSimHostsRouteLayer, cmmdSimLeaseReadRouteLayer, cmmdSimLeaseClaimRouteLayer, cmmdSimLeaseReleaseRouteLayer, cmmdSimLeaseRenewRouteLayer, cmmdUploadTaskAttachmentRouteLayer, cmmdGetTaskAttachmentsRouteLayer, cmmdUpdateTaskCommentRouteLayer, cmmdDeleteTaskCommentRouteLayer, cmmdGetProjectRepositoryRouteLayer, cmmdListProjectRepositoriesRouteLayer, cmmdArchiveTaskRouteLayer, cmmdUnarchiveTaskRouteLayer, cmmdListTasksRouteLayer, cmmdCreateTaskRouteLayer, cmmdListCampaignsRouteLayer, cmmdGetCampaignRouteLayer, cmmdCreateCampaignRouteLayer, cmmdUpdateCampaignRouteLayer, cmmdDeleteCampaignRouteLayer, cmmdListSavedViewsRouteLayer, cmmdCreateSavedViewRouteLayer, cmmdImportSavedViewRouteLayer, cmmdUpdateSavedViewRouteLayer, cmmdDeleteSavedViewRouteLayer, cmmdListProjectsRouteLayer, cmmdGetProjectRouteLayer, cmmdCreateProjectRouteLayer, cmmdDeleteProjectRouteLayer, cmmdMoveProjectRouteLayer, cmmdGetProjectMembersRouteLayer, cmmdListWorkspaceMembersRouteLayer, cmmdAddProjectMemberRouteLayer, cmmdGetProjectMilestonesRouteLayer, cmmdCreateProjectMilestoneRouteLayer, cmmdUpdateProjectMilestoneRouteLayer, cmmdDeleteProjectMilestoneRouteLayer, cmmdGetProjectUpdatesRouteLayer, cmmdCreateProjectUpdateRouteLayer, cmmdUpdateProjectUpdateRouteLayer, cmmdDeleteProjectUpdateRouteLayer, cmmdImproveProjectContentRouteLayer, cmmdCreateProjectTaskDraftRouteLayer, cmmdGetProjectTaskDraftRouteLayer, cmmdUpdateProjectTaskDraftRouteLayer, cmmdPreviewProjectTaskDraftRouteLayer, cmmdCommitProjectTaskDraftRouteLayer, cmmdDiscardProjectTaskDraftRouteLayer, cmmdGetProjectLeadPlanRouteLayer, cmmdActivateProjectLeadAuthorityRouteLayer, cmmdGetProjectLeadReadinessRouteLayer, cmmdGetProjectLeadCapabilitiesRouteLayer, cmmdGetProjectLeadSummaryRouteLayer, cmmdGetProjectLeadDetailRouteLayer, cmmdGetProjectLeadBriefingRouteLayer, cmmdListProjectLeadEventsRouteLayer, cmmdExplainProjectLeadRouteLayer, cmmdPauseProjectLeadRouteLayer, cmmdResumeProjectLeadRouteLayer, cmmdReserveProjectLeadTaskRouteLayer, cmmdReleaseProjectLeadReservationRouteLayer, cmmdReconcileProjectLeadRouteLayer, cmmdResolveProjectLeadAttentionRouteLayer, cmmdClaimProjectLeadControllerRouteLayer, cmmdRenewProjectLeadControllerClaimRouteLayer, cmmdYieldProjectLeadControllerClaimRouteLayer, cmmdAcknowledgeProjectLeadControllerEventRouteLayer, cmmdRecordProjectLeadControllerDecisionRouteLayer, cmmdListForgeAutomationPresetsRouteLayer, cmmdListUserForgeAutomationRulesRouteLayer, cmmdCreateUserForgeAutomationRuleRouteLayer, cmmdUpdateUserForgeAutomationRuleRouteLayer, cmmdListUserForgeAutomationRunsRouteLayer, cmmdStartUserForgeAutomationRunRouteLayer, cmmdListForgeAutomationRulesRouteLayer, cmmdCreateForgeAutomationRuleRouteLayer, cmmdUpdateForgeAutomationRuleRouteLayer, cmmdListForgeAutomationRunsRouteLayer, cmmdStartForgeAutomationRunRouteLayer, cmmdGetForgeAutomationRunRouteLayer, cmmdRetryForgeAutomationRunRouteLayer, cmmdCancelForgeAutomationRunRouteLayer, cmmdApproveForgeAutomationEscalationRouteLayer, cmmdRejectForgeAutomationEscalationRouteLayer, cmmdListProjectAgentMembersRouteLayer, cmmdCreateProjectAgentMemberRouteLayer, cmmdGetProjectAgentMemberRouteLayer, cmmdRenameProjectAgentMemberRouteLayer, cmmdRetireProjectAgentMemberRouteLayer, cmmdUpdateProjectAgentMemberAvatarRouteLayer, cmmdListProjectAgentMemberInstancesRouteLayer, cmmdPreviewProjectAgentMemberConsolidationRouteLayer, cmmdApplyProjectAgentMemberConsolidationRouteLayer, cmmdPutProjectTaskAssignmentRouteLayer, cmmdListProjectBoardRouteLayer, cmmdGetProjectTaskWorkflowRouteLayer, cmmdUpdateProjectTaskWorkflowRouteLayer, cmmdCreateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskRouteLayer, cmmdUpdateProjectBoardTaskStatusRouteLayer, cmmdListTaskExecutionOptionsRouteLayer, cmmdCreateTaskWorkSessionRouteLayer, cmmdListProjectWorkSessionsRouteLayer, cmmdGetWorkSessionRouteLayer, cmmdUpdateWorkSessionRouteLayer, cmmdAttachWorkSessionThreadRouteLayer, cmmdListTaskConversationsRouteLayer, cmmdLinkTaskConversationRouteLayer, cmmdGetTaskHistoryRouteLayer, cmmdGetTaskConversationRouteLayer, cmmdSpawnForgeThreadFromBoardTaskRouteLayer, cmmdListCenterBoardRouteLayer, cmmdCreateCenterBoardTaskRouteLayer, cmmdCreateFeedbackRouteLayer, cmmdUpdateCenterBoardTaskRouteLayer, cmmdMoveCenterBoardTaskRouteLayer, cmmdMoveProjectBoardTaskRouteLayer, cmmdArchiveProjectBoardTaskRouteLayer, cmmdUnarchiveProjectBoardTaskRouteLayer, cmmdArchiveCenterBoardTaskRouteLayer, cmmdUnarchiveCenterBoardTaskRouteLayer, cmmdBootstrapRouteLayer, cmmdGetAccountPreferencesRouteLayer, cmmdUpdateAccountPreferencesRouteLayer, cmmdGetOrgProviderPolicyRouteLayer, cmmdListChatsRouteLayer, cmmdGetChatRouteLayer, cmmdListDevicesRouteLayer, runtimeReplicationStatusRouteLayer, cmmdRegisterDeviceRouteLayer, cmmdHeartbeatRuntimeRouteLayer, cmmdGrantRuntimeAccessRouteLayer, cmmdRevokeRuntimeAccessRouteLayer, cmmdCreateRelayControlRouteLayer, cmmdCreateRelayActionGrantRouteLayer, cmmdReplaceRuntimeInventoryRouteLayer, cmmdListRuntimeInventoryRouteLayer, cmmdGetRuntimeDiagnosticsRouteLayer, cmmdProvisionAuthRuntimeRouteLayer, cmmdGetAuthRuntimeRouteLayer, cmmdDestroyAuthRuntimeRouteLayer, cmmdConnectAuthRuntimeRouteLayer, cmmdGetProviderAccountsRouteLayer, cmmdDeleteProviderAccountRouteLayer, cmmdSetProviderAccountDefaultRouteLayer, cmmdGetProviderUsageRouteLayer, cmmdRefreshProviderUsageRouteLayer, cmmdGetUserCodexCredentialRouteLayer, cmmdDeleteUserCodexCredentialRouteLayer, cmmdGetUserClaudeCredentialRouteLayer, cmmdDeleteUserClaudeCredentialRouteLayer, cmmdGetClaudeRuntimeReadinessRouteLayer, cmmdAppendRuntimeThreadEventsRouteLayer, cmmdGetRuntimeThreadReplicaRouteLayer, cmmdRenameDeviceRouteLayer, cmmdRevokeDeviceRouteLayer, cmmdInstallConnectorRouteLayer, cmmdListConnectorsRouteLayer, cmmdForgeCloudProjectsListRouteLayer, cmmdForgeCloudProjectsEventsRouteLayer, cmmdForgeCloudProjectRegisterRouteLayer, cmmdForgeCloudProjectUnregisterRouteLayer, cmmdForgeCloudProjectLifecyclePreflightRouteLayer, cmmdForgeCloudProjectRemovalRouteLayer, cmmdForgeCloudProjectRemovalPreviewRouteLayer, cmmdForgeCloudProjectRemovalReceiptRouteLayer, cmmdForgeRuntimesEnsureRouteLayer, cmmdForgeRuntimesConnectRouteLayer, ownerRuntimeCodexReadinessRouteLayer, cmmdForgeRuntimesStatusRouteLayer, cmmdForgeRuntimesStartRouteLayer, cmmdForgeRuntimesStopRouteLayer, cmmdForgeRuntimesRecycleRouteLayer, cmmdForgeRuntimesUpdateCommitRouteLayer, cmmdForgeRuntimesDestroyRouteLayer, cmmdRenameForgeRuntimeRouteLayer, cmmdGetTaskRouteLayer, commandUpdateTaskRouteLayer, mobileProviderCatalogRouteLayer, cmmdUsageSummaryRouteLayer, cmmdBillingRouteLayer, cmmdBillingSeriesRouteLayer, attachmentsRouteLayer, orchestrationDispatchRouteLayer, orchestrationCmmdWorkRunEventRouteLayer, orchestrationAutomationStartThreadRouteLayer, orchestrationAutomationRebindRouteLayer, orchestrationAutomationTerminalReconcileRouteLayer, mobileGitRunStackedActionRouteLayer, pullRequestDiffRouteLayer, orchestrationSnapshotRouteLayer, localAutomationListRouteLayer, localAutomationCreateRouteLayer, localAutomationUpdateRouteLayer, localAutomationDeleteRouteLayer, localAutomationRunRouteLayer, otlpTracesProxyRouteLayer, devTunnelProxyRouteLayer, devTunnelLocalPortProxyRouteLayer, projectFaviconRouteLayer, serverEnvironmentRouteLayer, browserWebRtcReadinessRouteLayer, staticAndDevRouteLayer, githubStatusRouteLayer, githubAuthorizeUrlRouteLayer, githubDisconnectRouteLayer, githubReposRouteLayer, githubCloneRouteLayer, githubCloneJobStartRouteLayer, githubCloneJobStatusRouteLayer, githubRefreshCredentialsRouteLayer, githubToolConfirmationApproveRouteLayer, projectLinkGetRouteLayer, projectLinkListRouteLayer, projectLinkSetRouteLayer, projectLinkDeleteRouteLayer, cmmdWorkspacesRouteLayer, cmmdCampaignsRouteLayer, cmmdProjectLinksRouteLayer, cmmdEnsureGitHubProjectContextRouteLayer, cmmdProjectRepositoryEnsureRouteLayer, cmmdProjectsGetRouteLayer, cmmdProjectsCreateRouteLayer, workspaceReadinessRouteLayer, runtimeLivenessRouteLayer, claudeNativeGenerationProofRouteLayer, claudeUsageRouteLayer, codexRuntimeProviderReadinessRouteLayer, runtimeDiagnosticsRouteLayer, cloudFoldersRouteLayer, cloudProjectCreateRouteLayer, gitUrlCloneRouteLayer, websocketRpcRouteLayer).pipe(require_Schema$1.provide$1(browserApiCorsLayer));
|
|
310379
310690
|
const makeServerLayer = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
|
|
310380
310691
|
const config = yield* ServerConfig;
|
|
310381
|
-
fixPath();
|
|
310692
|
+
fixPath({ preferProcessPath: config.forgeCmmdRuntimeMode === true });
|
|
310382
310693
|
const httpListeningLayer = require_Schema$1.effectDiscard(require_Schema$1.gen(function* () {
|
|
310383
310694
|
yield* require_HttpServer.HttpServer;
|
|
310384
310695
|
yield* (yield* ServerRuntimeStartup).markHttpListening;
|