@skaile/workspaces 4.20.0 → 4.21.1
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/CHANGELOG.md +14 -0
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-HQJGP42P.js → asset-feeds-HKPNPO7N.js} +4 -4
- package/dist/{asset-feeds-HQJGP42P.js.map → asset-feeds-HKPNPO7N.js.map} +1 -1
- package/dist/asset-manager/index.js +1 -1
- package/dist/bridge/drivers/claude-sdk.js +160 -5
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +2 -2
- package/dist/bridge/drivers/continue.js +3 -3
- package/dist/bridge/drivers/echo.js +3 -3
- package/dist/bridge/drivers/gemini.js +5 -5
- package/dist/bridge/drivers/goose.js +3 -3
- package/dist/bridge/drivers/omp.js +20 -4
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.js +3 -3
- package/dist/bridge/drivers/qwen.js +5 -5
- package/dist/bridge/index.js +5 -5
- package/dist/bridge/src/drivers/claude-context-usage.d.ts +104 -0
- package/dist/bridge/src/drivers/claude-context-usage.d.ts.map +1 -0
- package/dist/bridge/src/drivers/claude-sdk.d.ts +13 -1
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/omp.d.ts +8 -1
- package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
- package/dist/bridge/src/types.d.ts +16 -1
- package/dist/bridge/src/types.d.ts.map +1 -1
- package/dist/{chunk-IDPHRLYV.js → chunk-5FMWNSAQ.js} +3 -3
- package/dist/{chunk-IDPHRLYV.js.map → chunk-5FMWNSAQ.js.map} +1 -1
- package/dist/{chunk-666BKSSR.js → chunk-5YDCUHJI.js} +3 -3
- package/dist/{chunk-666BKSSR.js.map → chunk-5YDCUHJI.js.map} +1 -1
- package/dist/{chunk-D3LQY3MT.js → chunk-AEOHSR27.js} +3 -3
- package/dist/{chunk-D3LQY3MT.js.map → chunk-AEOHSR27.js.map} +1 -1
- package/dist/{chunk-EMWWU6RR.js → chunk-ES4E6RDZ.js} +3 -3
- package/dist/{chunk-EMWWU6RR.js.map → chunk-ES4E6RDZ.js.map} +1 -1
- package/dist/{chunk-XJTD6KWX.js → chunk-EUGEEYGD.js} +2 -2
- package/dist/{chunk-XJTD6KWX.js.map → chunk-EUGEEYGD.js.map} +1 -1
- package/dist/{chunk-RJ67DIJI.js → chunk-FELWDKLQ.js} +3 -3
- package/dist/{chunk-RJ67DIJI.js.map → chunk-FELWDKLQ.js.map} +1 -1
- package/dist/{chunk-3FGGVQDU.js → chunk-HA674IQL.js} +6 -6
- package/dist/{chunk-3FGGVQDU.js.map → chunk-HA674IQL.js.map} +1 -1
- package/dist/{chunk-VFUY5O4T.js → chunk-I4VIRPHS.js} +3 -3
- package/dist/{chunk-VFUY5O4T.js.map → chunk-I4VIRPHS.js.map} +1 -1
- package/dist/{chunk-RZNASEEJ.js → chunk-IZAN5MHL.js} +3 -3
- package/dist/{chunk-RZNASEEJ.js.map → chunk-IZAN5MHL.js.map} +1 -1
- package/dist/{chunk-OFC725VA.js → chunk-N5XNEKHC.js} +771 -19
- package/dist/chunk-N5XNEKHC.js.map +1 -0
- package/dist/{chunk-DMDZTEL4.js → chunk-ODIJJXXB.js} +6 -6
- package/dist/{chunk-DMDZTEL4.js.map → chunk-ODIJJXXB.js.map} +1 -1
- package/dist/{chunk-P6L3CMKN.js → chunk-OPSKLUB4.js} +2 -2
- package/dist/{chunk-P6L3CMKN.js.map → chunk-OPSKLUB4.js.map} +1 -1
- package/dist/{chunk-CHGN5BTN.js → chunk-R3EU2FFW.js} +4 -4
- package/dist/{chunk-CHGN5BTN.js.map → chunk-R3EU2FFW.js.map} +1 -1
- package/dist/{chunk-OR7C7PTE.js → chunk-RBTVXXD5.js} +3 -3
- package/dist/{chunk-OR7C7PTE.js.map → chunk-RBTVXXD5.js.map} +1 -1
- package/dist/{chunk-56UHERYI.js → chunk-RLACUE4X.js} +3 -3
- package/dist/{chunk-56UHERYI.js.map → chunk-RLACUE4X.js.map} +1 -1
- package/dist/{chunk-TLOP6FLY.js → chunk-RTD5KAM4.js} +17 -2
- package/dist/chunk-RTD5KAM4.js.map +1 -0
- package/dist/{chunk-TFCZYDOE.js → chunk-RZ2YIFT6.js} +6 -6
- package/dist/{chunk-TFCZYDOE.js.map → chunk-RZ2YIFT6.js.map} +1 -1
- package/dist/{chunk-PGQDBXS7.js → chunk-S5A5MVJN.js} +4 -4
- package/dist/chunk-S5A5MVJN.js.map +1 -0
- package/dist/{chunk-QNC7VEBL.js → chunk-SY2HSULI.js} +3 -3
- package/dist/{chunk-QNC7VEBL.js.map → chunk-SY2HSULI.js.map} +1 -1
- package/dist/{chunk-4WBZC7UF.js → chunk-XBMCUMZT.js} +4 -4
- package/dist/{chunk-4WBZC7UF.js.map → chunk-XBMCUMZT.js.map} +1 -1
- package/dist/{chunk-2KTI5R4T.js → chunk-YEQ3BXOY.js} +3 -3
- package/dist/{chunk-2KTI5R4T.js.map → chunk-YEQ3BXOY.js.map} +1 -1
- package/dist/{chunk-EC24QFGP.js → chunk-ZDSZGV5F.js} +7 -7
- package/dist/{chunk-EC24QFGP.js.map → chunk-ZDSZGV5F.js.map} +1 -1
- package/dist/cli/index.js +35 -35
- package/dist/connectors/index.js +7 -7
- package/dist/connectors-shared/index.js +2 -2
- package/dist/{ensure-sources-LQNEZUFT.js → ensure-sources-MUS622KB.js} +4 -4
- package/dist/{ensure-sources-LQNEZUFT.js.map → ensure-sources-MUS622KB.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +7 -7
- package/dist/factory-assets/connectors/deploy.js +7 -7
- package/dist/factory-assets/connectors/devserver.js +7 -7
- package/dist/factory-assets/connectors/flow/adapter.js +7 -7
- package/dist/factory-assets/connectors/flow/run-flow.js +8 -8
- package/dist/factory-assets/connectors/flow.js +7 -7
- package/dist/factory-assets/connectors/git.js +7 -7
- package/dist/factory-assets/connectors/gmail.js +7 -7
- package/dist/factory-assets/connectors/googledrive.js +7 -7
- package/dist/factory-assets/connectors/local.js +7 -7
- package/dist/factory-assets/connectors/mattermost.js +7 -7
- package/dist/factory-assets/connectors/memory.js +7 -7
- package/dist/factory-assets/connectors/minio.js +7 -7
- package/dist/factory-assets/connectors/postgres.js +7 -7
- package/dist/factory-assets/connectors/s3.js +7 -7
- package/dist/factory-assets/connectors/sharepoint.js +7 -7
- package/dist/factory-assets/connectors/sqlite.js +7 -7
- package/dist/factory-assets/connectors/static-server.js +7 -7
- package/dist/factory-assets/connectors/tunnel.js +7 -7
- package/dist/factory-assets/connectors/webdav.js +7 -7
- package/dist/factory-assets/connectors/xstate-store.js +7 -7
- package/dist/factory-assets/connectors/xstate.js +7 -7
- package/dist/{helpers-73M3SDDE.js → helpers-V3IJWB75.js} +4 -4
- package/dist/{helpers-73M3SDDE.js.map → helpers-V3IJWB75.js.map} +1 -1
- package/dist/{library-publish-NLA2EBV7.js → library-publish-TXJM76SD.js} +6 -6
- package/dist/{library-publish-NLA2EBV7.js.map → library-publish-TXJM76SD.js.map} +1 -1
- package/dist/{open-library-FHPRGIP6.js → open-library-ORTV2RUE.js} +5 -5
- package/dist/{open-library-FHPRGIP6.js.map → open-library-ORTV2RUE.js.map} +1 -1
- package/dist/{project-OKV7M4BV.js → project-GI2A75UN.js} +5 -5
- package/dist/{project-OKV7M4BV.js.map → project-GI2A75UN.js.map} +1 -1
- package/dist/runner/index.js +11 -11
- package/dist/runner/src/ai-credential-retry.d.ts +14 -0
- package/dist/runner/src/ai-credential-retry.d.ts.map +1 -1
- package/dist/runner/src/capability-roundtrip.d.ts +18 -0
- package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
- package/dist/runner/src/compaction/orchestrator.d.ts +12 -0
- package/dist/runner/src/compaction/orchestrator.d.ts.map +1 -1
- package/dist/runner/src/context-usage/collector.d.ts +83 -0
- package/dist/runner/src/context-usage/collector.d.ts.map +1 -0
- package/dist/runner/src/context-usage/compose.d.ts +51 -0
- package/dist/runner/src/context-usage/compose.d.ts.map +1 -0
- package/dist/runner/src/context-usage/estimator.d.ts +13 -0
- package/dist/runner/src/context-usage/estimator.d.ts.map +1 -0
- package/dist/runner/src/context-usage/index.d.ts +6 -0
- package/dist/runner/src/context-usage/index.d.ts.map +1 -0
- package/dist/runner/src/context-usage/skill-listings.d.ts +8 -0
- package/dist/runner/src/context-usage/skill-listings.d.ts.map +1 -0
- package/dist/runner/src/context-usage/transcript-tracker.d.ts +35 -0
- package/dist/runner/src/context-usage/transcript-tracker.d.ts.map +1 -0
- package/dist/runner/src/event-gap-buffer.d.ts +77 -0
- package/dist/runner/src/event-gap-buffer.d.ts.map +1 -0
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +1 -1
- package/dist/sdk/bridge.js +5 -5
- package/dist/sdk/index.js +11 -11
- package/dist/sdk/runner.js +11 -11
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/types.js +1 -1
- package/dist/session/index.js +2 -2
- package/dist/{setup-VBXJH72H.js → setup-GLCLE36X.js} +10 -10
- package/dist/{setup-VBXJH72H.js.map → setup-GLCLE36X.js.map} +1 -1
- package/dist/{source-6KKMQU67.js → source-N6EKFFH5.js} +6 -6
- package/dist/{source-6KKMQU67.js.map → source-N6EKFFH5.js.map} +1 -1
- package/dist/{source-manifest-publish-EPIP6RQ3.js → source-manifest-publish-BDMY4B4B.js} +7 -7
- package/dist/{source-manifest-publish-EPIP6RQ3.js.map → source-manifest-publish-BDMY4B4B.js.map} +1 -1
- package/dist/tui/index.js +11 -11
- package/dist/types/index.js +1 -1
- package/dist/types/src/context-usage.d.ts +142 -0
- package/dist/types/src/context-usage.d.ts.map +1 -0
- package/dist/types/src/events.d.ts +26 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/protocol.d.ts +21 -1
- package/dist/types/src/protocol.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +7 -1
- package/dist/types/src/version.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +2 -2
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-OFC725VA.js.map +0 -1
- package/dist/chunk-PGQDBXS7.js.map +0 -1
- package/dist/chunk-TLOP6FLY.js.map +0 -1
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { WorkspacePlugin } from './chunk-
|
|
2
|
-
import { buildWorkspaceToolDefs } from './chunk-
|
|
1
|
+
import { WorkspacePlugin } from './chunk-OPSKLUB4.js';
|
|
2
|
+
import { buildWorkspaceToolDefs } from './chunk-5FMWNSAQ.js';
|
|
3
3
|
import { findAiAssetsRoot } from './chunk-7IH3RKKK.js';
|
|
4
4
|
import { WebSocketServerTransport } from './chunk-73ZXUUL6.js';
|
|
5
5
|
import { assembleSystemPrompt, buildCapabilitiesPromptSection } from './chunk-W3UDISS2.js';
|
|
6
6
|
import { prepareNativePolicy, codexInstanceEnvironment, parseCodexCredential, parseCodexRefreshInput, parseCodexRefreshResult } from './chunk-PE3A6FFW.js';
|
|
7
|
-
import { resolveFlowPath } from './chunk-
|
|
7
|
+
import { resolveFlowPath } from './chunk-SY2HSULI.js';
|
|
8
8
|
import { findAiAssetsRoot as findAiAssetsRoot$1, deployCatalogEntry, undeployCatalogEntry } from './chunk-Q6NDQ6BH.js';
|
|
9
|
-
import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, buildSdkConnectorTools, buildLazySdkFlowTools, describeFlowOperations, buildConnectorToolDefs, buildFlowToolDefs, driveOrchestratorTurn, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, buildSdkFlowTools } from './chunk-
|
|
9
|
+
import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, buildSdkConnectorTools, buildLazySdkFlowTools, describeFlowOperations, buildConnectorToolDefs, buildFlowToolDefs, driveOrchestratorTurn, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, buildSdkFlowTools } from './chunk-ZDSZGV5F.js';
|
|
10
10
|
import { loadYamlConnectorDeclarations, withMaterializedConnectorDeclarations, SecretProviderChain, ConnectorStartupError, PreMintedSecretProvider, InMemorySecretProvider, resolvedConfigToDeclarations, isKnownSecretRef, deriveSingleMaterializedConnectorDeclaration } from './chunk-MC2MF4U5.js';
|
|
11
|
-
import { EventNormalizer } from './chunk-
|
|
11
|
+
import { EventNormalizer } from './chunk-XBMCUMZT.js';
|
|
12
12
|
import { probeResumeTranscript, transcriptStoreForRuntime } from './chunk-6S5KL76M.js';
|
|
13
13
|
import { CodexNativeStateUnavailable } from './chunk-LOO5CB5M.js';
|
|
14
|
-
import { dispatchCapability } from './chunk-
|
|
14
|
+
import { dispatchCapability } from './chunk-RLACUE4X.js';
|
|
15
15
|
import { classifyClaudeSdkError } from './chunk-BGY4KTU6.js';
|
|
16
16
|
import { agentExecRequested } from './chunk-YROR332M.js';
|
|
17
|
-
import { createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv, AI_PROVIDER_PRESETS } from './chunk-
|
|
17
|
+
import { createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv, AI_PROVIDER_PRESETS } from './chunk-RTD5KAM4.js';
|
|
18
18
|
import { loadFlow } from './chunk-KTCMBEEB.js';
|
|
19
19
|
import { parseFlowDefinition } from './chunk-ALLCAFHQ.js';
|
|
20
20
|
import { renderStimulusPrompt } from './chunk-RQLL7L72.js';
|
|
21
|
-
import { withActivityLabelJsonSchema, TOOL_ACTIVITY_PROMPT_SECTION, SESSION_ROOT_CONNECTOR_ID, PROTOCOL_VERSION } from './chunk-
|
|
21
|
+
import { withActivityLabelJsonSchema, TOOL_ACTIVITY_PROMPT_SECTION, SESSION_ROOT_CONNECTOR_ID, PROTOCOL_VERSION } from './chunk-S5A5MVJN.js';
|
|
22
22
|
import { resolveSettings, loadProviderRegistry } from './chunk-UWU572Q6.js';
|
|
23
23
|
import { resolveRuntimeAssets } from './chunk-5RHPNNWP.js';
|
|
24
24
|
import { resolveDriverPaths } from './chunk-K5GBV4SA.js';
|
|
25
25
|
import { resolveSkWorkspaceConfig, resolveAgentDir, loadMcpServerDeclarations, COMPACTION_DEFAULTS, resolveCompactionThresholdPercent, validateAssetRecipeAttr, deriveSingleMaterializedMcpDeclaration, stageMaterializedSkills, readSkillAllowList, isStagedSkillMarkerFor, unstageSkill } from './chunk-DF7C3KZK.js';
|
|
26
|
-
import { withFsDeadline, FsDeadlineError, fsDeadlineMs, tryWithFsDeadline } from './chunk-2FBPAR2V.js';
|
|
26
|
+
import { withFsDeadline, FsDeadlineError, fsDeadlineMs, parseFrontmatter, tryWithFsDeadline } from './chunk-2FBPAR2V.js';
|
|
27
27
|
import { parseAssetRef } from './chunk-GEEW6SY2.js';
|
|
28
28
|
import { resolveLogStoreConfig, createLogStoreFromConfig, OnLogBridgeSink, WsLogSink, resolveLogsRetention, enforceLogsRetention } from './chunk-JMKB7IB4.js';
|
|
29
29
|
import { registryEntries, resolveEntryBaseUrl, parseModelRef, isEntryEnabled, parseCredentialRef } from './chunk-GZZPKAV5.js';
|
|
@@ -3563,6 +3563,19 @@ function resolveCapabilityResult(pending, cmd) {
|
|
|
3563
3563
|
}
|
|
3564
3564
|
return true;
|
|
3565
3565
|
}
|
|
3566
|
+
function rejectPendingCapabilityCallsOnDisconnect(pending, keep = () => false) {
|
|
3567
|
+
const entries = [...pending].filter(([callId]) => !keep(callId));
|
|
3568
|
+
for (const [callId] of entries) pending.delete(callId);
|
|
3569
|
+
for (const [callId, entry] of entries) {
|
|
3570
|
+
clearTimeout(entry.timer);
|
|
3571
|
+
entry.reject(
|
|
3572
|
+
new Error(
|
|
3573
|
+
`Platform connection dropped while capability call ${callId} was in flight (the platform backend may be restarting). Its outcome is unknown; retry once the platform is back if the call is safe to repeat.`
|
|
3574
|
+
)
|
|
3575
|
+
);
|
|
3576
|
+
}
|
|
3577
|
+
return entries.length;
|
|
3578
|
+
}
|
|
3566
3579
|
function rejectCapabilityOnApprovalDeny(pending, callId, feedback) {
|
|
3567
3580
|
const entry = pending.get(callId);
|
|
3568
3581
|
if (!entry) return false;
|
|
@@ -4181,6 +4194,23 @@ var MINT_RETRY_MAX_DELAY_MS = 5e3;
|
|
|
4181
4194
|
function isTransientMintFailure(code) {
|
|
4182
4195
|
return code === "backend-error";
|
|
4183
4196
|
}
|
|
4197
|
+
function aiMintPreconditionFailure(args) {
|
|
4198
|
+
if (args.configId === void 0) {
|
|
4199
|
+
return {
|
|
4200
|
+
ok: false,
|
|
4201
|
+
code: "not-configured",
|
|
4202
|
+
message: "no aiProviderConfigId; standalone runner cannot mediate refresh"
|
|
4203
|
+
};
|
|
4204
|
+
}
|
|
4205
|
+
if (!args.connected) {
|
|
4206
|
+
return {
|
|
4207
|
+
ok: false,
|
|
4208
|
+
code: "backend-error",
|
|
4209
|
+
message: "transport disconnected; the platform connection is down, refresh will be retried"
|
|
4210
|
+
};
|
|
4211
|
+
}
|
|
4212
|
+
return null;
|
|
4213
|
+
}
|
|
4184
4214
|
function mintRetryDelayMs(retryNumber) {
|
|
4185
4215
|
const delay = MINT_RETRY_BASE_DELAY_MS * 2 ** Math.max(0, retryNumber - 1);
|
|
4186
4216
|
return Math.min(delay, MINT_RETRY_MAX_DELAY_MS);
|
|
@@ -4874,6 +4904,105 @@ async function routeReply(deps) {
|
|
|
4874
4904
|
return "fresh-turn";
|
|
4875
4905
|
}
|
|
4876
4906
|
|
|
4907
|
+
// runner/src/event-gap-buffer.ts
|
|
4908
|
+
var EVENT_GAP_BUFFER_MAX_EVENTS = 1e4;
|
|
4909
|
+
var EVENT_GAP_BUFFER_MAX_BYTES = 16 * 1024 * 1024;
|
|
4910
|
+
var UNBUFFERED_TYPES = /* @__PURE__ */ new Set([
|
|
4911
|
+
"session_init_ack",
|
|
4912
|
+
"log_entry",
|
|
4913
|
+
"capability_result"
|
|
4914
|
+
]);
|
|
4915
|
+
function measure(event) {
|
|
4916
|
+
try {
|
|
4917
|
+
const json = JSON.stringify(event);
|
|
4918
|
+
return json === void 0 ? 0 : Buffer.byteLength(json, "utf8");
|
|
4919
|
+
} catch {
|
|
4920
|
+
return 0;
|
|
4921
|
+
}
|
|
4922
|
+
}
|
|
4923
|
+
var EventGapBuffer = class _EventGapBuffer {
|
|
4924
|
+
maxEvents;
|
|
4925
|
+
maxBytes;
|
|
4926
|
+
entries = [];
|
|
4927
|
+
/** Index of the oldest live entry; eviction advances it instead of shifting the array. */
|
|
4928
|
+
head = 0;
|
|
4929
|
+
bytes = 0;
|
|
4930
|
+
dropped = 0;
|
|
4931
|
+
constructor(opts = {}) {
|
|
4932
|
+
this.maxEvents = opts.maxEvents ?? EVENT_GAP_BUFFER_MAX_EVENTS;
|
|
4933
|
+
this.maxBytes = opts.maxBytes ?? EVENT_GAP_BUFFER_MAX_BYTES;
|
|
4934
|
+
}
|
|
4935
|
+
/** Number of events currently held. */
|
|
4936
|
+
get size() {
|
|
4937
|
+
return this.entries.length - this.head;
|
|
4938
|
+
}
|
|
4939
|
+
/** Whether a drain would report anything (held events or drops). */
|
|
4940
|
+
get hasPending() {
|
|
4941
|
+
return this.size > 0 || this.dropped > 0;
|
|
4942
|
+
}
|
|
4943
|
+
/** The callIds of the `capability_invoked` events currently held. */
|
|
4944
|
+
heldCapabilityCallIds() {
|
|
4945
|
+
const ids = /* @__PURE__ */ new Set();
|
|
4946
|
+
for (let i = this.head; i < this.entries.length; i++) {
|
|
4947
|
+
const event = this.entries[i]?.event;
|
|
4948
|
+
if (event?.type === "capability_invoked") ids.add(event.callId);
|
|
4949
|
+
}
|
|
4950
|
+
return ids;
|
|
4951
|
+
}
|
|
4952
|
+
/** Whether {@link push} would hold this event type at all. */
|
|
4953
|
+
static accepts(event) {
|
|
4954
|
+
return !UNBUFFERED_TYPES.has(event.type);
|
|
4955
|
+
}
|
|
4956
|
+
/**
|
|
4957
|
+
* Append an event, evicting the oldest past either cap. An event larger than
|
|
4958
|
+
* the byte cap on its own is counted as dropped and not held.
|
|
4959
|
+
*/
|
|
4960
|
+
push(event, opts = {}) {
|
|
4961
|
+
if (!_EventGapBuffer.accepts(event)) return;
|
|
4962
|
+
const bytes = measure(event);
|
|
4963
|
+
if (bytes > this.maxBytes) {
|
|
4964
|
+
this.dropped += 1;
|
|
4965
|
+
return;
|
|
4966
|
+
}
|
|
4967
|
+
this.entries.push({ event, bytes, ...opts.isStale ? { isStale: opts.isStale } : {} });
|
|
4968
|
+
this.bytes += bytes;
|
|
4969
|
+
while (this.size > this.maxEvents || this.bytes > this.maxBytes) {
|
|
4970
|
+
const oldest = this.entries[this.head];
|
|
4971
|
+
if (!oldest) break;
|
|
4972
|
+
this.head += 1;
|
|
4973
|
+
this.bytes -= oldest.bytes;
|
|
4974
|
+
this.dropped += 1;
|
|
4975
|
+
}
|
|
4976
|
+
if (this.head > 1024 && this.head * 2 > this.entries.length) {
|
|
4977
|
+
this.entries = this.entries.slice(this.head);
|
|
4978
|
+
this.head = 0;
|
|
4979
|
+
}
|
|
4980
|
+
}
|
|
4981
|
+
/** Hand back everything held, oldest first, and reset. */
|
|
4982
|
+
drain() {
|
|
4983
|
+
const events = [];
|
|
4984
|
+
let stale = 0;
|
|
4985
|
+
for (let i = this.head; i < this.entries.length; i++) {
|
|
4986
|
+
const entry = this.entries[i];
|
|
4987
|
+
if (!entry) continue;
|
|
4988
|
+
if (entry.isStale?.()) stale += 1;
|
|
4989
|
+
else events.push(entry.event);
|
|
4990
|
+
}
|
|
4991
|
+
const dropped = this.dropped;
|
|
4992
|
+
this.clear();
|
|
4993
|
+
return { events, dropped, stale };
|
|
4994
|
+
}
|
|
4995
|
+
/** Discard everything held. Returns how many events were discarded. */
|
|
4996
|
+
clear() {
|
|
4997
|
+
const discarded = this.size;
|
|
4998
|
+
this.entries = [];
|
|
4999
|
+
this.head = 0;
|
|
5000
|
+
this.bytes = 0;
|
|
5001
|
+
this.dropped = 0;
|
|
5002
|
+
return discarded;
|
|
5003
|
+
}
|
|
5004
|
+
};
|
|
5005
|
+
|
|
4877
5006
|
// runner/src/compaction/prompt.ts
|
|
4878
5007
|
var DEFAULT_COMPACTION_PROMPT = `You are being asked to compact this conversation into a structured summary.
|
|
4879
5008
|
This summary will replace the full conversation history when the session
|
|
@@ -5047,6 +5176,12 @@ function resolveContextWindow(driverWindow, model) {
|
|
|
5047
5176
|
}
|
|
5048
5177
|
return driverWindow || DEFAULT_CONTEXT_WINDOW;
|
|
5049
5178
|
}
|
|
5179
|
+
function reportedContextWindow(driverWindow, model) {
|
|
5180
|
+
if (model && ONE_MILLION_ALIAS_PATTERN.test(model)) {
|
|
5181
|
+
return Math.max(driverWindow ?? 0, ONE_MILLION_CONTEXT_WINDOW);
|
|
5182
|
+
}
|
|
5183
|
+
return driverWindow && driverWindow > 0 ? driverWindow : null;
|
|
5184
|
+
}
|
|
5050
5185
|
function detectRateLimitInSummary(text2) {
|
|
5051
5186
|
if (text2.length > RATE_LIMIT_TEXT_MAX_CHARS) return false;
|
|
5052
5187
|
return RATE_LIMIT_TEXT_PATTERNS.some((p) => p.test(text2));
|
|
@@ -5097,6 +5232,20 @@ var CompactionOrchestrator = class {
|
|
|
5097
5232
|
contextFill(usage) {
|
|
5098
5233
|
return this.driver.getContextTokens?.() ?? contextTokens(usage);
|
|
5099
5234
|
}
|
|
5235
|
+
/**
|
|
5236
|
+
* The context fill, in tokens, at which auto-compaction triggers — the same
|
|
5237
|
+
* window and tier {@link shouldCompact} uses. `null` when compaction is off.
|
|
5238
|
+
*/
|
|
5239
|
+
compactAtTokens() {
|
|
5240
|
+
if (!this.config.enabled) return null;
|
|
5241
|
+
const contextWindow = resolveContextWindow(
|
|
5242
|
+
this.driver.getContextWindow(),
|
|
5243
|
+
this.driver.getModel() ?? null
|
|
5244
|
+
);
|
|
5245
|
+
return Math.round(
|
|
5246
|
+
contextWindow * resolveCompactionThresholdPercent(contextWindow, this.config) / 100
|
|
5247
|
+
);
|
|
5248
|
+
}
|
|
5100
5249
|
trackMessage(seq) {
|
|
5101
5250
|
this.currentSeq = seq;
|
|
5102
5251
|
this.messagesSinceCompaction++;
|
|
@@ -5784,6 +5933,517 @@ function readCurrentClaudeAccessToken(home) {
|
|
|
5784
5933
|
return typeof raw === "string" && raw.length > 0 ? raw : null;
|
|
5785
5934
|
}
|
|
5786
5935
|
|
|
5936
|
+
// runner/src/context-usage/estimator.ts
|
|
5937
|
+
var CHARS_PER_TEXT_TOKEN = 4;
|
|
5938
|
+
var CHARS_PER_JSON_TOKEN = 2;
|
|
5939
|
+
var defaultTokenEstimator = {
|
|
5940
|
+
text(value) {
|
|
5941
|
+
return value.length === 0 ? 0 : Math.ceil(value.length / CHARS_PER_TEXT_TOKEN);
|
|
5942
|
+
},
|
|
5943
|
+
json(value) {
|
|
5944
|
+
if (value === void 0) return 0;
|
|
5945
|
+
let serialized;
|
|
5946
|
+
try {
|
|
5947
|
+
serialized = typeof value === "string" ? value : JSON.stringify(value) ?? "";
|
|
5948
|
+
} catch {
|
|
5949
|
+
return 0;
|
|
5950
|
+
}
|
|
5951
|
+
return serialized.length === 0 ? 0 : Math.ceil(serialized.length / CHARS_PER_JSON_TOKEN);
|
|
5952
|
+
}
|
|
5953
|
+
};
|
|
5954
|
+
|
|
5955
|
+
// runner/src/context-usage/compose.ts
|
|
5956
|
+
var SKAILE_LABELS = /* @__PURE__ */ new Set([
|
|
5957
|
+
"context",
|
|
5958
|
+
"environment",
|
|
5959
|
+
"resources",
|
|
5960
|
+
"mcp-guidance",
|
|
5961
|
+
"tool-activity",
|
|
5962
|
+
"home"
|
|
5963
|
+
]);
|
|
5964
|
+
var BUCKET_ORDER = [
|
|
5965
|
+
"provider-system",
|
|
5966
|
+
"skaile-system",
|
|
5967
|
+
"agent-prompt",
|
|
5968
|
+
"memory",
|
|
5969
|
+
"skills",
|
|
5970
|
+
"mcp-tools",
|
|
5971
|
+
"builtin-tools",
|
|
5972
|
+
"subagents",
|
|
5973
|
+
"content",
|
|
5974
|
+
"free",
|
|
5975
|
+
"compaction-buffer"
|
|
5976
|
+
];
|
|
5977
|
+
var MEASURED_DRIFT_TOLERANCE = 0.02;
|
|
5978
|
+
function composeContextUsageSnapshot(input) {
|
|
5979
|
+
const estimator = input.estimator ?? defaultTokenEstimator;
|
|
5980
|
+
const report = input.report;
|
|
5981
|
+
const fresh = report !== null && input.reportFresh;
|
|
5982
|
+
const driverFidelity = report?.breakdownFidelity ?? "measured";
|
|
5983
|
+
const buckets = /* @__PURE__ */ new Map();
|
|
5984
|
+
const sectionItems = input.systemPromptSections.map((s) => ({
|
|
5985
|
+
label: s.label,
|
|
5986
|
+
item: {
|
|
5987
|
+
name: s.label,
|
|
5988
|
+
tokens: estimator.text(s.value),
|
|
5989
|
+
...s.source ? { source: s.source } : {}
|
|
5990
|
+
}
|
|
5991
|
+
}));
|
|
5992
|
+
const appended = report?.appendedSystemPromptTokens;
|
|
5993
|
+
if (appended !== void 0) {
|
|
5994
|
+
const shares = apportion(
|
|
5995
|
+
sectionItems.map((s) => s.item.tokens),
|
|
5996
|
+
appended
|
|
5997
|
+
);
|
|
5998
|
+
sectionItems.forEach((s, i) => {
|
|
5999
|
+
s.item.tokens = shares[i] ?? 0;
|
|
6000
|
+
});
|
|
6001
|
+
}
|
|
6002
|
+
const skaileItems = sectionItems.filter((s) => SKAILE_LABELS.has(s.label)).map((s) => s.item);
|
|
6003
|
+
const agentItems = sectionItems.filter((s) => !SKAILE_LABELS.has(s.label)).map((s) => s.item);
|
|
6004
|
+
buckets.set("skaile-system", itemBucket("skaile-system", skaileItems, "estimated"));
|
|
6005
|
+
buckets.set("agent-prompt", itemBucket("agent-prompt", agentItems, "estimated"));
|
|
6006
|
+
const runnerSectionTokens = sumTokens(skaileItems) + sumTokens(agentItems);
|
|
6007
|
+
let providerPending = false;
|
|
6008
|
+
if (report?.systemPromptTokens !== void 0) {
|
|
6009
|
+
const isolated = appended !== void 0;
|
|
6010
|
+
buckets.set("provider-system", {
|
|
6011
|
+
id: "provider-system",
|
|
6012
|
+
tokens: Math.max(0, report.systemPromptTokens - (isolated ? appended : runnerSectionTokens)),
|
|
6013
|
+
fidelity: driverFidelity === "estimated" ? "estimated" : isolated ? "measured" : "derived",
|
|
6014
|
+
...report.systemPromptSections?.length ? { items: report.systemPromptSections } : {}
|
|
6015
|
+
});
|
|
6016
|
+
} else {
|
|
6017
|
+
providerPending = true;
|
|
6018
|
+
}
|
|
6019
|
+
setStatic(buckets, "memory", report?.memory, null, driverFidelity);
|
|
6020
|
+
setStatic(buckets, "skills", report?.skills, input.skills, driverFidelity);
|
|
6021
|
+
setStatic(buckets, "mcp-tools", report?.mcpTools, input.mcpTools, driverFidelity);
|
|
6022
|
+
setStatic(buckets, "builtin-tools", report?.builtinTools, null, driverFidelity);
|
|
6023
|
+
setStatic(buckets, "subagents", report?.subagents, null, driverFidelity);
|
|
6024
|
+
let contentPending = false;
|
|
6025
|
+
if (fresh && report.content) {
|
|
6026
|
+
buckets.set("content", reportBucket("content", report.content, driverFidelity));
|
|
6027
|
+
} else if (input.content?.complete) {
|
|
6028
|
+
buckets.set("content", itemBucket("content", input.content.items, "estimated"));
|
|
6029
|
+
} else {
|
|
6030
|
+
contentPending = true;
|
|
6031
|
+
}
|
|
6032
|
+
let used = null;
|
|
6033
|
+
let totalFidelity = "estimated";
|
|
6034
|
+
if (fresh && typeof report.usedTokens === "number") {
|
|
6035
|
+
used = report.usedTokens;
|
|
6036
|
+
totalFidelity = "measured";
|
|
6037
|
+
} else if (input.contextTokens !== null && input.contextTokens > 0) {
|
|
6038
|
+
used = input.contextTokens;
|
|
6039
|
+
totalFidelity = "measured";
|
|
6040
|
+
}
|
|
6041
|
+
if (used !== null) {
|
|
6042
|
+
const pinned = new Set(
|
|
6043
|
+
appended !== void 0 ? ["skaile-system", "agent-prompt"] : []
|
|
6044
|
+
);
|
|
6045
|
+
fitEstimatesWithin(buckets, used, pinned);
|
|
6046
|
+
const remaining = used - sumBuckets(buckets);
|
|
6047
|
+
if (contentPending) {
|
|
6048
|
+
buckets.set("content", {
|
|
6049
|
+
id: "content",
|
|
6050
|
+
tokens: Math.max(0, remaining),
|
|
6051
|
+
fidelity: "derived"
|
|
6052
|
+
});
|
|
6053
|
+
if (providerPending) buckets.set("provider-system", unknownBucket("provider-system"));
|
|
6054
|
+
} else if (providerPending) {
|
|
6055
|
+
buckets.set("provider-system", {
|
|
6056
|
+
id: "provider-system",
|
|
6057
|
+
tokens: Math.max(0, remaining),
|
|
6058
|
+
fidelity: "derived"
|
|
6059
|
+
});
|
|
6060
|
+
} else if (remaining !== 0) {
|
|
6061
|
+
absorbDrift(buckets, remaining, used);
|
|
6062
|
+
}
|
|
6063
|
+
} else {
|
|
6064
|
+
if (contentPending) buckets.set("content", unknownBucket("content"));
|
|
6065
|
+
if (providerPending) buckets.set("provider-system", unknownBucket("provider-system"));
|
|
6066
|
+
used = sumBuckets(buckets);
|
|
6067
|
+
totalFidelity = used > 0 ? "estimated" : "unknown";
|
|
6068
|
+
}
|
|
6069
|
+
const window = input.contextWindow ?? (fresh ? report.contextWindow ?? null : null);
|
|
6070
|
+
if (window !== null && window > 0) {
|
|
6071
|
+
const threshold = input.autoCompactAt !== null ? Math.min(input.autoCompactAt, window) : window;
|
|
6072
|
+
buckets.set("free", {
|
|
6073
|
+
id: "free",
|
|
6074
|
+
tokens: Math.max(0, threshold - used),
|
|
6075
|
+
fidelity: totalFidelity
|
|
6076
|
+
});
|
|
6077
|
+
if (input.autoCompactAt !== null) {
|
|
6078
|
+
buckets.set("compaction-buffer", {
|
|
6079
|
+
id: "compaction-buffer",
|
|
6080
|
+
tokens: Math.max(0, window - Math.max(used, threshold)),
|
|
6081
|
+
fidelity: totalFidelity
|
|
6082
|
+
});
|
|
6083
|
+
}
|
|
6084
|
+
}
|
|
6085
|
+
return {
|
|
6086
|
+
provider: input.provider,
|
|
6087
|
+
model: input.model,
|
|
6088
|
+
contextWindow: window !== null && window > 0 ? window : null,
|
|
6089
|
+
usedTokens: used,
|
|
6090
|
+
totalFidelity,
|
|
6091
|
+
autoCompactAt: input.autoCompactAt,
|
|
6092
|
+
buckets: BUCKET_ORDER.flatMap((id) => {
|
|
6093
|
+
const bucket = buckets.get(id);
|
|
6094
|
+
return bucket ? [bucket] : [];
|
|
6095
|
+
}),
|
|
6096
|
+
capturedAt: input.capturedAt,
|
|
6097
|
+
trigger: input.trigger
|
|
6098
|
+
};
|
|
6099
|
+
}
|
|
6100
|
+
function setStatic(buckets, id, reported, estimatedItems, reportedFidelity) {
|
|
6101
|
+
if (reported) buckets.set(id, reportBucket(id, reported, reportedFidelity));
|
|
6102
|
+
else if (estimatedItems) buckets.set(id, itemBucket(id, estimatedItems, "estimated"));
|
|
6103
|
+
else buckets.set(id, unknownBucket(id));
|
|
6104
|
+
}
|
|
6105
|
+
function reportBucket(id, reported, fidelity) {
|
|
6106
|
+
return {
|
|
6107
|
+
id,
|
|
6108
|
+
tokens: reported.tokens,
|
|
6109
|
+
fidelity,
|
|
6110
|
+
...reported.items ? { items: reported.items } : {},
|
|
6111
|
+
...reported.deferredTokens ? { deferredTokens: reported.deferredTokens } : {}
|
|
6112
|
+
};
|
|
6113
|
+
}
|
|
6114
|
+
function itemBucket(id, items, fidelity) {
|
|
6115
|
+
const deferred = sumTokens(items.filter((i) => i.deferred));
|
|
6116
|
+
return {
|
|
6117
|
+
id,
|
|
6118
|
+
tokens: sumTokens(items.filter((i) => !i.deferred)),
|
|
6119
|
+
fidelity,
|
|
6120
|
+
items,
|
|
6121
|
+
...deferred > 0 ? { deferredTokens: deferred } : {}
|
|
6122
|
+
};
|
|
6123
|
+
}
|
|
6124
|
+
function unknownBucket(id) {
|
|
6125
|
+
return { id, tokens: 0, fidelity: "unknown" };
|
|
6126
|
+
}
|
|
6127
|
+
function fitEstimatesWithin(buckets, used, pinned) {
|
|
6128
|
+
const estimated = [...buckets.values()].filter(
|
|
6129
|
+
(b) => b.fidelity === "estimated" && !pinned.has(b.id)
|
|
6130
|
+
);
|
|
6131
|
+
const estimatedTotal = sumTokens(estimated);
|
|
6132
|
+
const fixedTotal = sumBuckets(buckets) - estimatedTotal;
|
|
6133
|
+
if (estimatedTotal === 0 || fixedTotal + estimatedTotal <= used) return;
|
|
6134
|
+
const budget = Math.max(0, used - fixedTotal);
|
|
6135
|
+
const shares = apportion(
|
|
6136
|
+
estimated.map((b) => b.tokens),
|
|
6137
|
+
budget
|
|
6138
|
+
);
|
|
6139
|
+
estimated.forEach((bucket, i) => {
|
|
6140
|
+
const target = shares[i] ?? 0;
|
|
6141
|
+
if (bucket.items) {
|
|
6142
|
+
const inWindow = bucket.items.filter((it) => !it.deferred);
|
|
6143
|
+
const itemShares = apportion(
|
|
6144
|
+
inWindow.map((it) => it.tokens),
|
|
6145
|
+
target
|
|
6146
|
+
);
|
|
6147
|
+
const scaled = new Map(inWindow.map((it, j) => [it, itemShares[j] ?? 0]));
|
|
6148
|
+
bucket.items = bucket.items.map(
|
|
6149
|
+
(it) => scaled.has(it) ? { ...it, tokens: scaled.get(it) ?? 0 } : it
|
|
6150
|
+
);
|
|
6151
|
+
}
|
|
6152
|
+
bucket.tokens = target;
|
|
6153
|
+
});
|
|
6154
|
+
}
|
|
6155
|
+
function absorbDrift(buckets, remaining, used) {
|
|
6156
|
+
const content = buckets.get("content");
|
|
6157
|
+
if (!content) return;
|
|
6158
|
+
content.tokens = Math.max(0, content.tokens + remaining);
|
|
6159
|
+
if (content.fidelity === "measured" && Math.abs(remaining) > used * MEASURED_DRIFT_TOLERANCE) {
|
|
6160
|
+
content.fidelity = "derived";
|
|
6161
|
+
delete content.items;
|
|
6162
|
+
}
|
|
6163
|
+
}
|
|
6164
|
+
function sumBuckets(buckets) {
|
|
6165
|
+
let total = 0;
|
|
6166
|
+
for (const b of buckets.values()) {
|
|
6167
|
+
if (b.id !== "free" && b.id !== "compaction-buffer") total += b.tokens;
|
|
6168
|
+
}
|
|
6169
|
+
return total;
|
|
6170
|
+
}
|
|
6171
|
+
function sumTokens(items) {
|
|
6172
|
+
return items.reduce((sum, i) => sum + i.tokens, 0);
|
|
6173
|
+
}
|
|
6174
|
+
function apportion(weights, total) {
|
|
6175
|
+
if (weights.length === 0) return [];
|
|
6176
|
+
const target = Math.max(0, Math.round(total));
|
|
6177
|
+
const weightSum = weights.reduce((sum, w) => sum + Math.max(0, w), 0);
|
|
6178
|
+
const raw = weights.map(
|
|
6179
|
+
(w) => weightSum > 0 ? Math.max(0, w) / weightSum * target : target / weights.length
|
|
6180
|
+
);
|
|
6181
|
+
const parts = raw.map(Math.floor);
|
|
6182
|
+
let leftover = target - parts.reduce((sum, p) => sum + p, 0);
|
|
6183
|
+
const byRemainder = raw.map((r, i) => ({ i, rem: r - Math.floor(r) })).sort((a, b) => b.rem - a.rem);
|
|
6184
|
+
for (const { i } of byRemainder) {
|
|
6185
|
+
if (leftover <= 0) break;
|
|
6186
|
+
parts[i] = (parts[i] ?? 0) + 1;
|
|
6187
|
+
leftover--;
|
|
6188
|
+
}
|
|
6189
|
+
return parts;
|
|
6190
|
+
}
|
|
6191
|
+
|
|
6192
|
+
// runner/src/context-usage/transcript-tracker.ts
|
|
6193
|
+
var USER = "User messages";
|
|
6194
|
+
var ASSISTANT = "Assistant messages";
|
|
6195
|
+
var SUMMARY = "Compaction summary";
|
|
6196
|
+
var TranscriptTokenTracker = class {
|
|
6197
|
+
constructor(estimator = defaultTokenEstimator) {
|
|
6198
|
+
this.estimator = estimator;
|
|
6199
|
+
}
|
|
6200
|
+
estimator;
|
|
6201
|
+
// Keyed by group and name, so a tool called "User messages" cannot merge into the user line.
|
|
6202
|
+
totals = /* @__PURE__ */ new Map();
|
|
6203
|
+
complete = false;
|
|
6204
|
+
/** Start over for a freshly built driver; `resuming` marks history we never saw. */
|
|
6205
|
+
reset(opts) {
|
|
6206
|
+
this.totals.clear();
|
|
6207
|
+
this.complete = !opts.resuming;
|
|
6208
|
+
}
|
|
6209
|
+
/** A compaction replaced the conversation with its summary. */
|
|
6210
|
+
resetToSummary(summary) {
|
|
6211
|
+
this.totals.clear();
|
|
6212
|
+
this.add(SUMMARY, "messages", this.estimator.text(summary));
|
|
6213
|
+
this.complete = true;
|
|
6214
|
+
}
|
|
6215
|
+
observeUserPrompt(text2) {
|
|
6216
|
+
this.add(USER, "messages", this.estimator.text(text2));
|
|
6217
|
+
}
|
|
6218
|
+
observe(event) {
|
|
6219
|
+
switch (event.type) {
|
|
6220
|
+
case "text":
|
|
6221
|
+
this.add(ASSISTANT, "messages", this.estimator.text(event.content));
|
|
6222
|
+
break;
|
|
6223
|
+
case "text_retract":
|
|
6224
|
+
this.add(ASSISTANT, "messages", -this.estimator.text(event.content));
|
|
6225
|
+
break;
|
|
6226
|
+
case "tool_call":
|
|
6227
|
+
if (event.parentToolUseId) return;
|
|
6228
|
+
this.add(event.tool, "tools", this.estimator.json(event.input));
|
|
6229
|
+
break;
|
|
6230
|
+
case "tool_result":
|
|
6231
|
+
if (event.parentToolUseId) return;
|
|
6232
|
+
this.add(
|
|
6233
|
+
event.tool,
|
|
6234
|
+
"tools",
|
|
6235
|
+
typeof event.output === "string" ? this.estimator.text(event.output) : this.estimator.json(event.output)
|
|
6236
|
+
);
|
|
6237
|
+
break;
|
|
6238
|
+
}
|
|
6239
|
+
}
|
|
6240
|
+
estimate() {
|
|
6241
|
+
const items = [...this.totals.values()].filter((v) => v.tokens > 0).map((v) => ({ name: v.name, tokens: v.tokens, group: v.group })).sort((a, b) => b.tokens - a.tokens);
|
|
6242
|
+
return {
|
|
6243
|
+
tokens: items.reduce((sum, i) => sum + i.tokens, 0),
|
|
6244
|
+
items,
|
|
6245
|
+
complete: this.complete
|
|
6246
|
+
};
|
|
6247
|
+
}
|
|
6248
|
+
add(name, group, tokens) {
|
|
6249
|
+
if (tokens === 0) return;
|
|
6250
|
+
const key = `${group}\0${name}`;
|
|
6251
|
+
const current = this.totals.get(key);
|
|
6252
|
+
this.totals.set(key, { name, group, tokens: Math.max(0, (current?.tokens ?? 0) + tokens) });
|
|
6253
|
+
}
|
|
6254
|
+
};
|
|
6255
|
+
|
|
6256
|
+
// runner/src/context-usage/collector.ts
|
|
6257
|
+
var DEFAULT_MEASURE_TIMEOUT_MS = 3e4;
|
|
6258
|
+
var SKILL_READ_TIMEOUT_MS = 5e3;
|
|
6259
|
+
var ContextUsageCollector = class {
|
|
6260
|
+
constructor(deps) {
|
|
6261
|
+
this.deps = deps;
|
|
6262
|
+
this.estimator = deps.estimator ?? defaultTokenEstimator;
|
|
6263
|
+
this.tracker = new TranscriptTokenTracker(this.estimator);
|
|
6264
|
+
}
|
|
6265
|
+
deps;
|
|
6266
|
+
tracker;
|
|
6267
|
+
estimator;
|
|
6268
|
+
lastReport = null;
|
|
6269
|
+
inflight = /* @__PURE__ */ new Map();
|
|
6270
|
+
skills = null;
|
|
6271
|
+
capabilityMemo = null;
|
|
6272
|
+
/** A driver was (re)built; everything measured or cached about the old one is void. */
|
|
6273
|
+
onDriverBuilt(opts) {
|
|
6274
|
+
this.tracker.reset(opts);
|
|
6275
|
+
this.lastReport = null;
|
|
6276
|
+
this.skills = null;
|
|
6277
|
+
this.inflight.clear();
|
|
6278
|
+
}
|
|
6279
|
+
onCompaction(summary) {
|
|
6280
|
+
this.tracker.resetToSummary(summary);
|
|
6281
|
+
}
|
|
6282
|
+
observeUserPrompt(text2) {
|
|
6283
|
+
this.tracker.observeUserPrompt(text2);
|
|
6284
|
+
}
|
|
6285
|
+
observeEvent(event) {
|
|
6286
|
+
this.tracker.observe(event);
|
|
6287
|
+
}
|
|
6288
|
+
async collect(opts) {
|
|
6289
|
+
try {
|
|
6290
|
+
return await this.collectUnsafe(opts);
|
|
6291
|
+
} catch (err) {
|
|
6292
|
+
return {
|
|
6293
|
+
snapshot: {
|
|
6294
|
+
provider: safeCall(() => this.deps.provider(), "unknown"),
|
|
6295
|
+
model: safeCall(() => this.deps.driver()?.getModel?.() ?? "", ""),
|
|
6296
|
+
contextWindow: null,
|
|
6297
|
+
usedTokens: 0,
|
|
6298
|
+
totalFidelity: "unknown",
|
|
6299
|
+
autoCompactAt: null,
|
|
6300
|
+
buckets: [],
|
|
6301
|
+
capturedAt: (this.deps.now?.() ?? /* @__PURE__ */ new Date()).toISOString(),
|
|
6302
|
+
trigger: opts.trigger
|
|
6303
|
+
},
|
|
6304
|
+
error: `context usage unavailable: ${err instanceof Error ? err.message : String(err)}`
|
|
6305
|
+
};
|
|
6306
|
+
}
|
|
6307
|
+
}
|
|
6308
|
+
async collectUnsafe(opts) {
|
|
6309
|
+
const driver = this.deps.driver();
|
|
6310
|
+
let error;
|
|
6311
|
+
let report = null;
|
|
6312
|
+
let reportFresh = false;
|
|
6313
|
+
if (opts.measure && driver?.getContextUsageReport) {
|
|
6314
|
+
try {
|
|
6315
|
+
const detail = opts.measure;
|
|
6316
|
+
const measure2 = driver.getContextUsageReport.bind(driver);
|
|
6317
|
+
report = await this.sharedMeasurement(detail, () => measure2({ detail }));
|
|
6318
|
+
if (report) {
|
|
6319
|
+
this.lastReport = report;
|
|
6320
|
+
reportFresh = true;
|
|
6321
|
+
}
|
|
6322
|
+
} catch (err) {
|
|
6323
|
+
error = `measurement failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
6324
|
+
}
|
|
6325
|
+
}
|
|
6326
|
+
report ??= this.lastReport;
|
|
6327
|
+
const model = driver?.getModel?.() ?? "";
|
|
6328
|
+
const usage = driver?.getTokenUsage() ?? null;
|
|
6329
|
+
const perCall = driver?.getContextTokens?.() ?? null;
|
|
6330
|
+
const fill = opts.trigger === "compaction" ? null : perCall ?? (usage ? contextTokens(usage) : null);
|
|
6331
|
+
const snapshot = composeContextUsageSnapshot({
|
|
6332
|
+
provider: this.deps.provider(),
|
|
6333
|
+
model,
|
|
6334
|
+
trigger: opts.trigger,
|
|
6335
|
+
capturedAt: (this.deps.now?.() ?? /* @__PURE__ */ new Date()).toISOString(),
|
|
6336
|
+
contextTokens: fill,
|
|
6337
|
+
contextWindow: driver ? reportedContextWindow(driver.getContextWindow(), model || null) : null,
|
|
6338
|
+
autoCompactAt: this.deps.autoCompactAt(),
|
|
6339
|
+
systemPromptSections: this.deps.systemPromptSections(),
|
|
6340
|
+
report,
|
|
6341
|
+
reportFresh,
|
|
6342
|
+
skills: report?.skills ? null : await this.skillItems(),
|
|
6343
|
+
mcpTools: report?.mcpTools ? null : this.capabilityItems(),
|
|
6344
|
+
content: this.tracker.estimate(),
|
|
6345
|
+
estimator: this.estimator
|
|
6346
|
+
});
|
|
6347
|
+
return error ? { snapshot, error } : { snapshot };
|
|
6348
|
+
}
|
|
6349
|
+
/**
|
|
6350
|
+
* One driver measurement per detail level at a time: a second request that
|
|
6351
|
+
* lands while a `full` count is running (two panels, a double click) shares
|
|
6352
|
+
* it instead of paying for another round of `count_tokens` calls.
|
|
6353
|
+
*/
|
|
6354
|
+
sharedMeasurement(detail, measure2) {
|
|
6355
|
+
const running = this.inflight.get(detail);
|
|
6356
|
+
if (running) return running;
|
|
6357
|
+
const measurement = withTimeout(
|
|
6358
|
+
measure2(),
|
|
6359
|
+
this.deps.measureTimeoutMs ?? DEFAULT_MEASURE_TIMEOUT_MS
|
|
6360
|
+
).finally(() => {
|
|
6361
|
+
if (this.inflight.get(detail) === measurement) this.inflight.delete(detail);
|
|
6362
|
+
});
|
|
6363
|
+
this.inflight.set(detail, measurement);
|
|
6364
|
+
return measurement;
|
|
6365
|
+
}
|
|
6366
|
+
skillItems() {
|
|
6367
|
+
this.skills ??= withTimeout(this.deps.readSkills(), SKILL_READ_TIMEOUT_MS).then(
|
|
6368
|
+
(skills) => skills.map((s) => ({
|
|
6369
|
+
name: s.name,
|
|
6370
|
+
tokens: this.estimator.text(s.frontmatter),
|
|
6371
|
+
...s.source ? { source: s.source } : {}
|
|
6372
|
+
})),
|
|
6373
|
+
() => null
|
|
6374
|
+
);
|
|
6375
|
+
return this.skills;
|
|
6376
|
+
}
|
|
6377
|
+
capabilityItems() {
|
|
6378
|
+
const caps = this.deps.modelCapabilities();
|
|
6379
|
+
const key = caps.map((c) => c.name).join("\n");
|
|
6380
|
+
if (this.capabilityMemo?.key === key) return this.capabilityMemo.items;
|
|
6381
|
+
const items = caps.map((c) => ({
|
|
6382
|
+
name: c.name,
|
|
6383
|
+
tokens: this.estimator.text(c.name) + this.estimator.text(c.description) + this.estimator.json(c.inputSchema),
|
|
6384
|
+
group: capabilityGroup(c.origin)
|
|
6385
|
+
}));
|
|
6386
|
+
this.capabilityMemo = { key, items };
|
|
6387
|
+
return items;
|
|
6388
|
+
}
|
|
6389
|
+
};
|
|
6390
|
+
function capabilityGroup(origin) {
|
|
6391
|
+
switch (origin.kind) {
|
|
6392
|
+
case "mcp":
|
|
6393
|
+
return origin.serverId;
|
|
6394
|
+
case "connector":
|
|
6395
|
+
return origin.connectorId;
|
|
6396
|
+
case "mount":
|
|
6397
|
+
return origin.mountId;
|
|
6398
|
+
case "skill":
|
|
6399
|
+
return origin.skillId;
|
|
6400
|
+
case "flow":
|
|
6401
|
+
return origin.flowId;
|
|
6402
|
+
case "app":
|
|
6403
|
+
return origin.appId;
|
|
6404
|
+
default:
|
|
6405
|
+
return origin.kind;
|
|
6406
|
+
}
|
|
6407
|
+
}
|
|
6408
|
+
function safeCall(fn, fallback) {
|
|
6409
|
+
try {
|
|
6410
|
+
return fn();
|
|
6411
|
+
} catch {
|
|
6412
|
+
return fallback;
|
|
6413
|
+
}
|
|
6414
|
+
}
|
|
6415
|
+
function withTimeout(promise, ms) {
|
|
6416
|
+
let timer;
|
|
6417
|
+
const timeout2 = new Promise((_, reject) => {
|
|
6418
|
+
timer = setTimeout(() => reject(new Error(`timed out after ${ms} ms`)), ms);
|
|
6419
|
+
timer.unref?.();
|
|
6420
|
+
});
|
|
6421
|
+
return Promise.race([promise, timeout2]).finally(() => clearTimeout(timer));
|
|
6422
|
+
}
|
|
6423
|
+
var MAX_SKILLS = 500;
|
|
6424
|
+
async function readSkillListings(skillsDir) {
|
|
6425
|
+
let entries;
|
|
6426
|
+
try {
|
|
6427
|
+
entries = (await readdir(skillsDir, { withFileTypes: true })).filter((e) => e.isDirectory() || e.isSymbolicLink()).map((e) => e.name).slice(0, MAX_SKILLS);
|
|
6428
|
+
} catch {
|
|
6429
|
+
return [];
|
|
6430
|
+
}
|
|
6431
|
+
const listings = await Promise.all(
|
|
6432
|
+
entries.map(async (dir) => {
|
|
6433
|
+
const path6 = join(skillsDir, dir, "SKILL.md");
|
|
6434
|
+
try {
|
|
6435
|
+
const { data } = parseFrontmatter(await readFile(path6, "utf8"));
|
|
6436
|
+
const name = typeof data.name === "string" ? data.name : dir;
|
|
6437
|
+
const description = typeof data.description === "string" ? data.description : "";
|
|
6438
|
+
return { name, frontmatter: `${name}: ${description}`, source: path6 };
|
|
6439
|
+
} catch {
|
|
6440
|
+
return null;
|
|
6441
|
+
}
|
|
6442
|
+
})
|
|
6443
|
+
);
|
|
6444
|
+
return listings.filter((l) => l !== null);
|
|
6445
|
+
}
|
|
6446
|
+
|
|
5787
6447
|
// runner/src/lifecycle-handler.ts
|
|
5788
6448
|
function raiseHookFailures(phase, results, log) {
|
|
5789
6449
|
const failed = results.filter((r) => !r.ok);
|
|
@@ -7283,11 +7943,21 @@ async function startAgentServer(opts) {
|
|
|
7283
7943
|
})
|
|
7284
7944
|
);
|
|
7285
7945
|
const turnStatus = new TurnStatusTracker();
|
|
7946
|
+
const eventGapBuffer = new EventGapBuffer();
|
|
7286
7947
|
function sendEvent(event) {
|
|
7287
7948
|
turnStatus.observe(event);
|
|
7288
7949
|
if (transport.connected) {
|
|
7289
7950
|
transport.send(event);
|
|
7951
|
+
return;
|
|
7290
7952
|
}
|
|
7953
|
+
if (!initAcknowledged) return;
|
|
7954
|
+
eventGapBuffer.push(event, { isStale: settledCapabilityCallCheck(event) });
|
|
7955
|
+
}
|
|
7956
|
+
function settledCapabilityCallCheck(event) {
|
|
7957
|
+
if (event.type !== "capability_invoked") return void 0;
|
|
7958
|
+
const { callId } = event;
|
|
7959
|
+
if (!pendingCapabilityCalls.has(callId)) return void 0;
|
|
7960
|
+
return () => !pendingCapabilityCalls.has(callId);
|
|
7291
7961
|
}
|
|
7292
7962
|
let initAcknowledged = false;
|
|
7293
7963
|
let initGeneration = 0;
|
|
@@ -7305,6 +7975,20 @@ async function startAgentServer(opts) {
|
|
|
7305
7975
|
bootstrapCapabilityRegistry(capabilityRegistry);
|
|
7306
7976
|
const hostRuntimeCapabilities = /* @__PURE__ */ new Set();
|
|
7307
7977
|
const pendingCapabilityCalls = /* @__PURE__ */ new Map();
|
|
7978
|
+
function rejectCallsSentToPreviousPeer(trigger) {
|
|
7979
|
+
const unsent = eventGapBuffer.heldCapabilityCallIds();
|
|
7980
|
+
const rejected = rejectPendingCapabilityCallsOnDisconnect(
|
|
7981
|
+
pendingCapabilityCalls,
|
|
7982
|
+
(callId) => unsent.has(callId)
|
|
7983
|
+
);
|
|
7984
|
+
if (rejected > 0) {
|
|
7985
|
+
serverLog.warn(
|
|
7986
|
+
`[serve] platform connection dropped (${trigger}); rejected ${rejected} in-flight capability call(s)`
|
|
7987
|
+
);
|
|
7988
|
+
}
|
|
7989
|
+
}
|
|
7990
|
+
transport.onDisconnect(() => rejectCallsSentToPreviousPeer("disconnect"));
|
|
7991
|
+
transport.onConnect(() => rejectCallsSentToPreviousPeer("replaced connection"));
|
|
7308
7992
|
const remoteCapabilityInvoker = (name, input, timeoutMs, signal) => {
|
|
7309
7993
|
const callId = typeof crypto?.randomUUID === "function" ? crypto.randomUUID() : `rcap-${Date.now()}-${Math.floor(Math.random() * 1e9)}`;
|
|
7310
7994
|
return new Promise((resolve4, reject) => {
|
|
@@ -7347,13 +8031,11 @@ async function startAgentServer(opts) {
|
|
|
7347
8031
|
t.unref?.();
|
|
7348
8032
|
});
|
|
7349
8033
|
async function mintAndPersistAiCredential(args) {
|
|
7350
|
-
|
|
7351
|
-
|
|
7352
|
-
|
|
7353
|
-
|
|
7354
|
-
|
|
7355
|
-
};
|
|
7356
|
-
}
|
|
8034
|
+
const precondition = aiMintPreconditionFailure({
|
|
8035
|
+
connected: transport.connected,
|
|
8036
|
+
configId: aiProviderConfigId
|
|
8037
|
+
});
|
|
8038
|
+
if (precondition) return precondition;
|
|
7357
8039
|
const targetConfigId = args.configId || aiProviderConfigId;
|
|
7358
8040
|
try {
|
|
7359
8041
|
const home = process.env.HOME || homedir();
|
|
@@ -7650,6 +8332,19 @@ async function startAgentServer(opts) {
|
|
|
7650
8332
|
});
|
|
7651
8333
|
let sessionConfig;
|
|
7652
8334
|
let agentSession;
|
|
8335
|
+
const contextUsage = new ContextUsageCollector({
|
|
8336
|
+
driver: () => driver,
|
|
8337
|
+
provider: () => agentSession?.driverType ?? "unknown",
|
|
8338
|
+
systemPromptSections: () => agentSession?.systemPromptSections ?? [],
|
|
8339
|
+
modelCapabilities: () => capabilityRegistry.list().filter(
|
|
8340
|
+
(cap) => (cap.audience ?? ["llm", "user"]).includes("llm") && !cap.name.startsWith("host.") && !cap.name.startsWith("runner.")
|
|
8341
|
+
),
|
|
8342
|
+
readSkills: () => readSkillListings(join(opts.projectDir, activeSkillsDir())),
|
|
8343
|
+
autoCompactAt: () => compactionOrchestrator?.compactAtTokens() ?? null
|
|
8344
|
+
});
|
|
8345
|
+
function noteAgentSessionBuilt(resumeSessionId2) {
|
|
8346
|
+
contextUsage.onDriverBuilt({ resuming: !!resumeSessionId2 || !!managedCodex });
|
|
8347
|
+
}
|
|
7653
8348
|
let flowToolsBaked = false;
|
|
7654
8349
|
let secretProvider;
|
|
7655
8350
|
let runtimeIdentity;
|
|
@@ -7729,6 +8424,7 @@ async function startAgentServer(opts) {
|
|
|
7729
8424
|
sessionConfig = buildSessionConfig();
|
|
7730
8425
|
agentSession = await createAgentSession(sessionConfig);
|
|
7731
8426
|
emitSystemPromptComposed(agentSession, sendEvent);
|
|
8427
|
+
noteAgentSessionBuilt(sessionConfig.resumeSessionId);
|
|
7732
8428
|
registerSessionComposition(agentSession);
|
|
7733
8429
|
resolveSessionReady();
|
|
7734
8430
|
captureBakedMcpServers();
|
|
@@ -7818,12 +8514,14 @@ async function startAgentServer(opts) {
|
|
|
7818
8514
|
const normalizer = new EventNormalizer();
|
|
7819
8515
|
function forwardNormalizedEvent(event) {
|
|
7820
8516
|
if (compacting) return;
|
|
8517
|
+
contextUsage.observeEvent(event);
|
|
7821
8518
|
const isTransient = event.type === "status" || event.type === "sync_status" || event.type === "resources_available" || event.type === "resource_response" || event.type === "commands_available";
|
|
7822
8519
|
if (!isTransient) {
|
|
7823
8520
|
eventSeq++;
|
|
7824
8521
|
compactionOrchestrator?.trackMessage(eventSeq);
|
|
7825
8522
|
}
|
|
7826
8523
|
if (event.type === "finished") {
|
|
8524
|
+
scheduleContextUsageEmit("turn-end");
|
|
7827
8525
|
if (!compacting && compactionOrchestrator?.shouldCompact()) {
|
|
7828
8526
|
const compactionTimer = setTimeout(() => {
|
|
7829
8527
|
if (compacting || !compactionOrchestrator?.shouldCompact()) return;
|
|
@@ -7894,6 +8592,16 @@ async function startAgentServer(opts) {
|
|
|
7894
8592
|
let suppressedBy = null;
|
|
7895
8593
|
let compactionOrchestrator = null;
|
|
7896
8594
|
const compactionConfig = wsConfig.compaction;
|
|
8595
|
+
function scheduleContextUsageEmit(trigger) {
|
|
8596
|
+
const timer = setTimeout(() => {
|
|
8597
|
+
void contextUsage.collect({ trigger, measure: trigger === "turn-end" ? "summary" : false }).then(({ snapshot, error }) => {
|
|
8598
|
+
sendEvent({ type: "context_usage", snapshot, ...error ? { error } : {} });
|
|
8599
|
+
}).catch((err) => {
|
|
8600
|
+
serverLog.debug(`[serve] context_usage emit failed: ${String(err)}`);
|
|
8601
|
+
});
|
|
8602
|
+
}, 0);
|
|
8603
|
+
timer.unref?.();
|
|
8604
|
+
}
|
|
7897
8605
|
function rebuildCompactionOrchestrator() {
|
|
7898
8606
|
if (!driver) return;
|
|
7899
8607
|
let gateHold = null;
|
|
@@ -7909,6 +8617,8 @@ async function startAgentServer(opts) {
|
|
|
7909
8617
|
},
|
|
7910
8618
|
onSnapshot: (snapshot) => {
|
|
7911
8619
|
sendEvent(snapshot);
|
|
8620
|
+
contextUsage.onCompaction(snapshot.summary);
|
|
8621
|
+
scheduleContextUsageEmit("compaction");
|
|
7912
8622
|
},
|
|
7913
8623
|
onCompactionAttempt: (event) => {
|
|
7914
8624
|
sendEvent(event);
|
|
@@ -8265,6 +8975,7 @@ async function startAgentServer(opts) {
|
|
|
8265
8975
|
async function cleanup() {
|
|
8266
8976
|
if (managedHost) managedBootstrapClosed = true;
|
|
8267
8977
|
initAcknowledged = false;
|
|
8978
|
+
eventGapBuffer.clear();
|
|
8268
8979
|
try {
|
|
8269
8980
|
await Promise.race([
|
|
8270
8981
|
sessionReady,
|
|
@@ -8397,6 +9108,7 @@ async function startAgentServer(opts) {
|
|
|
8397
9108
|
throw new Error("CODEX_RUNTIME_UNSUPPORTED");
|
|
8398
9109
|
}
|
|
8399
9110
|
emitSystemPromptComposed(agentSession, sendEvent);
|
|
9111
|
+
noteAgentSessionBuilt(sessionConfig.resumeSessionId);
|
|
8400
9112
|
resourceManager = agentSession.resourceManager;
|
|
8401
9113
|
driver = agentSession.driver;
|
|
8402
9114
|
rebuildCompactionOrchestrator();
|
|
@@ -8471,6 +9183,7 @@ async function startAgentServer(opts) {
|
|
|
8471
9183
|
resuming: !!overrides.resumeSessionId
|
|
8472
9184
|
});
|
|
8473
9185
|
emitSystemPromptComposed(agentSession, sendEvent);
|
|
9186
|
+
noteAgentSessionBuilt({ ...sessionConfig, ...overrides }.resumeSessionId);
|
|
8474
9187
|
swapDriver();
|
|
8475
9188
|
rebuildCompactionOrchestrator();
|
|
8476
9189
|
captureBakedMcpServers();
|
|
@@ -9009,6 +9722,7 @@ async function startAgentServer(opts) {
|
|
|
9009
9722
|
return;
|
|
9010
9723
|
}
|
|
9011
9724
|
log(`[serve] prompt: ${cmd.prompt.slice(0, 80)}...`);
|
|
9725
|
+
contextUsage.observeUserPrompt(cmd.prompt);
|
|
9012
9726
|
await driverSwapGate.awaitSwap();
|
|
9013
9727
|
if (!await awaitCompactionIdle("prompt")) return;
|
|
9014
9728
|
await restageMaterializedSkills(true);
|
|
@@ -9250,6 +9964,22 @@ async function startAgentServer(opts) {
|
|
|
9250
9964
|
}
|
|
9251
9965
|
sendEvent({ type: "debug_result", query: cmd.query, data: result });
|
|
9252
9966
|
}
|
|
9967
|
+
async function handleGetContextUsage(cmd) {
|
|
9968
|
+
try {
|
|
9969
|
+
await sessionReady;
|
|
9970
|
+
} catch {
|
|
9971
|
+
}
|
|
9972
|
+
const { snapshot, error } = await contextUsage.collect({
|
|
9973
|
+
trigger: "request",
|
|
9974
|
+
measure: cmd.detail === "estimated" ? "summary" : "full"
|
|
9975
|
+
});
|
|
9976
|
+
sendEvent({
|
|
9977
|
+
type: "context_usage",
|
|
9978
|
+
requestId: cmd.requestId,
|
|
9979
|
+
snapshot,
|
|
9980
|
+
...error ? { error } : {}
|
|
9981
|
+
});
|
|
9982
|
+
}
|
|
9253
9983
|
async function handleShutdown() {
|
|
9254
9984
|
log("[serve] shutdown requested");
|
|
9255
9985
|
await cleanup();
|
|
@@ -9370,6 +10100,9 @@ async function startAgentServer(opts) {
|
|
|
9370
10100
|
case "debug":
|
|
9371
10101
|
await handleDebug(cmd);
|
|
9372
10102
|
break;
|
|
10103
|
+
case "get_context_usage":
|
|
10104
|
+
await handleGetContextUsage(cmd);
|
|
10105
|
+
break;
|
|
9373
10106
|
// -----------------------------------------------------------------------
|
|
9374
10107
|
// -----------------------------------------------------------------------
|
|
9375
10108
|
// v3: add_resource, remove_resource, remount_mount, set_log_level,
|
|
@@ -9413,9 +10146,28 @@ async function startAgentServer(opts) {
|
|
|
9413
10146
|
replayed: true
|
|
9414
10147
|
});
|
|
9415
10148
|
});
|
|
10149
|
+
transport.onConnect(() => {
|
|
10150
|
+
if (!eventGapBuffer.hasPending) return;
|
|
10151
|
+
if (!initAcknowledged || sessionReadyOutcome === "rejected") {
|
|
10152
|
+
const discarded = eventGapBuffer.clear();
|
|
10153
|
+
serverLog.warn(
|
|
10154
|
+
`[serve] discarded ${discarded} event(s) buffered while disconnected: the init they belong to is no longer acknowledged`
|
|
10155
|
+
);
|
|
10156
|
+
return;
|
|
10157
|
+
}
|
|
10158
|
+
const { events, dropped, stale } = eventGapBuffer.drain();
|
|
10159
|
+
for (const event of events) transport.send(event);
|
|
10160
|
+
serverLog.warn(
|
|
10161
|
+
`[serve] flushed ${events.length} event(s) buffered while the platform was disconnected; dropped ${dropped} over the buffer cap, withheld ${stale} settled capability call(s)`
|
|
10162
|
+
);
|
|
10163
|
+
});
|
|
9416
10164
|
transport.onConnect(() => {
|
|
9417
10165
|
sendEvent(turnStatus.snapshot());
|
|
9418
10166
|
});
|
|
10167
|
+
transport.onConnect(() => {
|
|
10168
|
+
if (!initAcknowledged || managedCodex || aiProviderConfigId === void 0) return;
|
|
10169
|
+
aiCredentialRefreshScheduler.ensureArmed();
|
|
10170
|
+
});
|
|
9419
10171
|
transport.onConnect(() => {
|
|
9420
10172
|
if (managedHost && !managedBootstrapClosed)
|
|
9421
10173
|
sendEvent({
|
|
@@ -9630,6 +10382,6 @@ function touchSession(state) {
|
|
|
9630
10382
|
return { ...state, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
9631
10383
|
}
|
|
9632
10384
|
|
|
9633
|
-
export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, DEFAULT_FLOW_MUTATE_CONNECTOR_WAIT_MS, MOUNT_LIST_MAX_DEPTH, MOUNT_LIST_MAX_ENTRIES, MOUNT_READ_DEADLINE_FACTOR, MOUNT_STAT_BUDGET_MS, MOUNT_STAT_MAX_ENTRIES, MOUNT_TREE_OP_DEADLINE_FACTOR, MarkdownStreamer, PreInitRingSink, ResourceOperationError, SESSION_ROOT_WRITABLE_DIRS, SESSION_ROOT_WRITABLE_FILES, WS_AUTH_TOKEN_ENV, WS_AUTH_TOKEN_FILE_ENV, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildConnectorTokenMediator, buildContextSection, buildEnvironmentSection, buildResourcesAvailablePayload, buildStoreSnapshotReplay, builtinCapabilities, capabilityLogInstance, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, computeDirectoryTotals, connectorRefreshKind, createAgentSession, createFlowConnectorReadiness, createManagedCodexSubpromptDriver, createSessionStimulusBus, defineCapability, deleteSession, dispatchResourceRequest, dispatchRunnerCapabilityInvocation, emitSystemPromptComposed, ensureClaudeSettingsDisablesConnectors, ensureGitConfigInclude, executeConnectorMutate, extractClaudeAiOauthExpiresAt, flowStartNeedsDriverRestart, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, handleSessionRootResourceRequest, hasNonTerminalFlow, hostOpResumeStimulus, installPreInitRingSink, isSessionRootPathAllowed, isTerminalFlowStatus, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadManagedCodexHostConfig, loadSession, loadSessionById, mcpAuthSecretKey, newSession, nulTailPaddingLength, pickFlowToolTarget, pickRepointedManager, planFlowMutate, prepareCodexTools, reconcilePendingDecisions, registerActiveFlow, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveFlowMutateConnectorWaitMs, resolveMixin, runAgentChat, saveSession, setCurrentSession, setUpFlowConnector, startAgentServer, stimulusFromMetas, supportsLiveToolUpdates, takeRunnerWsAuthToken, touchSession, validateInputResponse, writeClaudeCodeCredentialsFile };
|
|
9634
|
-
//# sourceMappingURL=chunk-
|
|
9635
|
-
//# sourceMappingURL=chunk-
|
|
10385
|
+
export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, DEFAULT_FLOW_MUTATE_CONNECTOR_WAIT_MS, MOUNT_LIST_MAX_DEPTH, MOUNT_LIST_MAX_ENTRIES, MOUNT_READ_DEADLINE_FACTOR, MOUNT_STAT_BUDGET_MS, MOUNT_STAT_MAX_ENTRIES, MOUNT_TREE_OP_DEADLINE_FACTOR, MarkdownStreamer, PreInitRingSink, ResourceOperationError, SESSION_ROOT_WRITABLE_DIRS, SESSION_ROOT_WRITABLE_FILES, WS_AUTH_TOKEN_ENV, WS_AUTH_TOKEN_FILE_ENV, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildConnectorTokenMediator, buildContextSection, buildEnvironmentSection, buildResourcesAvailablePayload, buildStoreSnapshotReplay, builtinCapabilities, capabilityLogInstance, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, computeDirectoryTotals, connectorRefreshKind, createAgentSession, createFlowConnectorReadiness, createManagedCodexSubpromptDriver, createSessionStimulusBus, defineCapability, deleteSession, dispatchResourceRequest, dispatchRunnerCapabilityInvocation, emitSystemPromptComposed, ensureClaudeSettingsDisablesConnectors, ensureGitConfigInclude, executeConnectorMutate, extractClaudeAiOauthExpiresAt, flowStartNeedsDriverRestart, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, handleSessionRootResourceRequest, hasNonTerminalFlow, hostOpResumeStimulus, installPreInitRingSink, isSessionRootPathAllowed, isTerminalFlowStatus, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadManagedCodexHostConfig, loadSession, loadSessionById, mcpAuthSecretKey, newSession, nulTailPaddingLength, pickFlowToolTarget, pickRepointedManager, planFlowMutate, prepareCodexTools, reconcilePendingDecisions, registerActiveFlow, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, rejectPendingCapabilityCallsOnDisconnect, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveFlowMutateConnectorWaitMs, resolveMixin, runAgentChat, saveSession, setCurrentSession, setUpFlowConnector, startAgentServer, stimulusFromMetas, supportsLiveToolUpdates, takeRunnerWsAuthToken, touchSession, validateInputResponse, writeClaudeCodeCredentialsFile };
|
|
10386
|
+
//# sourceMappingURL=chunk-N5XNEKHC.js.map
|
|
10387
|
+
//# sourceMappingURL=chunk-N5XNEKHC.js.map
|