@cmmd-center/forge 0.9.16 → 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 +889 -436
- package/dist/bin.mjs +892 -451
- package/dist/client/assets/{CanvasPanel-Dc8j2ouo.js → CanvasPanel-DO2u5-Xk.js} +2 -2
- package/dist/client/assets/{CompositeItem-Cn5DdObI.js → CompositeItem-BNUtGUNS.js} +2 -2
- package/dist/client/assets/{DiffPanel-CRdkVPEz.js → DiffPanel-CiOqFcOU.js} +2 -2
- package/dist/client/assets/{DiffPanel.logic-BIPcNz_o.js → DiffPanel.logic-CcUKnHmG.js} +2 -2
- package/dist/client/assets/{DiffPanelShell-tIdXu7mn.js → DiffPanelShell-B8YmcyIS.js} +33 -33
- package/dist/client/assets/{DiffWorkerPoolProvider-tFSGuVfC.js → DiffWorkerPoolProvider-XttvFu9p.js} +2 -2
- package/dist/client/assets/{PullRequestCodePanel-inwJYfZC.js → PullRequestCodePanel-BwnGKUmC.js} +2 -2
- package/dist/client/assets/{Virtualizer-DeKxnAeU.js → Virtualizer-DD1kZz4_.js} +2 -2
- package/dist/client/assets/{canvasStateStore-Dlm4tanv.js → canvasStateStore-BVOZ0hkY.js} +2 -2
- package/dist/client/assets/{cmmdAuthRedirect-C1FjO86g.js → cmmdAuthRedirect-COJsfxk2.js} +2 -2
- package/dist/client/assets/{index-BvXPD-Rk.js → index-B6v3s1Ki.js} +57 -57
- package/dist/client/assets/{index-4a61qSZ4.css → index-BUnBt2Vq.css} +1 -1
- package/dist/client/assets/{src-DljvAdHI.js → src-DEn2qb9-.js} +3 -3
- package/dist/client/assets/{toggle-It2CvaLA.js → toggle-vjiHllrh.js} +2 -2
- package/dist/client/assets/{useTriggerFocusGuards-DfUh9uvu.js → useTriggerFocusGuards-DMJ0Xu3Z.js} +2 -2
- package/dist/client/index.html +11 -11
- 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 });
|
|
@@ -22345,6 +22391,40 @@ const ServerProviderAuth = require_Schema$1.Struct({
|
|
|
22345
22391
|
accountEmail: require_Schema$1.optional(TrimmedNonEmptyString),
|
|
22346
22392
|
provenance: require_Schema$1.optional(ProviderAuthProvenance)
|
|
22347
22393
|
});
|
|
22394
|
+
/**
|
|
22395
|
+
* Whether this Environment will let a person select the provider.
|
|
22396
|
+
*
|
|
22397
|
+
* Published for every provider the build knows about. A provider is never
|
|
22398
|
+
* dropped from the list: absence is not a state, and four different reasons
|
|
22399
|
+
* once collapsed into one "Coming soon." string because the Shell had to infer
|
|
22400
|
+
* meaning from what was missing. See
|
|
22401
|
+
* `docs/adr/withheld-providers-carry-their-reason.md`.
|
|
22402
|
+
*/
|
|
22403
|
+
const ProviderAvailability = require_Schema$1.Literals(["available", "unavailable"]);
|
|
22404
|
+
/**
|
|
22405
|
+
* Why a Withheld Provider is withheld. The four members are the glossary's,
|
|
22406
|
+
* in `CONTEXT.md` section "Provider availability": Unbuilt, Not Offered, Not
|
|
22407
|
+
* Usable, Not on this Environment. Only Unbuilt may read "Coming soon."
|
|
22408
|
+
*
|
|
22409
|
+
* An Environment can only ever report Unbuilt, Not Usable, or Not on this
|
|
22410
|
+
* Environment. Not Offered is a CMMD fact about the organization's Provider
|
|
22411
|
+
* Offer, which the Shell adds when it joins.
|
|
22412
|
+
*/
|
|
22413
|
+
const ProviderUnavailableReason = require_Schema$1.Literals([
|
|
22414
|
+
"unbuilt",
|
|
22415
|
+
"not-offered",
|
|
22416
|
+
"not-usable",
|
|
22417
|
+
"not-on-this-environment"
|
|
22418
|
+
]);
|
|
22419
|
+
/**
|
|
22420
|
+
* The Not Usable sub-case. It picks a second line of copy, not a fifth state,
|
|
22421
|
+
* which is why it is a separate field rather than three more reasons.
|
|
22422
|
+
*/
|
|
22423
|
+
const ProviderUnavailableDetail = require_Schema$1.Literals([
|
|
22424
|
+
"no-connection",
|
|
22425
|
+
"delivery-pending",
|
|
22426
|
+
"reconnect-required"
|
|
22427
|
+
]);
|
|
22348
22428
|
const ServerProviderModel = require_Schema$1.Struct({
|
|
22349
22429
|
slug: TrimmedNonEmptyString,
|
|
22350
22430
|
name: TrimmedNonEmptyString,
|
|
@@ -22376,6 +22456,9 @@ const ServerProvider = require_Schema$1.Struct({
|
|
|
22376
22456
|
checkedAt: IsoDateTime,
|
|
22377
22457
|
message: require_Schema$1.optional(TrimmedNonEmptyString),
|
|
22378
22458
|
models: require_Schema$1.ArraySchema(ServerProviderModel),
|
|
22459
|
+
availability: require_Schema$1.optional(ProviderAvailability),
|
|
22460
|
+
unavailableReason: require_Schema$1.optional(ProviderUnavailableReason),
|
|
22461
|
+
unavailableDetail: require_Schema$1.optional(ProviderUnavailableDetail),
|
|
22379
22462
|
slashCommands: require_Schema$1.ArraySchema(ServerProviderSlashCommand).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed([]))),
|
|
22380
22463
|
skills: require_Schema$1.ArraySchema(ServerProviderSkill).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed([])))
|
|
22381
22464
|
});
|
|
@@ -65123,7 +65206,7 @@ function normalizeNumberish(value) {
|
|
|
65123
65206
|
}
|
|
65124
65207
|
//#endregion
|
|
65125
65208
|
//#region package.json
|
|
65126
|
-
var version$1 = "0.9.
|
|
65209
|
+
var version$1 = "0.9.18";
|
|
65127
65210
|
//#endregion
|
|
65128
65211
|
//#region src/sentry.ts
|
|
65129
65212
|
const SERVER_APP_NAME = "forge-server";
|
|
@@ -68269,7 +68352,8 @@ function fixPath(options = {}) {
|
|
|
68269
68352
|
if (shellPath) break;
|
|
68270
68353
|
}
|
|
68271
68354
|
const launchctlPath = platform === "darwin" && !shellPath ? (options.readLaunchctlPath ?? readPathFromLaunchctl)() : void 0;
|
|
68272
|
-
const
|
|
68355
|
+
const hydratedPath = shellPath ?? launchctlPath;
|
|
68356
|
+
const mergedPath = options.preferProcessPath ? mergePathEntries(env.PATH, hydratedPath, platform) : mergePathEntries(hydratedPath, env.PATH, platform);
|
|
68273
68357
|
if (mergedPath) env.PATH = mergedPath;
|
|
68274
68358
|
} catch (error) {
|
|
68275
68359
|
logWarning("Failed to hydrate PATH from the user environment.", error);
|
|
@@ -92157,306 +92241,6 @@ var AnalyticsService = class AnalyticsService extends require_Schema$1.Service()
|
|
|
92157
92241
|
});
|
|
92158
92242
|
};
|
|
92159
92243
|
//#endregion
|
|
92160
|
-
//#region src/cmmdSync/CmmdSyncClient.ts
|
|
92161
|
-
const SYNC_TIMEOUT_MS = 1e4;
|
|
92162
|
-
var CmmdSyncError = class extends require_Schema$1.TaggedError("CmmdSyncError") {};
|
|
92163
|
-
var CmmdSyncClient = class extends require_Schema$1.Service()("forge/cmmdSync/CmmdSyncClient") {};
|
|
92164
|
-
const CmmdSyncClientLive = require_Schema$1.effect(CmmdSyncClient, require_Schema$1.gen(function* () {
|
|
92165
|
-
const serverSettings = yield* ServerSettingsService;
|
|
92166
|
-
const syncTurn = (payload) => require_Schema$1.gen(function* () {
|
|
92167
|
-
const { baseUrl, apiKey } = (yield* serverSettings.getSettings.pipe(require_Schema$1.orDie)).providers.cmmd;
|
|
92168
|
-
const url = `${baseUrl.replace(/\/$/, "")}/api/forge/turns`;
|
|
92169
|
-
const headers = { "Content-Type": "application/json" };
|
|
92170
|
-
if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
|
|
92171
|
-
const response = yield* require_Schema$1.tryPromise({
|
|
92172
|
-
try: () => fetch(url, {
|
|
92173
|
-
method: "POST",
|
|
92174
|
-
headers,
|
|
92175
|
-
body: JSON.stringify(payload),
|
|
92176
|
-
signal: AbortSignal.timeout(SYNC_TIMEOUT_MS)
|
|
92177
|
-
}),
|
|
92178
|
-
catch: (cause) => new CmmdSyncError({
|
|
92179
|
-
statusCode: 0,
|
|
92180
|
-
body: String(cause)
|
|
92181
|
-
})
|
|
92182
|
-
});
|
|
92183
|
-
const body = yield* require_Schema$1.tryPromise({
|
|
92184
|
-
try: () => response.text(),
|
|
92185
|
-
catch: (cause) => new CmmdSyncError({
|
|
92186
|
-
statusCode: response.status,
|
|
92187
|
-
body: String(cause)
|
|
92188
|
-
})
|
|
92189
|
-
});
|
|
92190
|
-
if (!response.ok) return yield* new CmmdSyncError({
|
|
92191
|
-
statusCode: response.status,
|
|
92192
|
-
body
|
|
92193
|
-
});
|
|
92194
|
-
return yield* require_Schema$1.try_({
|
|
92195
|
-
try: () => JSON.parse(body),
|
|
92196
|
-
catch: (cause) => new CmmdSyncError({
|
|
92197
|
-
statusCode: 200,
|
|
92198
|
-
body: String(cause)
|
|
92199
|
-
})
|
|
92200
|
-
});
|
|
92201
|
-
});
|
|
92202
|
-
return { syncTurn };
|
|
92203
|
-
}));
|
|
92204
|
-
//#endregion
|
|
92205
|
-
//#region src/persistence/Services/ProjectionProjects.ts
|
|
92206
|
-
/**
|
|
92207
|
-
* ProjectionProjectRepository - Projection repository interface for projects.
|
|
92208
|
-
*
|
|
92209
|
-
* Owns persistence operations for project rows in the orchestration projection
|
|
92210
|
-
* read model.
|
|
92211
|
-
*
|
|
92212
|
-
* @module ProjectionProjectRepository
|
|
92213
|
-
*/
|
|
92214
|
-
const ProjectionProject = require_Schema$1.Struct({
|
|
92215
|
-
projectId: ProjectId,
|
|
92216
|
-
title: require_Schema$1.String,
|
|
92217
|
-
workspaceRoot: require_Schema$1.String,
|
|
92218
|
-
defaultModelSelection: require_Schema$1.NullOr(ModelSelection),
|
|
92219
|
-
defaultThreadEnvMode: require_Schema$1.NullOr(ThreadEnvMode),
|
|
92220
|
-
scripts: require_Schema$1.ArraySchema(ProjectScript),
|
|
92221
|
-
createdAt: IsoDateTime,
|
|
92222
|
-
updatedAt: IsoDateTime,
|
|
92223
|
-
deletedAt: require_Schema$1.NullOr(IsoDateTime)
|
|
92224
|
-
});
|
|
92225
|
-
const GetProjectionProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
92226
|
-
const DeleteProjectionProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
92227
|
-
/**
|
|
92228
|
-
* ProjectionProjectRepository - Service tag for project projection persistence.
|
|
92229
|
-
*/
|
|
92230
|
-
var ProjectionProjectRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {};
|
|
92231
|
-
//#endregion
|
|
92232
|
-
//#region src/persistence/Services/ProjectionThreadMessages.ts
|
|
92233
|
-
/**
|
|
92234
|
-
* ProjectionThreadMessageRepository - Projection repository interface for messages.
|
|
92235
|
-
*
|
|
92236
|
-
* Owns persistence operations for projected thread messages rendered in the
|
|
92237
|
-
* orchestration read model.
|
|
92238
|
-
*
|
|
92239
|
-
* @module ProjectionThreadMessageRepository
|
|
92240
|
-
*/
|
|
92241
|
-
const ProjectionThreadMessage = require_Schema$1.Struct({
|
|
92242
|
-
messageId: MessageId,
|
|
92243
|
-
threadId: ThreadId,
|
|
92244
|
-
turnId: require_Schema$1.NullOr(TurnId),
|
|
92245
|
-
role: OrchestrationMessageRole,
|
|
92246
|
-
text: require_Schema$1.String,
|
|
92247
|
-
attachments: require_Schema$1.optional(require_Schema$1.ArraySchema(ChatAttachment)),
|
|
92248
|
-
isStreaming: require_Schema$1.Boolean,
|
|
92249
|
-
createdAt: IsoDateTime,
|
|
92250
|
-
updatedAt: IsoDateTime
|
|
92251
|
-
});
|
|
92252
|
-
const ListProjectionThreadMessagesInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92253
|
-
const GetProjectionThreadMessageInput = require_Schema$1.Struct({ messageId: MessageId });
|
|
92254
|
-
const DeleteProjectionThreadMessagesInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92255
|
-
/**
|
|
92256
|
-
* ProjectionThreadMessageRepository - Service tag for message projection persistence.
|
|
92257
|
-
*/
|
|
92258
|
-
var ProjectionThreadMessageRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreadMessages/ProjectionThreadMessageRepository") {};
|
|
92259
|
-
//#endregion
|
|
92260
|
-
//#region src/persistence/Services/ProjectionThreads.ts
|
|
92261
|
-
/**
|
|
92262
|
-
* ProjectionThreadRepository - Projection repository interface for threads.
|
|
92263
|
-
*
|
|
92264
|
-
* Owns persistence operations for projected thread records in the
|
|
92265
|
-
* orchestration read model.
|
|
92266
|
-
*
|
|
92267
|
-
* @module ProjectionThreadRepository
|
|
92268
|
-
*/
|
|
92269
|
-
const ProjectionThread = require_Schema$1.Struct({
|
|
92270
|
-
threadId: ThreadId,
|
|
92271
|
-
projectId: ProjectId,
|
|
92272
|
-
title: require_Schema$1.String,
|
|
92273
|
-
modelSelection: ModelSelection,
|
|
92274
|
-
runtimeMode: RuntimeMode$1,
|
|
92275
|
-
interactionMode: ProviderInteractionMode,
|
|
92276
|
-
branch: require_Schema$1.NullOr(require_Schema$1.String),
|
|
92277
|
-
worktreePath: require_Schema$1.NullOr(require_Schema$1.String),
|
|
92278
|
-
latestTurnId: require_Schema$1.NullOr(TurnId),
|
|
92279
|
-
createdAt: IsoDateTime,
|
|
92280
|
-
updatedAt: IsoDateTime,
|
|
92281
|
-
archivedAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92282
|
-
settledAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92283
|
-
settledOverride: require_Schema$1.NullOr(require_Schema$1.Literals(["settled", "active"])),
|
|
92284
|
-
latestUserMessageAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92285
|
-
pendingApprovalCount: NonNegativeInt,
|
|
92286
|
-
pendingUserInputCount: NonNegativeInt,
|
|
92287
|
-
hasActionableProposedPlan: NonNegativeInt,
|
|
92288
|
-
deletedAt: require_Schema$1.NullOr(IsoDateTime),
|
|
92289
|
-
kind: ThreadKind.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("master"))),
|
|
92290
|
-
parentThreadId: require_Schema$1.NullOr(ThreadId).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92291
|
-
anchorKind: CmmdAnchorKind.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("scratch"))),
|
|
92292
|
-
anchorCmmdId: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92293
|
-
linkedPullRequest: require_Schema$1.optionalKey(require_Schema$1.NullOr(LinkedPullRequest)),
|
|
92294
|
-
status: ThreadStatus.pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed("idle"))),
|
|
92295
|
-
workerRole: require_Schema$1.NullOr(WorkerRole).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92296
|
-
goal: require_Schema$1.NullOr(require_Schema$1.String).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92297
|
-
titleRegeneration: require_Schema$1.NullOr(ThreadTitleRegeneration).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92298
|
-
pendingAutoCreatePrompt: require_Schema$1.optional(require_Schema$1.NullOr(AutoCreateTaskPrompt)).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed(null))),
|
|
92299
|
-
rateLimitStatus: require_Schema$1.optional(require_Schema$1.ArraySchema(ThreadProviderRateLimitStatus)).pipe(require_Schema$1.withDecodingDefault(require_Schema$1.succeed([])))
|
|
92300
|
-
});
|
|
92301
|
-
const GetProjectionThreadInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92302
|
-
const DeleteProjectionThreadInput = require_Schema$1.Struct({ threadId: ThreadId });
|
|
92303
|
-
const ListProjectionThreadsByProjectInput = require_Schema$1.Struct({ projectId: ProjectId });
|
|
92304
|
-
/**
|
|
92305
|
-
* ProjectionThreadRepository - Service tag for thread projection persistence.
|
|
92306
|
-
*/
|
|
92307
|
-
var ProjectionThreadRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreads/ProjectionThreadRepository") {};
|
|
92308
|
-
//#endregion
|
|
92309
|
-
//#region src/cmmdSync/TurnSerializer.ts
|
|
92310
|
-
var TurnSerializer = class extends require_Schema$1.Service()("forge/cmmdSync/TurnSerializer") {};
|
|
92311
|
-
const TurnSerializerLive = require_Schema$1.effect(TurnSerializer, require_Schema$1.gen(function* () {
|
|
92312
|
-
const threadRepo = yield* ProjectionThreadRepository;
|
|
92313
|
-
const projectRepo = yield* ProjectionProjectRepository;
|
|
92314
|
-
const messageRepo = yield* ProjectionThreadMessageRepository;
|
|
92315
|
-
const buildPayload = (threadId, turnId, completedAt) => require_Schema$1.gen(function* () {
|
|
92316
|
-
const maybeThread = yield* threadRepo.getById({ threadId }).pipe(require_Schema$1.orDie);
|
|
92317
|
-
if (require_Schema$1.isNone(maybeThread)) return yield* require_Schema$1.die(/* @__PURE__ */ new Error(`Thread ${threadId} not found for CMMD sync`));
|
|
92318
|
-
const thread = maybeThread.value;
|
|
92319
|
-
const maybeProject = yield* projectRepo.getById({ projectId: thread.projectId }).pipe(require_Schema$1.orDie);
|
|
92320
|
-
if (require_Schema$1.isNone(maybeProject)) return yield* require_Schema$1.die(/* @__PURE__ */ new Error(`Project ${thread.projectId} not found for CMMD sync`));
|
|
92321
|
-
const project = maybeProject.value;
|
|
92322
|
-
const turnMsgs = (yield* messageRepo.listByThreadId({ threadId }).pipe(require_Schema$1.orDie)).filter((m) => m.turnId === turnId);
|
|
92323
|
-
const userMsg = turnMsgs.find((m) => m.role === "user")?.text ?? "";
|
|
92324
|
-
const assistantMsg = turnMsgs.find((m) => m.role === "assistant")?.text ?? "";
|
|
92325
|
-
const startedAt = turnMsgs.find((m) => m.role === "user")?.createdAt ?? completedAt;
|
|
92326
|
-
return {
|
|
92327
|
-
forgeSessionId: threadId,
|
|
92328
|
-
forgeTurnId: turnId,
|
|
92329
|
-
workspaceId: null,
|
|
92330
|
-
userId: null,
|
|
92331
|
-
projectPath: project.workspaceRoot,
|
|
92332
|
-
projectTitle: project.title,
|
|
92333
|
-
threadTitle: thread.title,
|
|
92334
|
-
model: thread.modelSelection.model,
|
|
92335
|
-
branch: thread.branch,
|
|
92336
|
-
userMessage: userMsg,
|
|
92337
|
-
assistantMessage: assistantMsg,
|
|
92338
|
-
toolCalls: [],
|
|
92339
|
-
status: "complete",
|
|
92340
|
-
startedAt,
|
|
92341
|
-
completedAt,
|
|
92342
|
-
forgeVersion: version$1
|
|
92343
|
-
};
|
|
92344
|
-
});
|
|
92345
|
-
return { buildPayload };
|
|
92346
|
-
}));
|
|
92347
|
-
//#endregion
|
|
92348
|
-
//#region src/cmmdSync/TurnCompletionWatcher.ts
|
|
92349
|
-
var TurnCompletionWatcher = class extends require_Schema$1.Service()("forge/cmmdSync/TurnCompletionWatcher") {};
|
|
92350
|
-
const isTurnDiffCompleted = (e) => e.type === "thread.turn-diff-completed";
|
|
92351
|
-
const TurnCompletionWatcherLive = require_Schema$1.effect(TurnCompletionWatcher, require_Schema$1.gen(function* () {
|
|
92352
|
-
const engine = yield* OrchestrationEngineService;
|
|
92353
|
-
const serializer = yield* TurnSerializer;
|
|
92354
|
-
const syncClient = yield* CmmdSyncClient;
|
|
92355
|
-
const serverSettings = yield* ServerSettingsService;
|
|
92356
|
-
const sql = yield* require_SqlError.SqlClient;
|
|
92357
|
-
const enqueueForRetry = (threadId, turnId, payloadJson) => sql`
|
|
92358
|
-
INSERT INTO cmmd_session_sync_queue
|
|
92359
|
-
(thread_id, turn_id, payload_json, status, attempt_count, created_at)
|
|
92360
|
-
VALUES
|
|
92361
|
-
(${threadId}, ${turnId}, ${payloadJson}, 'pending', 0, ${(/* @__PURE__ */ new Date()).toISOString()})
|
|
92362
|
-
ON CONFLICT (turn_id) DO NOTHING
|
|
92363
|
-
`.pipe(require_Schema$1.orDie);
|
|
92364
|
-
const processEvent = (event) => require_Schema$1.gen(function* () {
|
|
92365
|
-
const settings = yield* serverSettings.getSettings.pipe(require_Schema$1.orDie);
|
|
92366
|
-
if (!settings.providers.cmmd.enabled || !settings.providers.cmmd.apiKey) return;
|
|
92367
|
-
const { threadId, turnId, completedAt } = event.payload;
|
|
92368
|
-
const turnPayload = yield* serializer.buildPayload(threadId, turnId, completedAt);
|
|
92369
|
-
yield* syncClient.syncTurn(turnPayload).pipe(require_Schema$1.catch_((err) => require_Schema$1.gen(function* () {
|
|
92370
|
-
yield* require_Schema$1.logWarning("CMMD sync: push failed, queuing for retry", {
|
|
92371
|
-
threadId,
|
|
92372
|
-
turnId,
|
|
92373
|
-
statusCode: err.statusCode
|
|
92374
|
-
});
|
|
92375
|
-
if (err.statusCode === 0 || err.statusCode >= 500) yield* enqueueForRetry(threadId, turnId, JSON.stringify(turnPayload));
|
|
92376
|
-
})));
|
|
92377
|
-
}).pipe(require_Schema$1.catchCause((cause) => require_Schema$1.logError("CMMD sync: unhandled error in turn watcher", {
|
|
92378
|
-
cause,
|
|
92379
|
-
threadId: event.payload.threadId,
|
|
92380
|
-
turnId: event.payload.turnId
|
|
92381
|
-
})));
|
|
92382
|
-
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);
|
|
92383
|
-
return { start };
|
|
92384
|
-
}));
|
|
92385
|
-
//#endregion
|
|
92386
|
-
//#region src/cmmdSync/SyncWorker.ts
|
|
92387
|
-
const MAX_ATTEMPTS = 5;
|
|
92388
|
-
const DRAIN_BATCH = 10;
|
|
92389
|
-
var CmmdSyncWorker = class extends require_Schema$1.Service()("forge/cmmdSync/CmmdSyncWorker") {};
|
|
92390
|
-
/**
|
|
92391
|
-
* Recovers rows that were set to 'in_flight' before a server crash.
|
|
92392
|
-
*
|
|
92393
|
-
* Exported so regression tests can call it directly through the test's SqlClient
|
|
92394
|
-
* (same ambient context) while verifying the exact production SQL path.
|
|
92395
|
-
* `start()` delegates to this constant.
|
|
92396
|
-
*/
|
|
92397
|
-
const resetOrphanedInFlightRows = require_Schema$1.gen(function* () {
|
|
92398
|
-
yield* (yield* require_SqlError.SqlClient)`
|
|
92399
|
-
UPDATE cmmd_session_sync_queue SET status = 'pending'
|
|
92400
|
-
WHERE status = 'in_flight'
|
|
92401
|
-
`.pipe(require_Schema$1.orDie);
|
|
92402
|
-
});
|
|
92403
|
-
const CmmdSyncWorkerLive = require_Schema$1.effect(CmmdSyncWorker, require_Schema$1.gen(function* () {
|
|
92404
|
-
const syncClient = yield* CmmdSyncClient;
|
|
92405
|
-
const serverSettings = yield* ServerSettingsService;
|
|
92406
|
-
const sql = yield* require_SqlError.SqlClient;
|
|
92407
|
-
const processRow = (row) => require_Schema$1.gen(function* () {
|
|
92408
|
-
yield* sql`
|
|
92409
|
-
UPDATE cmmd_session_sync_queue
|
|
92410
|
-
SET status = 'in_flight', attempt_count = attempt_count + 1, last_attempted_at = ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
92411
|
-
WHERE turn_id = ${row.turn_id}
|
|
92412
|
-
`.pipe(require_Schema$1.orDie);
|
|
92413
|
-
const payload = JSON.parse(row.payload_json);
|
|
92414
|
-
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* () {
|
|
92415
|
-
const isClientError = err.statusCode >= 400 && err.statusCode < 500;
|
|
92416
|
-
const exhausted = row.attempt_count + 1 >= MAX_ATTEMPTS;
|
|
92417
|
-
const nextStatus = isClientError || exhausted ? "failed" : "pending";
|
|
92418
|
-
yield* sql`
|
|
92419
|
-
UPDATE cmmd_session_sync_queue
|
|
92420
|
-
SET status = ${nextStatus}
|
|
92421
|
-
WHERE turn_id = ${row.turn_id}
|
|
92422
|
-
`.pipe(require_Schema$1.orDie);
|
|
92423
|
-
if (nextStatus === "failed") yield* require_Schema$1.logWarning("CMMD sync: turn permanently failed", {
|
|
92424
|
-
turnId: row.turn_id,
|
|
92425
|
-
threadId: row.thread_id,
|
|
92426
|
-
statusCode: err.statusCode,
|
|
92427
|
-
attempts: row.attempt_count + 1
|
|
92428
|
-
});
|
|
92429
|
-
})), require_Schema$1.catchCause((cause) => require_Schema$1.gen(function* () {
|
|
92430
|
-
const nextStatus = row.attempt_count + 1 >= MAX_ATTEMPTS ? "failed" : "pending";
|
|
92431
|
-
yield* sql`
|
|
92432
|
-
UPDATE cmmd_session_sync_queue
|
|
92433
|
-
SET status = ${nextStatus}
|
|
92434
|
-
WHERE turn_id = ${row.turn_id}
|
|
92435
|
-
`.pipe(require_Schema$1.orDie);
|
|
92436
|
-
yield* require_Schema$1.logError("CMMD sync: unhandled defect in processRow", {
|
|
92437
|
-
turnId: row.turn_id,
|
|
92438
|
-
threadId: row.thread_id,
|
|
92439
|
-
cause,
|
|
92440
|
-
nextStatus
|
|
92441
|
-
});
|
|
92442
|
-
})));
|
|
92443
|
-
});
|
|
92444
|
-
const drainQueue = require_Schema$1.gen(function* () {
|
|
92445
|
-
const settings = yield* serverSettings.getSettings.pipe(require_Schema$1.orDie);
|
|
92446
|
-
if (!settings.providers.cmmd.enabled || !settings.providers.cmmd.apiKey) return;
|
|
92447
|
-
const rows = yield* sql`
|
|
92448
|
-
SELECT turn_id, thread_id, payload_json, attempt_count
|
|
92449
|
-
FROM cmmd_session_sync_queue
|
|
92450
|
-
WHERE status = 'pending'
|
|
92451
|
-
ORDER BY created_at ASC
|
|
92452
|
-
LIMIT ${DRAIN_BATCH}
|
|
92453
|
-
`.pipe(require_Schema$1.orDie);
|
|
92454
|
-
yield* require_Schema$1.forEach(rows, processRow, { concurrency: 1 });
|
|
92455
|
-
});
|
|
92456
|
-
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)));
|
|
92457
|
-
return { start };
|
|
92458
|
-
}));
|
|
92459
|
-
//#endregion
|
|
92460
92244
|
//#region src/runtimeReplication/Services/RuntimeReplication.ts
|
|
92461
92245
|
var RuntimeReplication = class extends require_Schema$1.Service()("forge/runtimeReplication/Services/RuntimeReplication") {};
|
|
92462
92246
|
//#endregion
|
|
@@ -92925,8 +92709,33 @@ const replicaEventKinds = new Set([
|
|
|
92925
92709
|
"activity_summary",
|
|
92926
92710
|
"turn_status",
|
|
92927
92711
|
"error_summary",
|
|
92928
|
-
"tool_call"
|
|
92712
|
+
"tool_call",
|
|
92713
|
+
"turn_usage"
|
|
92929
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
|
+
}
|
|
92930
92739
|
const replicaTurnStatuses$1 = new Set([
|
|
92931
92740
|
"pending",
|
|
92932
92741
|
"running",
|
|
@@ -92946,9 +92755,10 @@ function hasEventPayloadKey(value) {
|
|
|
92946
92755
|
return value.kind !== "tool_call" || "payload" in value;
|
|
92947
92756
|
}
|
|
92948
92757
|
function hasValidEventFields(value) {
|
|
92949
|
-
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);
|
|
92950
92759
|
}
|
|
92951
92760
|
function hasValidEventPayload(value) {
|
|
92761
|
+
if (value.kind === "turn_usage") return hasValidTurnUsagePayload(value);
|
|
92952
92762
|
if (value.kind === "turn_status") return value.text === null && value.status !== null;
|
|
92953
92763
|
if (value.kind === "tool_call") return isNonBlankString(value.text) && value.status !== null;
|
|
92954
92764
|
return isNonBlankString(value.text) && value.status === null;
|
|
@@ -93055,28 +92865,41 @@ const REPLICA_MESSAGE_ID_PREFIX = "replica-source-v1:";
|
|
|
93055
92865
|
function isReservedReplicaSourceMessageId(value) {
|
|
93056
92866
|
return value.startsWith(REPLICA_MESSAGE_ID_PREFIX);
|
|
93057
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
|
+
*/
|
|
93058
92875
|
function encodeReplicaSourceMessageId(input) {
|
|
93059
|
-
|
|
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;
|
|
93060
92883
|
}
|
|
93061
92884
|
function decodeReplicaSourceMessageId(value) {
|
|
93062
92885
|
if (!value.startsWith(REPLICA_MESSAGE_ID_PREFIX)) return null;
|
|
93063
|
-
const
|
|
93064
|
-
|
|
93065
|
-
|
|
93066
|
-
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);
|
|
93067
92889
|
if (!Number.isSafeInteger(sequence) || sequence <= 0) return null;
|
|
93068
|
-
|
|
93069
|
-
|
|
93070
|
-
|
|
93071
|
-
|
|
93072
|
-
|
|
93073
|
-
|
|
93074
|
-
|
|
93075
|
-
|
|
93076
|
-
|
|
93077
|
-
|
|
93078
|
-
|
|
93079
|
-
|
|
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
|
+
};
|
|
93080
92903
|
}
|
|
93081
92904
|
var RuntimeThreadHistoryConflict = class extends Error {
|
|
93082
92905
|
constructor(message) {
|
|
@@ -93094,22 +92917,50 @@ function runtimeThreadFinalGenerationId(runtimeId, streamKey, events) {
|
|
|
93094
92917
|
const projectionHash = node_crypto.createHash("sha256").update(JSON.stringify(events)).digest("base64url");
|
|
93095
92918
|
return `${runtimeThreadGenerationId(runtimeId, streamKey)}:final:${projectionHash}`;
|
|
93096
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
|
+
*/
|
|
93097
92941
|
function canonicalEventPayload(event) {
|
|
93098
92942
|
return JSON.stringify({
|
|
93099
92943
|
sequence: event.sequence,
|
|
93100
92944
|
eventId: event.eventId,
|
|
93101
92945
|
occurredAt: event.occurredAt,
|
|
93102
92946
|
kind: event.kind,
|
|
93103
|
-
...event
|
|
93104
|
-
...event.
|
|
93105
|
-
...event.kind === "turn_status" ? { status: event.status } : {},
|
|
93106
|
-
...event.kind === "tool_call" ? {
|
|
93107
|
-
summary: event.summary,
|
|
93108
|
-
status: event.status,
|
|
93109
|
-
...event.payload !== void 0 ? { payload: event.payload } : {}
|
|
93110
|
-
} : {}
|
|
92947
|
+
...canonicalKindFields(event),
|
|
92948
|
+
...event.turnId !== void 0 ? { turnId: event.turnId } : {}
|
|
93111
92949
|
});
|
|
93112
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
|
+
}
|
|
93113
92964
|
function hashRuntimeThreadEvent(event) {
|
|
93114
92965
|
return sha256$3(canonicalEventPayload(event));
|
|
93115
92966
|
}
|
|
@@ -93230,7 +93081,8 @@ function replicaMessage(runtimeId, generationId, event) {
|
|
|
93230
93081
|
id: MessageId.make(encodeReplicaSourceMessageId({
|
|
93231
93082
|
sequence: event.sequence,
|
|
93232
93083
|
scope: stableReplicaDigest(runtimeId, generationId),
|
|
93233
|
-
eventId: event.eventId
|
|
93084
|
+
eventId: event.eventId,
|
|
93085
|
+
turnId: event.turnId ?? null
|
|
93234
93086
|
})),
|
|
93235
93087
|
role: event.kind === "user_message" ? "user" : "assistant",
|
|
93236
93088
|
text: event.text ?? "",
|
|
@@ -93240,11 +93092,33 @@ function replicaMessage(runtimeId, generationId, event) {
|
|
|
93240
93092
|
updatedAt: event.occurredAt
|
|
93241
93093
|
};
|
|
93242
93094
|
}
|
|
93243
|
-
function
|
|
93244
|
-
const
|
|
93095
|
+
function replicaTurnUsage(event) {
|
|
93096
|
+
const payload = event.payload;
|
|
93097
|
+
return {
|
|
93245
93098
|
eventId: event.eventId,
|
|
93246
|
-
occurredAt: event.occurredAt
|
|
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
|
+
}
|
|
93247
93111
|
};
|
|
93112
|
+
}
|
|
93113
|
+
function replicaEventBase(event) {
|
|
93114
|
+
const turn = typeof event.turnId === "string" ? { turnId: event.turnId } : {};
|
|
93115
|
+
return {
|
|
93116
|
+
eventId: event.eventId,
|
|
93117
|
+
occurredAt: event.occurredAt,
|
|
93118
|
+
...turn
|
|
93119
|
+
};
|
|
93120
|
+
}
|
|
93121
|
+
function replicaTextEvent(event, base) {
|
|
93248
93122
|
switch (event.kind) {
|
|
93249
93123
|
case "user_message":
|
|
93250
93124
|
case "assistant_message": return {
|
|
@@ -93258,31 +93132,50 @@ function replicaSourceEvent(event) {
|
|
|
93258
93132
|
kind: event.kind,
|
|
93259
93133
|
summary: event.text
|
|
93260
93134
|
};
|
|
93261
|
-
|
|
93262
|
-
...base,
|
|
93263
|
-
kind: event.kind,
|
|
93264
|
-
status: event.status
|
|
93265
|
-
};
|
|
93266
|
-
case "tool_call": return {
|
|
93267
|
-
...base,
|
|
93268
|
-
kind: event.kind,
|
|
93269
|
-
summary: event.text,
|
|
93270
|
-
status: event.status,
|
|
93271
|
-
payload: event.payload ?? void 0
|
|
93272
|
-
};
|
|
93135
|
+
default: return null;
|
|
93273
93136
|
}
|
|
93274
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
|
+
}
|
|
93275
93168
|
function replicaActivity(runtimeId, generationId, event) {
|
|
93276
|
-
const summary = event.kind === "turn_status" ? event.status ?? "unknown" : event.text ?? "";
|
|
93277
93169
|
return {
|
|
93278
93170
|
id: EventId.make("replica:" + stableReplicaDigest(runtimeId, generationId, event.eventId, "activity")),
|
|
93279
|
-
tone: event
|
|
93171
|
+
tone: replicaActivityTone(event),
|
|
93280
93172
|
kind: "replica." + event.kind,
|
|
93281
|
-
summary,
|
|
93173
|
+
summary: replicaActivitySummary(event),
|
|
93282
93174
|
payload: {
|
|
93283
93175
|
sourceEventId: event.eventId,
|
|
93284
93176
|
sourceGenerationId: generationId,
|
|
93285
93177
|
sourceRuntimeId: runtimeId,
|
|
93178
|
+
sourceTurnId: typeof event.turnId === "string" ? event.turnId : null,
|
|
93286
93179
|
status: event.status,
|
|
93287
93180
|
text: event.text,
|
|
93288
93181
|
payload: event.payload
|
|
@@ -94010,8 +93903,6 @@ const makeServerRuntimeStartup = require_Schema$1.gen(function* () {
|
|
|
94010
93903
|
const serverConfig = yield* ServerConfig;
|
|
94011
93904
|
const keybindings = yield* Keybindings;
|
|
94012
93905
|
const orchestrationReactor = yield* OrchestrationReactor;
|
|
94013
|
-
const turnCompletionWatcher = yield* TurnCompletionWatcher;
|
|
94014
|
-
const cmmdSyncWorker = yield* CmmdSyncWorker;
|
|
94015
93906
|
const runtimeReplication = yield* RuntimeReplication;
|
|
94016
93907
|
const localAutomationRunReconciler = yield* LocalAutomationRunReconciler;
|
|
94017
93908
|
const agentProtocol = yield* AgentProtocolReactor;
|
|
@@ -94048,8 +93939,6 @@ const makeServerRuntimeStartup = require_Schema$1.gen(function* () {
|
|
|
94048
93939
|
yield* runStartupPhase("reactors.start", orchestrationReactor.start().pipe(require_Schema$1.provide$2(reactorScope)));
|
|
94049
93940
|
yield* require_Schema$1.logDebug("startup phase: reconciling local automation runs");
|
|
94050
93941
|
yield* runStartupPhase("local-automations.reconcile", localAutomationRunReconciler.start().pipe(require_Schema$1.provide$2(reactorScope)));
|
|
94051
|
-
yield* require_Schema$1.logDebug("startup phase: starting CMMD session sync");
|
|
94052
|
-
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));
|
|
94053
93942
|
yield* require_Schema$1.logDebug("startup phase: starting CMMD runtime replication");
|
|
94054
93943
|
yield* runStartupPhase("runtime-replication.start", runtimeReplication.start().pipe(require_Schema$1.provide$2(reactorScope)));
|
|
94055
93944
|
yield* require_Schema$1.logDebug("startup phase: starting CMMD pipeline reactors");
|
|
@@ -94383,36 +94272,92 @@ function finiteNumber$1(value) {
|
|
|
94383
94272
|
* Entries without both an input and an output rate are dropped: a half-priced
|
|
94384
94273
|
* model would silently under-report cost, which is worse than reporting the
|
|
94385
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.
|
|
94386
94281
|
*/
|
|
94387
94282
|
function parseRateTable(document) {
|
|
94388
94283
|
const table = /* @__PURE__ */ new Map();
|
|
94389
94284
|
if (typeof document !== "object" || document === null) return table;
|
|
94390
94285
|
for (const [name, raw] of Object.entries(document)) {
|
|
94391
|
-
|
|
94392
|
-
const
|
|
94393
|
-
|
|
94394
|
-
|
|
94395
|
-
if (input === null || output === null) continue;
|
|
94396
|
-
table.set(normalizeModelName(name), {
|
|
94397
|
-
inputCostPerToken: input,
|
|
94398
|
-
outputCostPerToken: output,
|
|
94399
|
-
cacheReadCostPerToken: finiteNumber$1(entry.cache_read_input_token_cost) ?? input,
|
|
94400
|
-
cacheCreationCostPerToken: finiteNumber$1(entry.cache_creation_input_token_cost) ?? input
|
|
94401
|
-
});
|
|
94286
|
+
const rate = readRate(raw);
|
|
94287
|
+
const key = normalizeRateKey(name);
|
|
94288
|
+
if (rate === null || key.length === 0) continue;
|
|
94289
|
+
table.set(key, rate);
|
|
94402
94290
|
}
|
|
94291
|
+
addBareNameAliases(table);
|
|
94403
94292
|
return table;
|
|
94404
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
|
+
}
|
|
94405
94308
|
/**
|
|
94406
|
-
*
|
|
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`.
|
|
94407
94311
|
*
|
|
94408
|
-
*
|
|
94409
|
-
*
|
|
94410
|
-
|
|
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.
|
|
94314
|
+
*/
|
|
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.
|
|
94411
94357
|
*/
|
|
94412
|
-
function
|
|
94413
|
-
const
|
|
94414
|
-
|
|
94415
|
-
return slash === -1 ? trimmed : trimmed.slice(slash + 1);
|
|
94358
|
+
function stripVariantSuffix(key) {
|
|
94359
|
+
const bracket = key.indexOf("[");
|
|
94360
|
+
return bracket === -1 ? key : key.slice(0, bracket);
|
|
94416
94361
|
}
|
|
94417
94362
|
/**
|
|
94418
94363
|
* Models we never price, regardless of the table.
|
|
@@ -94430,9 +94375,10 @@ const UNPRICEABLE_MODELS = new Set([
|
|
|
94430
94375
|
"fable"
|
|
94431
94376
|
]);
|
|
94432
94377
|
function lookupRate(table, model) {
|
|
94433
|
-
const
|
|
94434
|
-
|
|
94435
|
-
|
|
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;
|
|
94436
94382
|
}
|
|
94437
94383
|
/**
|
|
94438
94384
|
* Prices a bucket's tokens.
|
|
@@ -94719,7 +94665,15 @@ async function readTranscriptRecords(filePath, provider) {
|
|
|
94719
94665
|
}
|
|
94720
94666
|
//#endregion
|
|
94721
94667
|
//#region src/usage/usageScanCache.ts
|
|
94722
|
-
|
|
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;
|
|
94723
94677
|
/** Appends `value` to `table` unless it is already there, returning its index. */
|
|
94724
94678
|
function intern(table, index, value) {
|
|
94725
94679
|
const existing = index.get(value);
|
|
@@ -94771,7 +94725,7 @@ function isStringTable(value) {
|
|
|
94771
94725
|
*
|
|
94772
94726
|
* The intern tables must be all strings: a numeric entry would pass the
|
|
94773
94727
|
* per-record undefined guard, land in a record's model, and crash the aggregate
|
|
94774
|
-
*
|
|
94728
|
+
* when that model is priced. A corrupt table rejects the whole cache.
|
|
94775
94729
|
*/
|
|
94776
94730
|
function decodeEnvelope$1(document) {
|
|
94777
94731
|
if (typeof document !== "object" || document === null) return null;
|
|
@@ -94936,7 +94890,7 @@ const RATES_CACHE_FILE = "usage-model-rates.json";
|
|
|
94936
94890
|
const SCAN_CACHE_FILE = "usage-scan-cache.json";
|
|
94937
94891
|
var UsageService = class extends require_Schema$1.Service()("forge/usage/UsageService") {};
|
|
94938
94892
|
require_Schema$1.succeed$1(UsageService, UsageService.of({ readSummary: (input) => require_Schema$1.succeed({
|
|
94939
|
-
contractVersion:
|
|
94893
|
+
contractVersion: 2,
|
|
94940
94894
|
readAt: "1970-01-01T00:00:00.000Z",
|
|
94941
94895
|
timeZone: input.timeZone,
|
|
94942
94896
|
sinceDay: input.sinceDay,
|
|
@@ -95216,7 +95170,7 @@ const make$15 = require_Schema$1.gen(function* () {
|
|
|
95216
95170
|
const readAt = yield* require_Schema$1.now;
|
|
95217
95171
|
const finishedAtMs = yield* require_Schema$1.currentTimeMillis;
|
|
95218
95172
|
return {
|
|
95219
|
-
contractVersion:
|
|
95173
|
+
contractVersion: 2,
|
|
95220
95174
|
readAt: require_Schema$1.formatIso(readAt),
|
|
95221
95175
|
timeZone: input.timeZone,
|
|
95222
95176
|
sinceDay: input.sinceDay,
|
|
@@ -108622,7 +108576,7 @@ const postgresSchemaStatements = [
|
|
|
108622
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 )",
|
|
108623
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 )",
|
|
108624
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 )",
|
|
108625
|
-
"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)",
|
|
108626
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)",
|
|
108627
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)",
|
|
108628
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)",
|
|
@@ -108893,7 +108847,8 @@ const postgresUpgradeMigrations = new Map([
|
|
|
108893
108847
|
thread_id TEXT NOT NULL PRIMARY KEY,
|
|
108894
108848
|
detail TEXT NOT NULL,
|
|
108895
108849
|
quarantined_at TEXT NOT NULL
|
|
108896
|
-
)`]]
|
|
108850
|
+
)`]],
|
|
108851
|
+
[74, [`ALTER TABLE projection_projects ADD COLUMN IF NOT EXISTS cmmd_registration_json TEXT`]]
|
|
108897
108852
|
]);
|
|
108898
108853
|
function requirePostgresUpgradeStatements(version) {
|
|
108899
108854
|
const statements = postgresUpgradeMigrations.get(version);
|
|
@@ -108919,15 +108874,15 @@ const runPostgresMigrations = require_Schema$1.fn("runPostgresMigrations")(funct
|
|
|
108919
108874
|
ORDER BY version DESC
|
|
108920
108875
|
LIMIT 1
|
|
108921
108876
|
`)[0]?.version ?? 0;
|
|
108922
|
-
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.`));
|
|
108923
108878
|
if (currentVersion === 0) {
|
|
108924
108879
|
for (const statement of postgresSchemaStatements) yield* sql.unsafe(statement);
|
|
108925
108880
|
yield* sql`
|
|
108926
108881
|
INSERT INTO forge_schema_migrations (version)
|
|
108927
|
-
VALUES (${
|
|
108882
|
+
VALUES (${74})
|
|
108928
108883
|
ON CONFLICT (version) DO NOTHING
|
|
108929
108884
|
`;
|
|
108930
|
-
} else for (let version = currentVersion + 1; version <=
|
|
108885
|
+
} else for (let version = currentVersion + 1; version <= 74; version += 1) {
|
|
108931
108886
|
const statements = yield* require_Schema$1.sync(() => requirePostgresUpgradeStatements(version));
|
|
108932
108887
|
for (const statement of statements) yield* sql.unsafe(statement);
|
|
108933
108888
|
yield* sql`
|
|
@@ -111586,6 +111541,31 @@ var _073_ReplicaThreadQuarantine_default = require_Schema$1.gen(function* () {
|
|
|
111586
111541
|
`;
|
|
111587
111542
|
});
|
|
111588
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
|
|
111589
111569
|
//#region src/persistence/Migrations.ts
|
|
111590
111570
|
/**
|
|
111591
111571
|
* MigrationsLive - Migration runner with inline loader
|
|
@@ -111971,6 +111951,11 @@ const migrationEntries = [
|
|
|
111971
111951
|
73,
|
|
111972
111952
|
"ReplicaThreadQuarantine",
|
|
111973
111953
|
_073_ReplicaThreadQuarantine_default
|
|
111954
|
+
],
|
|
111955
|
+
[
|
|
111956
|
+
74,
|
|
111957
|
+
"ProjectCmmdRegistration",
|
|
111958
|
+
_074_ProjectCmmdRegistration_default
|
|
111974
111959
|
]
|
|
111975
111960
|
];
|
|
111976
111961
|
const makeMigrationLoader = (throughId) => fromRecord(Object.fromEntries(migrationEntries.filter(([id]) => throughId === void 0 || id <= throughId).map(([id, name, migration]) => [`${id}_${name}`, migration])));
|
|
@@ -204622,13 +204607,45 @@ function mapCodexThreadNameUpdatedEvent(event, canonicalThreadId, payload) {
|
|
|
204622
204607
|
}
|
|
204623
204608
|
}];
|
|
204624
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
|
+
}
|
|
204625
204637
|
function mapCodexThreadTokenUsageEvent(event, canonicalThreadId, payload) {
|
|
204626
|
-
const
|
|
204638
|
+
const tokenUsage = asObject$2(payload?.tokenUsage);
|
|
204639
|
+
const normalizedUsage = normalizeCodexTokenUsage(tokenUsage ?? event.payload);
|
|
204627
204640
|
if (!normalizedUsage) return [];
|
|
204641
|
+
const turnUsage = codexTurnUsageDelta(tokenUsage ?? event.payload);
|
|
204628
204642
|
return [{
|
|
204629
204643
|
type: "thread.token-usage.updated",
|
|
204630
204644
|
...runtimeEventBase(event, canonicalThreadId),
|
|
204631
|
-
payload: {
|
|
204645
|
+
payload: {
|
|
204646
|
+
usage: normalizedUsage,
|
|
204647
|
+
...turnUsage ? { turnUsage } : {}
|
|
204648
|
+
}
|
|
204632
204649
|
}];
|
|
204633
204650
|
}
|
|
204634
204651
|
const codexThreadMethodMappers = {
|
|
@@ -207257,6 +207274,29 @@ function finiteNumberField(usage, key) {
|
|
|
207257
207274
|
function finiteNumberFieldOrZero(usage, key) {
|
|
207258
207275
|
return finiteNumberField(usage, key) ?? 0;
|
|
207259
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
|
+
}
|
|
207260
207300
|
function normalizedClaudeInputTokens(usage) {
|
|
207261
207301
|
return finiteNumberFieldOrZero(usage, "input_tokens") + finiteNumberFieldOrZero(usage, "cache_creation_input_tokens") + finiteNumberFieldOrZero(usage, "cache_read_input_tokens");
|
|
207262
207302
|
}
|
|
@@ -207900,8 +207940,9 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207900
207940
|
}
|
|
207901
207941
|
});
|
|
207902
207942
|
});
|
|
207903
|
-
const emitTurnUsageUpdated = require_Schema$1.fn("emitTurnUsageUpdated")(function* (context, turnState, usageSnapshot) {
|
|
207943
|
+
const emitTurnUsageUpdated = require_Schema$1.fn("emitTurnUsageUpdated")(function* (context, turnState, usageSnapshot, result) {
|
|
207904
207944
|
if (!usageSnapshot) return;
|
|
207945
|
+
const turnUsage = claudeTurnUsageTotal(result?.usage);
|
|
207905
207946
|
const usageStamp = yield* makeEventStamp();
|
|
207906
207947
|
yield* offerRuntimeEvent({
|
|
207907
207948
|
type: "thread.token-usage.updated",
|
|
@@ -207910,7 +207951,10 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207910
207951
|
createdAt: usageStamp.createdAt,
|
|
207911
207952
|
threadId: context.session.threadId,
|
|
207912
207953
|
...turnState ? { turnId: turnState.turnId } : {},
|
|
207913
|
-
payload: {
|
|
207954
|
+
payload: {
|
|
207955
|
+
usage: usageSnapshot,
|
|
207956
|
+
...turnUsage ? { turnUsage } : {}
|
|
207957
|
+
},
|
|
207914
207958
|
providerRefs: turnState ? nativeProviderRefs(context) : {}
|
|
207915
207959
|
});
|
|
207916
207960
|
});
|
|
@@ -207928,7 +207972,7 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207928
207972
|
});
|
|
207929
207973
|
});
|
|
207930
207974
|
const emitTurnCompletionWithoutActiveTurn = require_Schema$1.fn("emitTurnCompletionWithoutActiveTurn")(function* (context, status, errorMessage, result, usageSnapshot) {
|
|
207931
|
-
yield* emitTurnUsageUpdated(context, void 0, usageSnapshot);
|
|
207975
|
+
yield* emitTurnUsageUpdated(context, void 0, usageSnapshot, result);
|
|
207932
207976
|
yield* emitTurnCompleted(context, void 0, status, errorMessage, result);
|
|
207933
207977
|
});
|
|
207934
207978
|
const completeInFlightTools = require_Schema$1.fn("completeInFlightTools")(function* (context, turnState, status, result) {
|
|
@@ -207992,7 +208036,7 @@ const makeClaudeAdapter = require_Schema$1.fn("makeClaudeAdapter")(function* (op
|
|
|
207992
208036
|
yield* completeInFlightTools(context, turnState, status, result);
|
|
207993
208037
|
yield* completePendingAssistantTextBlocks(context, turnState, status, result);
|
|
207994
208038
|
recordCompletedTurn(context, turnState);
|
|
207995
|
-
yield* emitTurnUsageUpdated(context, turnState, usageSnapshot);
|
|
208039
|
+
yield* emitTurnUsageUpdated(context, turnState, usageSnapshot, result);
|
|
207996
208040
|
yield* emitTurnCompleted(context, turnState, status, errorMessage, result);
|
|
207997
208041
|
yield* finalizeTurnSession(context, status, errorMessage);
|
|
207998
208042
|
});
|
|
@@ -277782,6 +277826,83 @@ var PlanTaskCreationReactor = class extends require_Schema$1.Service()("forge/or
|
|
|
277782
277826
|
*/
|
|
277783
277827
|
var SpriteTaskHoldReactor = class extends require_Schema$1.Service()("forge/orchestration/Services/SpriteTaskHoldReactor") {};
|
|
277784
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
|
|
277785
277906
|
//#region src/orchestration/Layers/OrchestrationReactor.ts
|
|
277786
277907
|
const RETENTION_SWEEP_INTERVAL_MS = 300 * 1e3;
|
|
277787
277908
|
const makeOrchestrationReactor = require_Schema$1.gen(function* () {
|
|
@@ -280358,7 +280479,10 @@ function threadEventToActivities(event) {
|
|
|
280358
280479
|
tone: "info",
|
|
280359
280480
|
kind: "context-window.updated",
|
|
280360
280481
|
summary: "Context window updated",
|
|
280361
|
-
payload
|
|
280482
|
+
payload: {
|
|
280483
|
+
...payload,
|
|
280484
|
+
...event.payload.turnUsage ? { turnUsage: event.payload.turnUsage } : {}
|
|
280485
|
+
}
|
|
280362
280486
|
}] : [];
|
|
280363
280487
|
}
|
|
280364
280488
|
default: return;
|
|
@@ -285043,14 +285167,87 @@ const writeProviderStatusCache = (input) => {
|
|
|
285043
285167
|
})));
|
|
285044
285168
|
};
|
|
285045
285169
|
//#endregion
|
|
285046
|
-
//#region
|
|
285170
|
+
//#region ../../packages/shared/src/providerExecution.ts
|
|
285047
285171
|
/**
|
|
285048
|
-
*
|
|
285049
|
-
*
|
|
285050
|
-
*
|
|
285051
|
-
*
|
|
285172
|
+
* Canonical provider-readiness gate for starting work.
|
|
285173
|
+
*
|
|
285174
|
+
* Cloud user VMs can execute through Forge's scoped provider proxy without a
|
|
285175
|
+
* provider-local login. In that case the provider reports unauthenticated but
|
|
285176
|
+
* its credential provenance is explicitly `proxied`.
|
|
285052
285177
|
*/
|
|
285053
|
-
|
|
285178
|
+
function isServerProviderExecutable(provider) {
|
|
285179
|
+
const hasExecutionAuthority = provider.auth.status !== "unauthenticated" || provider.auth.provenance?.credentialScope === "proxied";
|
|
285180
|
+
return provider.enabled && provider.installed && provider.status === "ready" && hasExecutionAuthority && provider.models.length > 0;
|
|
285181
|
+
}
|
|
285182
|
+
//#endregion
|
|
285183
|
+
//#region src/provider/providerAvailability.ts
|
|
285184
|
+
/**
|
|
285185
|
+
* Derive what this Environment knows about a provider's availability.
|
|
285186
|
+
*
|
|
285187
|
+
* WHY THIS EXISTS
|
|
285188
|
+
*
|
|
285189
|
+
* Four different states (Unbuilt, Not Offered, Not Usable, Not on this
|
|
285190
|
+
* Environment) used to render as one "Coming soon." string, because consumers
|
|
285191
|
+
* were handed a filtered list and had to infer meaning from what was missing.
|
|
285192
|
+
* Every provider is now published with an explicit availability and, when
|
|
285193
|
+
* withheld, its reason. See `docs/adr/withheld-providers-carry-their-reason.md`
|
|
285194
|
+
* and the glossary in `CONTEXT.md` section "Provider availability".
|
|
285195
|
+
*
|
|
285196
|
+
* WHAT AN ENVIRONMENT MAY SAY
|
|
285197
|
+
*
|
|
285198
|
+
* Three of the four reasons only. Not Offered is a fact about the CMMD
|
|
285199
|
+
* organization's Provider Offer, and delivery-pending is a fact about a
|
|
285200
|
+
* credential in flight; neither is visible from inside an Environment, so the
|
|
285201
|
+
* Shell adds them when it joins. Nothing here may invent them.
|
|
285202
|
+
*
|
|
285203
|
+
* This reads the snapshot a provider Layer already produced. It runs no probe
|
|
285204
|
+
* and changes no probe: `isServerProviderExecutable` stays the single gate on
|
|
285205
|
+
* whether a turn can be dispatched, and this restates its answer in the
|
|
285206
|
+
* vocabulary a person sees.
|
|
285207
|
+
*/
|
|
285208
|
+
/**
|
|
285209
|
+
* Providers Forge ships in the UI but cannot execute, published as Unbuilt.
|
|
285210
|
+
*
|
|
285211
|
+
* Empty in this build: codex, claudeAgent, ollama, cmmd, apex, cursor and
|
|
285212
|
+
* opencode all have a real detection Layer and a registered adapter. The list
|
|
285213
|
+
* stays as the one place a provider that ships ahead of its server-side
|
|
285214
|
+
* implementation is named, so "Coming soon." is a deliberate entry rather than
|
|
285215
|
+
* a fallback something fell into.
|
|
285216
|
+
*/
|
|
285217
|
+
const UNBUILT_PROVIDERS = [];
|
|
285218
|
+
function deriveProviderAvailability(provider, unbuiltProviders = UNBUILT_PROVIDERS) {
|
|
285219
|
+
if (unbuiltProviders.includes(provider.provider)) return {
|
|
285220
|
+
availability: "unavailable",
|
|
285221
|
+
unavailableReason: "unbuilt"
|
|
285222
|
+
};
|
|
285223
|
+
if (isServerProviderExecutable(provider)) return { availability: "available" };
|
|
285224
|
+
const hasProxiedCredential = provider.auth.provenance?.credentialScope === "proxied";
|
|
285225
|
+
if (provider.installed && provider.auth.status === "unauthenticated" && !hasProxiedCredential) return {
|
|
285226
|
+
availability: "unavailable",
|
|
285227
|
+
unavailableReason: "not-usable",
|
|
285228
|
+
unavailableDetail: "no-connection"
|
|
285229
|
+
};
|
|
285230
|
+
return {
|
|
285231
|
+
availability: "unavailable",
|
|
285232
|
+
unavailableReason: "not-on-this-environment"
|
|
285233
|
+
};
|
|
285234
|
+
}
|
|
285235
|
+
/**
|
|
285236
|
+
* Stamp a snapshot with its derived availability.
|
|
285237
|
+
*
|
|
285238
|
+
* The previous fields are dropped before the new ones are applied. Merging
|
|
285239
|
+
* would leave a provider that just connected reporting `available` while still
|
|
285240
|
+
* carrying the reason it was withheld for.
|
|
285241
|
+
*/
|
|
285242
|
+
function withProviderAvailability(provider, unbuiltProviders = UNBUILT_PROVIDERS) {
|
|
285243
|
+
const { availability: _availability, unavailableReason: _unavailableReason, unavailableDetail: _unavailableDetail, ...rest } = provider;
|
|
285244
|
+
return {
|
|
285245
|
+
...rest,
|
|
285246
|
+
...deriveProviderAvailability(provider, unbuiltProviders)
|
|
285247
|
+
};
|
|
285248
|
+
}
|
|
285249
|
+
//#endregion
|
|
285250
|
+
//#region src/provider/Layers/ProviderRegistry.ts
|
|
285054
285251
|
const loadProviders = (codexProvider, claudeProvider, ollamaProvider, cmmdProvider, apexProvider, cursorProvider, opencodeProvider) => require_Schema$1.all([
|
|
285055
285252
|
codexProvider.getSnapshot,
|
|
285056
285253
|
claudeProvider.getSnapshot,
|
|
@@ -285087,9 +285284,9 @@ const ProviderRegistryLive = require_Schema$1.effect(ProviderRegistry, require_S
|
|
|
285087
285284
|
cachedProvider,
|
|
285088
285285
|
fallbackProvider
|
|
285089
285286
|
});
|
|
285090
|
-
return
|
|
285287
|
+
return UNBUILT_PROVIDERS.includes(provider) ? fallbackProvider : void 0;
|
|
285091
285288
|
}));
|
|
285092
|
-
}, { concurrency: "unbounded" }).pipe(require_Schema$1.map((providers) => orderProviderSnapshots(providers.filter((provider) => provider !== void 0))));
|
|
285289
|
+
}, { concurrency: "unbounded" }).pipe(require_Schema$1.map((providers) => orderProviderSnapshots(providers.filter((provider) => provider !== void 0).map((provider) => withProviderAvailability(provider)))));
|
|
285093
285290
|
const providersRef = yield* require_HttpServer.make$3(cachedProviders);
|
|
285094
285291
|
const persistProvider = (provider) => writeProviderStatusCache({
|
|
285095
285292
|
filePath: cachePathByProvider.get(provider.provider),
|
|
@@ -285098,7 +285295,8 @@ const ProviderRegistryLive = require_Schema$1.effect(ProviderRegistry, require_S
|
|
|
285098
285295
|
provider: provider.provider,
|
|
285099
285296
|
error
|
|
285100
285297
|
})), require_Schema$1.ignore);
|
|
285101
|
-
const upsertProviders = require_Schema$1.fn("upsertProviders")(function* (
|
|
285298
|
+
const upsertProviders = require_Schema$1.fn("upsertProviders")(function* (incomingProviders, options) {
|
|
285299
|
+
const nextProviders = incomingProviders.map((provider) => withProviderAvailability(provider));
|
|
285102
285300
|
const [previousProviders, providers] = yield* require_HttpServer.modify(providersRef, (previousProviders) => {
|
|
285103
285301
|
const mergedProviders = new Map(previousProviders.map((provider) => [provider.provider, provider]));
|
|
285104
285302
|
for (const provider of nextProviders) mergedProviders.set(provider.provider, provider);
|
|
@@ -286654,6 +286852,7 @@ const ProjectCheckoutDeletionLive = require_Schema$1.effect(ProjectCheckoutDelet
|
|
|
286654
286852
|
//#region src/persistence/Layers/ProjectionProjects.ts
|
|
286655
286853
|
const ProjectionProjectDbRow = ProjectionProject.mapFields(require_Schema$1.assign({
|
|
286656
286854
|
defaultModelSelection: require_Schema$1.NullOr(require_Schema$1.fromJsonString(ModelSelection)),
|
|
286855
|
+
cmmdRegistration: require_Schema$1.NullOr(require_Schema$1.fromJsonString(CmmdRegistration)),
|
|
286657
286856
|
scripts: require_Schema$1.fromJsonString(require_Schema$1.ArraySchema(ProjectScript))
|
|
286658
286857
|
}));
|
|
286659
286858
|
const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
@@ -286667,6 +286866,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286667
286866
|
workspace_root,
|
|
286668
286867
|
default_model_selection_json,
|
|
286669
286868
|
default_thread_env_mode,
|
|
286869
|
+
cmmd_registration_json,
|
|
286670
286870
|
scripts_json,
|
|
286671
286871
|
created_at,
|
|
286672
286872
|
updated_at,
|
|
@@ -286678,6 +286878,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286678
286878
|
${row.workspaceRoot},
|
|
286679
286879
|
${row.defaultModelSelection !== null ? JSON.stringify(row.defaultModelSelection) : null},
|
|
286680
286880
|
${row.defaultThreadEnvMode},
|
|
286881
|
+
${row.cmmdRegistration !== null ? JSON.stringify(row.cmmdRegistration) : null},
|
|
286681
286882
|
${JSON.stringify(row.scripts)},
|
|
286682
286883
|
${row.createdAt},
|
|
286683
286884
|
${row.updatedAt},
|
|
@@ -286689,6 +286890,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286689
286890
|
workspace_root = excluded.workspace_root,
|
|
286690
286891
|
default_model_selection_json = excluded.default_model_selection_json,
|
|
286691
286892
|
default_thread_env_mode = excluded.default_thread_env_mode,
|
|
286893
|
+
cmmd_registration_json = excluded.cmmd_registration_json,
|
|
286692
286894
|
scripts_json = excluded.scripts_json,
|
|
286693
286895
|
created_at = excluded.created_at,
|
|
286694
286896
|
updated_at = excluded.updated_at,
|
|
@@ -286705,6 +286907,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286705
286907
|
workspace_root AS "workspaceRoot",
|
|
286706
286908
|
default_model_selection_json AS "defaultModelSelection",
|
|
286707
286909
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
286910
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
286708
286911
|
scripts_json AS "scripts",
|
|
286709
286912
|
created_at AS "createdAt",
|
|
286710
286913
|
updated_at AS "updatedAt",
|
|
@@ -286723,6 +286926,7 @@ const makeProjectionProjectRepository = require_Schema$1.gen(function* () {
|
|
|
286723
286926
|
workspace_root AS "workspaceRoot",
|
|
286724
286927
|
default_model_selection_json AS "defaultModelSelection",
|
|
286725
286928
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
286929
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
286726
286930
|
scripts_json AS "scripts",
|
|
286727
286931
|
created_at AS "createdAt",
|
|
286728
286932
|
updated_at AS "updatedAt",
|
|
@@ -287887,7 +288091,7 @@ function resolveBuildCommitFromEnv(env) {
|
|
|
287887
288091
|
* environment descriptor down instead of reporting an honest "unknown".
|
|
287888
288092
|
*/
|
|
287889
288093
|
function readBakedBuildCommit() {
|
|
287890
|
-
return "
|
|
288094
|
+
return "0ef3571b544de985c96601544e36094a62787683";
|
|
287891
288095
|
}
|
|
287892
288096
|
async function resolveServerBuildCommit(input) {
|
|
287893
288097
|
if (isFullCommitSha(input.baked)) return input.baked;
|
|
@@ -288060,7 +288264,7 @@ const makeServerEnvironment = require_Schema$1.fn("makeServerEnvironment")(funct
|
|
|
288060
288264
|
os,
|
|
288061
288265
|
arch: platformArch()
|
|
288062
288266
|
},
|
|
288063
|
-
serverVersion:
|
|
288267
|
+
serverVersion: version$1,
|
|
288064
288268
|
...buildCommit !== void 0 ? { buildCommit } : {},
|
|
288065
288269
|
capabilities: {
|
|
288066
288270
|
...executionEnvironmentCapabilities(serverConfig),
|
|
@@ -291058,6 +291262,7 @@ const decideOrchestrationCommand = require_Schema$1.fn("decideOrchestrationComma
|
|
|
291058
291262
|
workspaceRoot: command.workspaceRoot,
|
|
291059
291263
|
defaultModelSelection: command.defaultModelSelection ?? null,
|
|
291060
291264
|
...command.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: command.defaultThreadEnvMode } : {},
|
|
291265
|
+
...command.cmmdRegistration !== void 0 ? { cmmdRegistration: command.cmmdRegistration } : {},
|
|
291061
291266
|
scripts: [],
|
|
291062
291267
|
createdAt: command.createdAt,
|
|
291063
291268
|
updatedAt: command.createdAt
|
|
@@ -291084,6 +291289,7 @@ const decideOrchestrationCommand = require_Schema$1.fn("decideOrchestrationComma
|
|
|
291084
291289
|
...command.workspaceRoot !== void 0 ? { workspaceRoot: command.workspaceRoot } : {},
|
|
291085
291290
|
...command.defaultModelSelection !== void 0 ? { defaultModelSelection: command.defaultModelSelection } : {},
|
|
291086
291291
|
...command.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: command.defaultThreadEnvMode } : {},
|
|
291292
|
+
...command.cmmdRegistration !== void 0 ? { cmmdRegistration: command.cmmdRegistration } : {},
|
|
291087
291293
|
...command.scripts !== void 0 ? { scripts: command.scripts } : {},
|
|
291088
291294
|
updatedAt: occurredAt
|
|
291089
291295
|
}
|
|
@@ -291945,6 +292151,7 @@ function projectProjectDomainEvent(nextBase, event) {
|
|
|
291945
292151
|
workspaceRoot: payload.workspaceRoot,
|
|
291946
292152
|
defaultModelSelection: payload.defaultModelSelection,
|
|
291947
292153
|
defaultThreadEnvMode: payload.defaultThreadEnvMode ?? null,
|
|
292154
|
+
cmmdRegistration: payload.cmmdRegistration ?? null,
|
|
291948
292155
|
scripts: payload.scripts,
|
|
291949
292156
|
createdAt: payload.createdAt,
|
|
291950
292157
|
updatedAt: payload.updatedAt,
|
|
@@ -291963,6 +292170,7 @@ function projectProjectDomainEvent(nextBase, event) {
|
|
|
291963
292170
|
...payload.workspaceRoot !== void 0 ? { workspaceRoot: payload.workspaceRoot } : {},
|
|
291964
292171
|
...payload.defaultModelSelection !== void 0 ? { defaultModelSelection: payload.defaultModelSelection } : {},
|
|
291965
292172
|
...payload.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: payload.defaultThreadEnvMode } : {},
|
|
292173
|
+
...payload.cmmdRegistration !== void 0 ? { cmmdRegistration: payload.cmmdRegistration } : {},
|
|
291966
292174
|
...payload.scripts !== void 0 ? { scripts: payload.scripts } : {},
|
|
291967
292175
|
updatedAt: payload.updatedAt
|
|
291968
292176
|
} : project)
|
|
@@ -292568,6 +292776,34 @@ const DeleteProjectionThreadActivitiesInput = require_Schema$1.Struct({ threadId
|
|
|
292568
292776
|
*/
|
|
292569
292777
|
var ProjectionThreadActivityRepository = class extends require_Schema$1.Service()("forge/persistence/Services/ProjectionThreadActivities/ProjectionThreadActivityRepository") {};
|
|
292570
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
|
|
292571
292807
|
//#region src/persistence/Services/ProjectionThreadProposedPlans.ts
|
|
292572
292808
|
const ProjectionThreadProposedPlan = require_Schema$1.Struct({
|
|
292573
292809
|
planId: OrchestrationProposedPlanId,
|
|
@@ -293519,6 +293755,7 @@ const makeOrchestrationProjectionPipeline = require_Schema$1.fn("makeOrchestrati
|
|
|
293519
293755
|
workspaceRoot: event.payload.workspaceRoot,
|
|
293520
293756
|
defaultModelSelection: event.payload.defaultModelSelection,
|
|
293521
293757
|
defaultThreadEnvMode: event.payload.defaultThreadEnvMode ?? null,
|
|
293758
|
+
cmmdRegistration: event.payload.cmmdRegistration ?? null,
|
|
293522
293759
|
scripts: event.payload.scripts,
|
|
293523
293760
|
createdAt: event.payload.createdAt,
|
|
293524
293761
|
updatedAt: event.payload.updatedAt,
|
|
@@ -293534,6 +293771,7 @@ const makeOrchestrationProjectionPipeline = require_Schema$1.fn("makeOrchestrati
|
|
|
293534
293771
|
...event.payload.workspaceRoot !== void 0 ? { workspaceRoot: event.payload.workspaceRoot } : {},
|
|
293535
293772
|
...event.payload.defaultModelSelection !== void 0 ? { defaultModelSelection: event.payload.defaultModelSelection } : {},
|
|
293536
293773
|
...event.payload.defaultThreadEnvMode !== void 0 ? { defaultThreadEnvMode: event.payload.defaultThreadEnvMode } : {},
|
|
293774
|
+
...event.payload.cmmdRegistration !== void 0 ? { cmmdRegistration: event.payload.cmmdRegistration } : {},
|
|
293537
293775
|
...event.payload.scripts !== void 0 ? { scripts: event.payload.scripts } : {},
|
|
293538
293776
|
updatedAt: event.payload.updatedAt
|
|
293539
293777
|
});
|
|
@@ -294429,6 +294667,7 @@ const decodeShellSnapshot = require_Schema$1.decodeUnknownEffect(OrchestrationSh
|
|
|
294429
294667
|
const decodeThread = require_Schema$1.decodeUnknownEffect(OrchestrationThread);
|
|
294430
294668
|
const ProjectionProjectDbRowSchema = ProjectionProject.mapFields(require_Schema$1.assign({
|
|
294431
294669
|
defaultModelSelection: require_Schema$1.NullOr(require_Schema$1.fromJsonString(ModelSelection)),
|
|
294670
|
+
cmmdRegistration: require_Schema$1.NullOr(require_Schema$1.fromJsonString(CmmdRegistration)),
|
|
294432
294671
|
scripts: require_Schema$1.fromJsonString(require_Schema$1.ArraySchema(ProjectScript))
|
|
294433
294672
|
}));
|
|
294434
294673
|
const ProjectionThreadMessageDbRowSchema = ProjectionThreadMessage.mapFields(require_Schema$1.assign({
|
|
@@ -294567,6 +294806,7 @@ function mapProjectShellRow(row, repositoryIdentity, availability) {
|
|
|
294567
294806
|
repositoryIdentity,
|
|
294568
294807
|
availability,
|
|
294569
294808
|
defaultModelSelection: row.defaultModelSelection,
|
|
294809
|
+
cmmdRegistration: row.cmmdRegistration,
|
|
294570
294810
|
scripts: row.scripts,
|
|
294571
294811
|
createdAt: row.createdAt,
|
|
294572
294812
|
updatedAt: row.updatedAt
|
|
@@ -294604,6 +294844,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
294604
294844
|
workspace_root AS "workspaceRoot",
|
|
294605
294845
|
default_model_selection_json AS "defaultModelSelection",
|
|
294606
294846
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
294847
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
294607
294848
|
scripts_json AS "scripts",
|
|
294608
294849
|
created_at AS "createdAt",
|
|
294609
294850
|
updated_at AS "updatedAt",
|
|
@@ -294899,6 +295140,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
294899
295140
|
workspace_root AS "workspaceRoot",
|
|
294900
295141
|
default_model_selection_json AS "defaultModelSelection",
|
|
294901
295142
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
295143
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
294902
295144
|
scripts_json AS "scripts",
|
|
294903
295145
|
created_at AS "createdAt",
|
|
294904
295146
|
updated_at AS "updatedAt",
|
|
@@ -294920,6 +295162,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
294920
295162
|
workspace_root AS "workspaceRoot",
|
|
294921
295163
|
default_model_selection_json AS "defaultModelSelection",
|
|
294922
295164
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
295165
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
294923
295166
|
scripts_json AS "scripts",
|
|
294924
295167
|
created_at AS "createdAt",
|
|
294925
295168
|
updated_at AS "updatedAt",
|
|
@@ -294940,6 +295183,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
294940
295183
|
workspace_root AS "workspaceRoot",
|
|
294941
295184
|
default_model_selection_json AS "defaultModelSelection",
|
|
294942
295185
|
default_thread_env_mode AS "defaultThreadEnvMode",
|
|
295186
|
+
cmmd_registration_json AS "cmmdRegistration",
|
|
294943
295187
|
scripts_json AS "scripts",
|
|
294944
295188
|
created_at AS "createdAt",
|
|
294945
295189
|
updated_at AS "updatedAt",
|
|
@@ -295257,6 +295501,7 @@ const makeProjectionSnapshotQuery = require_Schema$1.gen(function* () {
|
|
|
295257
295501
|
repositoryIdentity: repositoryIdentities.get(row.projectId) ?? null,
|
|
295258
295502
|
availability: projectAvailabilities.get(row.projectId) ?? "unknown",
|
|
295259
295503
|
defaultModelSelection: row.defaultModelSelection,
|
|
295504
|
+
cmmdRegistration: row.cmmdRegistration,
|
|
295260
295505
|
scripts: row.scripts,
|
|
295261
295506
|
createdAt: row.createdAt,
|
|
295262
295507
|
updatedAt: row.updatedAt,
|
|
@@ -298789,6 +299034,23 @@ const cmmdRenameDeviceRouteLayer = registerProxyRoute({
|
|
|
298789
299034
|
orgIdSource: "none",
|
|
298790
299035
|
responseShape: "unwrapData"
|
|
298791
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
|
+
});
|
|
298792
299054
|
const cmmdRevokeDeviceRouteLayer = registerProxyRoute({
|
|
298793
299055
|
forgePath: "/api/cmmd/devices/:deviceId/revoke",
|
|
298794
299056
|
method: "POST",
|
|
@@ -300625,21 +300887,24 @@ function processRuntimeReplicationOutboxItem(item, dependencies) {
|
|
|
300625
300887
|
//#endregion
|
|
300626
300888
|
//#region src/runtimeReplication/Services/ActiveHourMeter.ts
|
|
300627
300889
|
var ActiveHourMeter = class extends require_Schema$1.Service()("forge/runtimeReplication/Services/ActiveHourMeter") {};
|
|
300628
|
-
|
|
300629
|
-
|
|
300890
|
+
/** `slug` and `name` are `.min(1).max(512)` on the receiving schema. */
|
|
300891
|
+
const FIELD_MAX_LENGTH = 512;
|
|
300892
|
+
/** `version` is `.max(128)` on the receiving schema, with no length floor. */
|
|
300893
|
+
const VERSION_MAX_LENGTH = 128;
|
|
300894
|
+
/** `binaryPath` is `.max(2048)` on the receiving schema, with no length floor. */
|
|
300895
|
+
const BINARY_PATH_MAX_LENGTH = 2048;
|
|
300630
300896
|
/**
|
|
300631
|
-
*
|
|
300897
|
+
* Trim to the receiving schema's maximum, or null.
|
|
300632
300898
|
*
|
|
300633
|
-
*
|
|
300634
|
-
*
|
|
300635
|
-
*
|
|
300899
|
+
* Neither field has a length floor, so an empty string would be legal — but it
|
|
300900
|
+
* is not an answer. A version nobody resolved and a binary nobody found are
|
|
300901
|
+
* both null, which is what the control plane stores and what a reader can tell
|
|
300902
|
+
* apart from a real value.
|
|
300636
300903
|
*/
|
|
300637
|
-
function
|
|
300638
|
-
const
|
|
300639
|
-
return
|
|
300904
|
+
function cappedText(value, max) {
|
|
300905
|
+
const normalized = value?.trim().slice(0, max);
|
|
300906
|
+
return normalized ? normalized : null;
|
|
300640
300907
|
}
|
|
300641
|
-
/** `slug` and `name` are `.min(1).max(512)` on the receiving schema. */
|
|
300642
|
-
const FIELD_MAX_LENGTH = 512;
|
|
300643
300908
|
function serializeModel(model) {
|
|
300644
300909
|
const slug = model.slug.trim().slice(0, FIELD_MAX_LENGTH);
|
|
300645
300910
|
const name = model.name.trim().slice(0, FIELD_MAX_LENGTH);
|
|
@@ -300653,20 +300918,48 @@ function serializeModel(model) {
|
|
|
300653
300918
|
name
|
|
300654
300919
|
};
|
|
300655
300920
|
}
|
|
300921
|
+
/**
|
|
300922
|
+
* The availability to publish for one provider.
|
|
300923
|
+
*
|
|
300924
|
+
* The registry stamps every snapshot before it leaves, so this normally copies.
|
|
300925
|
+
* Deriving over a stamped snapshot would lose the one fact only the registry
|
|
300926
|
+
* holds — which providers this build cannot run at all — and republish every
|
|
300927
|
+
* Unbuilt provider as Not on this Environment. The fallback covers a snapshot
|
|
300928
|
+
* that reached the outbox from some other path.
|
|
300929
|
+
*
|
|
300930
|
+
* Built by spread so a key with no value is ABSENT rather than `undefined`: the
|
|
300931
|
+
* receiving object is `.strict()`, `undefined` is not a legal enum member, and
|
|
300932
|
+
* the outbox retries the resulting 400 forever.
|
|
300933
|
+
*/
|
|
300934
|
+
function publishedAvailability(provider) {
|
|
300935
|
+
if (provider.availability === void 0) return deriveProviderAvailability(provider);
|
|
300936
|
+
const reason = provider.unavailableReason;
|
|
300937
|
+
const detail = provider.unavailableDetail;
|
|
300938
|
+
return {
|
|
300939
|
+
availability: provider.availability,
|
|
300940
|
+
...reason === void 0 ? {} : { unavailableReason: reason },
|
|
300941
|
+
...detail === void 0 ? {} : { unavailableDetail: detail }
|
|
300942
|
+
};
|
|
300943
|
+
}
|
|
300944
|
+
function serializeProvider(provider) {
|
|
300945
|
+
const models = [];
|
|
300946
|
+
for (const model of provider.models) {
|
|
300947
|
+
if (models.length >= 256) break;
|
|
300948
|
+
const serialized = serializeModel(model);
|
|
300949
|
+
if (serialized) models.push(serialized);
|
|
300950
|
+
}
|
|
300951
|
+
return {
|
|
300952
|
+
provider: provider.provider,
|
|
300953
|
+
models,
|
|
300954
|
+
...publishedAvailability(provider),
|
|
300955
|
+
version: cappedText(provider.version, VERSION_MAX_LENGTH),
|
|
300956
|
+
binaryPath: cappedText(provider.auth.provenance?.binaryPath, BINARY_PATH_MAX_LENGTH)
|
|
300957
|
+
};
|
|
300958
|
+
}
|
|
300656
300959
|
function serializeProviderCatalog(providers) {
|
|
300657
300960
|
const catalog = [];
|
|
300658
300961
|
for (const provider of providers) {
|
|
300659
|
-
|
|
300660
|
-
const models = [];
|
|
300661
|
-
for (const model of provider.models) {
|
|
300662
|
-
if (models.length >= 256) break;
|
|
300663
|
-
const serialized = serializeModel(model);
|
|
300664
|
-
if (serialized) models.push(serialized);
|
|
300665
|
-
}
|
|
300666
|
-
catalog.push({
|
|
300667
|
-
provider: provider.provider,
|
|
300668
|
-
models
|
|
300669
|
-
});
|
|
300962
|
+
catalog.push(serializeProvider(provider));
|
|
300670
300963
|
if (catalog.length >= 16) break;
|
|
300671
300964
|
}
|
|
300672
300965
|
return catalog;
|
|
@@ -300684,16 +300977,26 @@ const replicaTurnStatuses = new Set([
|
|
|
300684
300977
|
function isRecord$6(value) {
|
|
300685
300978
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
300686
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
|
+
}
|
|
300687
300989
|
function replicaActivitySource(activity) {
|
|
300688
300990
|
if (!activity.kind.startsWith("replica.") || !isRecord$6(activity.payload)) return null;
|
|
300689
|
-
const sourceSequence = activity.sequence;
|
|
300690
|
-
const eventId = activity.payload.sourceEventId;
|
|
300691
|
-
if (sourceSequence ===
|
|
300692
|
-
return
|
|
300991
|
+
const sourceSequence = replicaSourceSequence(activity.sequence);
|
|
300992
|
+
const eventId = replicaSourceEventId(activity.payload.sourceEventId);
|
|
300993
|
+
if (sourceSequence === null || eventId === null) return null;
|
|
300994
|
+
return {
|
|
300693
300995
|
sourceSequence,
|
|
300694
300996
|
eventId,
|
|
300695
|
-
occurredAt: activity.createdAt
|
|
300696
|
-
|
|
300997
|
+
occurredAt: activity.createdAt,
|
|
300998
|
+
turn: replicaSourceTurn(activity.payload.sourceTurnId)
|
|
300999
|
+
};
|
|
300697
301000
|
}
|
|
300698
301001
|
function replicaSummaryEvent(activity, source) {
|
|
300699
301002
|
if (activity.kind !== "replica.activity_summary" && activity.kind !== "replica.error_summary") return null;
|
|
@@ -300703,6 +301006,7 @@ function replicaSummaryEvent(activity, source) {
|
|
|
300703
301006
|
event: {
|
|
300704
301007
|
eventId: source.eventId,
|
|
300705
301008
|
occurredAt: source.occurredAt,
|
|
301009
|
+
...source.turn,
|
|
300706
301010
|
kind: activity.kind.slice(8),
|
|
300707
301011
|
summary: typeof sourceText === "string" ? sourceText : activity.summary
|
|
300708
301012
|
}
|
|
@@ -300716,6 +301020,7 @@ function replicaTurnEvent(activity, source) {
|
|
|
300716
301020
|
event: {
|
|
300717
301021
|
eventId: source.eventId,
|
|
300718
301022
|
occurredAt: source.occurredAt,
|
|
301023
|
+
...source.turn,
|
|
300719
301024
|
kind: "turn_status",
|
|
300720
301025
|
status
|
|
300721
301026
|
}
|
|
@@ -300731,6 +301036,7 @@ function replicaToolCallEvent(activity, source) {
|
|
|
300731
301036
|
event: {
|
|
300732
301037
|
eventId: source.eventId,
|
|
300733
301038
|
occurredAt: source.occurredAt,
|
|
301039
|
+
...source.turn,
|
|
300734
301040
|
kind: "tool_call",
|
|
300735
301041
|
summary: sourceText,
|
|
300736
301042
|
status,
|
|
@@ -300738,9 +301044,36 @@ function replicaToolCallEvent(activity, source) {
|
|
|
300738
301044
|
}
|
|
300739
301045
|
};
|
|
300740
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
|
+
}
|
|
300741
301074
|
function serializeReplicaActivity(activity) {
|
|
300742
301075
|
const source = replicaActivitySource(activity);
|
|
300743
|
-
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);
|
|
300744
301077
|
}
|
|
300745
301078
|
function serializeReplicaMessage(message) {
|
|
300746
301079
|
const source = decodeReplicaSourceMessageId(message.id);
|
|
@@ -300750,6 +301083,7 @@ function serializeReplicaMessage(message) {
|
|
|
300750
301083
|
event: {
|
|
300751
301084
|
eventId: source.eventId,
|
|
300752
301085
|
occurredAt: message.createdAt,
|
|
301086
|
+
...source.turnId === void 0 ? {} : { turnId: source.turnId },
|
|
300753
301087
|
kind: message.role === "user" ? "user_message" : "assistant_message",
|
|
300754
301088
|
text: message.text
|
|
300755
301089
|
}
|
|
@@ -300826,12 +301160,17 @@ function canonicalRuntimeEventTimestamp(value) {
|
|
|
300826
301160
|
if (Number.isNaN(timestamp.getTime())) throw new Error(`Invalid runtime event timestamp: ${value}`);
|
|
300827
301161
|
return timestamp.toISOString();
|
|
300828
301162
|
}
|
|
301163
|
+
/** Spread onto an event: present only when the projection knows the turn. */
|
|
301164
|
+
function eventTurn(turnId) {
|
|
301165
|
+
return turnId ? { turnId } : {};
|
|
301166
|
+
}
|
|
300829
301167
|
function orderedLocalMessageEvent(message, content) {
|
|
300830
301168
|
return {
|
|
300831
301169
|
sourceSequence: null,
|
|
300832
301170
|
event: {
|
|
300833
301171
|
eventId: `message:${message.id}`,
|
|
300834
301172
|
occurredAt: canonicalRuntimeEventTimestamp(message.createdAt),
|
|
301173
|
+
...eventTurn(message.turnId),
|
|
300835
301174
|
kind: message.role === "user" ? "user_message" : "assistant_message",
|
|
300836
301175
|
text: content
|
|
300837
301176
|
}
|
|
@@ -300862,6 +301201,7 @@ function serializeNativeToolActivity(activity) {
|
|
|
300862
301201
|
event: {
|
|
300863
301202
|
eventId: `activity:${activity.id}`,
|
|
300864
301203
|
occurredAt: canonicalRuntimeEventTimestamp(activity.createdAt),
|
|
301204
|
+
...eventTurn(activity.turnId),
|
|
300865
301205
|
kind: "tool_call",
|
|
300866
301206
|
summary,
|
|
300867
301207
|
status: activityStatus(activity),
|
|
@@ -300904,11 +301244,123 @@ function serializeProviderFailureActivity(activity) {
|
|
|
300904
301244
|
event: {
|
|
300905
301245
|
eventId: `activity:${activity.id}`,
|
|
300906
301246
|
occurredAt: canonicalRuntimeEventTimestamp(activity.createdAt),
|
|
301247
|
+
...eventTurn(activity.turnId),
|
|
300907
301248
|
kind: "error_summary",
|
|
300908
301249
|
summary: text(detail === null ? summary : `${summary}: ${detail}`, 4e3) ?? summary
|
|
300909
301250
|
}
|
|
300910
301251
|
};
|
|
300911
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
|
+
}
|
|
300912
301364
|
function serializeRuntimeThreadEvents(thread) {
|
|
300913
301365
|
const messages = thread.messages.flatMap(serializeThreadMessage);
|
|
300914
301366
|
const failureActivities = thread.activities.flatMap((activity) => {
|
|
@@ -300923,11 +301375,13 @@ function serializeRuntimeThreadEvents(thread) {
|
|
|
300923
301375
|
const event = serializeNativeToolActivity(activity);
|
|
300924
301376
|
return event === null ? [] : [event];
|
|
300925
301377
|
});
|
|
301378
|
+
const recordedTurns = serializeRecordedTurns(thread);
|
|
300926
301379
|
return [
|
|
300927
301380
|
...messages,
|
|
300928
301381
|
...replicaActivities,
|
|
300929
301382
|
...toolActivities,
|
|
300930
|
-
...failureActivities
|
|
301383
|
+
...failureActivities,
|
|
301384
|
+
...recordedTurns
|
|
300931
301385
|
].toSorted((left, right) => {
|
|
300932
301386
|
if (left.sourceSequence !== null && right.sourceSequence !== null) return left.sourceSequence - right.sourceSequence;
|
|
300933
301387
|
if (left.sourceSequence !== null) return -1;
|
|
@@ -310169,7 +310623,6 @@ const PlatformServicesLive = require_Schema$1.unwrap(require_Schema$1.gen(functi
|
|
|
310169
310623
|
return layer;
|
|
310170
310624
|
}
|
|
310171
310625
|
}));
|
|
310172
|
-
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));
|
|
310173
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))));
|
|
310174
310627
|
const RuntimeDrainLayerLive = RuntimeDrainReporterLive.pipe(require_Schema$1.provideMerge(RuntimeDrainStateLive));
|
|
310175
310628
|
const RuntimeAwareProviderReactorsLive = require_Schema$1.mergeAll(ProviderRuntimeIngestionLive, ProviderCommandReactorLive).pipe(require_Schema$1.provide$1(RuntimeDrainLayerLive));
|
|
@@ -310177,7 +310630,7 @@ const PipelineWorkerCoordinatorLayerLive = PipelineWorkerCoordinatorLive.pipe(re
|
|
|
310177
310630
|
const AgentProtocolReactorLayerLive = AgentProtocolReactorLive.pipe(require_Schema$1.provideMerge(PipelineRunStoreLive));
|
|
310178
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));
|
|
310179
310632
|
const PipelineRuntimeLayerLive = PipelineCoordinatorReactorLive.pipe(require_Schema$1.provideMerge(PipelineRunCoordinatorLayerLive), require_Schema$1.provideMerge(AgentProtocolReactorLayerLive));
|
|
310180
|
-
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));
|
|
310181
310634
|
const CheckpointingLayerLive = require_Schema$1.empty$1.pipe(require_Schema$1.provideMerge(CheckpointDiffQueryLive), require_Schema$1.provideMerge(CheckpointStoreLive));
|
|
310182
310635
|
const ProviderLayerLive = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
|
|
310183
310636
|
const config = yield* ServerConfig;
|
|
@@ -310233,10 +310686,10 @@ const MiscRuntimeLayerLive = require_Schema$1.mergeAll(AnalyticsServiceLayerLive
|
|
|
310233
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));
|
|
310234
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));
|
|
310235
310688
|
const RuntimeServicesLive = ServerRuntimeStartupLive.pipe(require_Schema$1.provideMerge(RuntimeDependenciesLive));
|
|
310236
|
-
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));
|
|
310237
310690
|
const makeServerLayer = require_Schema$1.unwrap(require_Schema$1.gen(function* () {
|
|
310238
310691
|
const config = yield* ServerConfig;
|
|
310239
|
-
fixPath();
|
|
310692
|
+
fixPath({ preferProcessPath: config.forgeCmmdRuntimeMode === true });
|
|
310240
310693
|
const httpListeningLayer = require_Schema$1.effectDiscard(require_Schema$1.gen(function* () {
|
|
310241
310694
|
yield* require_HttpServer.HttpServer;
|
|
310242
310695
|
yield* (yield* ServerRuntimeStartup).markHttpListening;
|