acpx 0.9.0 → 0.11.0
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/README.md +23 -19
- package/dist/{cli-Bf3yjqzE.js → cli-CC2w0U-A.js} +4 -4
- package/dist/{cli-Bf3yjqzE.js.map → cli-CC2w0U-A.js.map} +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +685 -67
- package/dist/cli.js.map +1 -1
- package/dist/{client-BssohYqM.d.ts → client-j3sLnpcM.d.ts} +27 -4
- package/dist/client-j3sLnpcM.d.ts.map +1 -0
- package/dist/{flags-C-rwARqg.js → flags-BKjjl3tF.js} +4 -4
- package/dist/flags-BKjjl3tF.js.map +1 -0
- package/dist/{flows-WLs26_5Y.js → flows-BabqiU0u.js} +5 -4
- package/dist/flows-BabqiU0u.js.map +1 -0
- package/dist/flows.d.ts +1 -1
- package/dist/flows.d.ts.map +1 -1
- package/dist/flows.js +1 -1
- package/dist/{live-checkpoint-D5d-K9s1.js → live-checkpoint-BZrk9Mjz.js} +894 -384
- package/dist/live-checkpoint-BZrk9Mjz.js.map +1 -0
- package/dist/{output-DPg20dvn.js → output-D_BGt1YI.js} +180 -98
- package/dist/output-D_BGt1YI.js.map +1 -0
- package/dist/runtime.d.ts +71 -5
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +188 -32
- package/dist/runtime.js.map +1 -1
- package/dist/{session-options-CFudjdkU.d.ts → session-options-Co1oGEK8.d.ts} +22 -2
- package/dist/{session-options-CFudjdkU.d.ts.map → session-options-Co1oGEK8.d.ts.map} +1 -1
- package/package.json +23 -17
- package/skills/acpx/SKILL.md +66 -5
- package/dist/client-BssohYqM.d.ts.map +0 -1
- package/dist/flags-C-rwARqg.js.map +0 -1
- package/dist/flows-WLs26_5Y.js.map +0 -1
- package/dist/live-checkpoint-D5d-K9s1.js.map +0 -1
- package/dist/output-DPg20dvn.js.map +0 -1
package/dist/runtime.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as AcpPermissionRequest, c as NonInteractivePermissionPolicy, f as SessionRecord, i as AcpPermissionDecision, l as PermissionMode, n as SystemPromptOption, s as McpServer$1, t as SessionAgentOptions } from "./session-options-
|
|
2
|
-
import { t as AcpClient } from "./client-
|
|
1
|
+
import { a as AcpPermissionRequest, c as NonInteractivePermissionPolicy, f as SessionRecord, i as AcpPermissionDecision, l as PermissionMode, n as SystemPromptOption, s as McpServer$1, t as SessionAgentOptions } from "./session-options-Co1oGEK8.js";
|
|
2
|
+
import { t as AcpClient } from "./client-j3sLnpcM.js";
|
|
3
3
|
import fs from "node:fs";
|
|
4
4
|
import { ToolCallContent, ToolCallLocation, ToolKind } from "@agentclientprotocol/sdk";
|
|
5
5
|
|
|
@@ -61,12 +61,64 @@ type AcpRuntimeSessionModels = {
|
|
|
61
61
|
currentModelId?: string;
|
|
62
62
|
availableModelIds: string[];
|
|
63
63
|
};
|
|
64
|
+
/**
|
|
65
|
+
* Cumulative session cost as reported by the agent. Mirrors ACP's
|
|
66
|
+
* `Cost`, but both fields are optional here because not every adapter
|
|
67
|
+
* populates them on every event.
|
|
68
|
+
*/
|
|
69
|
+
type AcpRuntimeUsageCost = {
|
|
70
|
+
amount?: number;
|
|
71
|
+
currency?: string;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Per-turn token breakdown. Sourced from `UsageUpdate._meta.usage` on
|
|
75
|
+
* adapters that populate it (Claude Code today; Codex and others may
|
|
76
|
+
* omit it). All fields optional — consumers should treat missing
|
|
77
|
+
* fields as "unknown", not "zero".
|
|
78
|
+
*/
|
|
79
|
+
type AcpRuntimeUsageBreakdown = {
|
|
80
|
+
inputTokens?: number;
|
|
81
|
+
outputTokens?: number;
|
|
82
|
+
cachedReadTokens?: number;
|
|
83
|
+
cachedWriteTokens?: number;
|
|
84
|
+
thoughtTokens?: number;
|
|
85
|
+
totalTokens?: number;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Agent-advertised slash command. The runtime only surfaces enough to
|
|
89
|
+
* drive a picker UI ("does the agent advertise /compact?"). The full
|
|
90
|
+
* `AvailableCommandInput` schema from ACP is intentionally not plumbed
|
|
91
|
+
* through.
|
|
92
|
+
*/
|
|
93
|
+
type AcpRuntimeAvailableCommand = {
|
|
94
|
+
name: string;
|
|
95
|
+
description?: string; /** True/false when ACP advertised whether this command has an input schema. */
|
|
96
|
+
hasInput?: boolean;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Session-level usage roll-up surfaced through `getStatus()`. The
|
|
100
|
+
* reducer persists the breakdowns onto the session record; this type
|
|
101
|
+
* exposes them on the runtime contract.
|
|
102
|
+
*/
|
|
103
|
+
type AcpRuntimeSessionUsage = {
|
|
104
|
+
cumulative?: AcpRuntimeUsageBreakdown; /** Cumulative session cost when the agent reported it. */
|
|
105
|
+
cost?: AcpRuntimeUsageCost; /** Keyed by user-message id, matching the persisted reducer state. */
|
|
106
|
+
perRequest?: Record<string, AcpRuntimeUsageBreakdown>;
|
|
107
|
+
};
|
|
64
108
|
type AcpRuntimeStatus = {
|
|
65
109
|
summary?: string;
|
|
66
110
|
acpxRecordId?: string;
|
|
67
111
|
backendSessionId?: string;
|
|
68
112
|
agentSessionId?: string;
|
|
69
|
-
models?: AcpRuntimeSessionModels;
|
|
113
|
+
models?: AcpRuntimeSessionModels; /** Token usage and cost from the persisted session record. */
|
|
114
|
+
usage?: AcpRuntimeSessionUsage;
|
|
115
|
+
/**
|
|
116
|
+
* Commands the agent advertised via `available_commands_update`.
|
|
117
|
+
* Sourced from the persisted record — older session files only
|
|
118
|
+
* preserve `name`, so `description` and `hasInput` may be undefined
|
|
119
|
+
* even when a more recent live event would have carried both.
|
|
120
|
+
*/
|
|
121
|
+
availableCommands?: AcpRuntimeAvailableCommand[];
|
|
70
122
|
details?: Record<string, unknown>;
|
|
71
123
|
};
|
|
72
124
|
type AcpRuntimeDoctorReport = {
|
|
@@ -86,7 +138,21 @@ type AcpRuntimeEvent = {
|
|
|
86
138
|
text: string;
|
|
87
139
|
tag?: AcpSessionUpdateTag;
|
|
88
140
|
used?: number;
|
|
89
|
-
size?: number;
|
|
141
|
+
size?: number; /** Populated on `usage_update` events when the agent reported a cost. */
|
|
142
|
+
cost?: AcpRuntimeUsageCost;
|
|
143
|
+
/**
|
|
144
|
+
* Populated on `usage_update` events when the agent attached a
|
|
145
|
+
* per-turn breakdown via `_meta.usage` (Claude Code does this; not
|
|
146
|
+
* every adapter does).
|
|
147
|
+
*/
|
|
148
|
+
breakdown?: AcpRuntimeUsageBreakdown;
|
|
149
|
+
/**
|
|
150
|
+
* Populated on `available_commands_update` events. The list is a
|
|
151
|
+
* normalized view of the wire payload — names, descriptions, and
|
|
152
|
+
* a `hasInput` flag derived from whether the agent advertised a
|
|
153
|
+
* non-null `input` schema.
|
|
154
|
+
*/
|
|
155
|
+
availableCommands?: AcpRuntimeAvailableCommand[];
|
|
90
156
|
} | {
|
|
91
157
|
type: "tool_call";
|
|
92
158
|
text: string;
|
|
@@ -396,5 +462,5 @@ declare function createRuntimeStore(options: {
|
|
|
396
462
|
stateDir: string;
|
|
397
463
|
}): AcpSessionStore;
|
|
398
464
|
//#endregion
|
|
399
|
-
export { ACPX_BACKEND_ID, type AcpAgentRegistry, type AcpFileSessionStoreOptions, type AcpPermissionDecision, type AcpPermissionRequest, type AcpRuntime, type AcpRuntimeCapabilities, type AcpRuntimeDoctorReport, type AcpRuntimeEnsureInput, AcpRuntimeError, type AcpRuntimeErrorCode, type AcpRuntimeEvent, type AcpRuntimeHandle, type AcpRuntimeOptions, type AcpRuntimePromptMode, type AcpRuntimeSessionMode, type AcpRuntimeSessionModels, type AcpRuntimeStatus, type AcpRuntimeTurn, type AcpRuntimeTurnAttachment, type AcpRuntimeTurnInput, type AcpRuntimeTurnResult, type AcpRuntimeTurnResultError, type AcpSessionRecord, type AcpSessionStore, type AcpSessionUpdateTag, AcpxRuntime, DEFAULT_AGENT_NAME, type SessionAgentOptions, type SystemPromptOption, createAcpRuntime, createAgentRegistry, createFileSessionStore, createRuntimeStore, decodeAcpxRuntimeHandleState, encodeAcpxRuntimeHandleState, isAcpRuntimeError };
|
|
465
|
+
export { ACPX_BACKEND_ID, type AcpAgentRegistry, type AcpFileSessionStoreOptions, type AcpPermissionDecision, type AcpPermissionRequest, type AcpRuntime, type AcpRuntimeAvailableCommand, type AcpRuntimeCapabilities, type AcpRuntimeDoctorReport, type AcpRuntimeEnsureInput, AcpRuntimeError, type AcpRuntimeErrorCode, type AcpRuntimeEvent, type AcpRuntimeHandle, type AcpRuntimeOptions, type AcpRuntimePromptMode, type AcpRuntimeSessionMode, type AcpRuntimeSessionModels, type AcpRuntimeSessionUsage, type AcpRuntimeStatus, type AcpRuntimeTurn, type AcpRuntimeTurnAttachment, type AcpRuntimeTurnInput, type AcpRuntimeTurnResult, type AcpRuntimeTurnResultError, type AcpRuntimeUsageBreakdown, type AcpRuntimeUsageCost, type AcpSessionRecord, type AcpSessionStore, type AcpSessionUpdateTag, AcpxRuntime, DEFAULT_AGENT_NAME, type SessionAgentOptions, type SystemPromptOption, createAcpRuntime, createAgentRegistry, createFileSessionStore, createRuntimeStore, decodeAcpxRuntimeHandleState, encodeAcpxRuntimeHandleState, isAcpRuntimeError };
|
|
400
466
|
//# sourceMappingURL=runtime.d.ts.map
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","names":[],"sources":["../src/agent-registry.ts","../src/runtime/public/contract.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/handle-state.ts","../src/runtime.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","names":[],"sources":["../src/agent-registry.ts","../src/runtime/public/contract.ts","../src/runtime/engine/manager.ts","../src/runtime/public/file-session-store.ts","../src/runtime/public/errors.ts","../src/runtime/public/shared.ts","../src/runtime/public/handle-state.ts","../src/runtime.ts"],"mappings":";;;;;;cAmFa,kBAAA;;;KCpED,oBAAA;AAAA,KAEA,qBAAA;AAAA,KAEA,mBAAA;AAAA,KAaA,iBAAA;AAAA,KAEA,gBAAA;EACV,UAAA;EACA,OAAA;EACA,kBAAA;EACA,GAAA;EACA,YAAA;EACA,gBAAA;EACA,cAAA;AAAA;AAAA,KAGU,qBAAA;EACV,UAAA;EACA,KAAA;EACA,IAAA,EAAM,qBAAA;EACN,eAAA;EACA,GAAA;EA9BU;;;;AAAmB;AAa/B;;;EA0BE,cAAA,GAAiB,mBAAmB;AAAA;AAAA,KAG1B,wBAAA;EA3BgB;;;;EAgC1B,SAAA;EACA,IAAI;AAAA;AAAA,KAGM,mBAAA;EACV,MAAA,EAAQ,gBAAA;EACR,IAAA;EACA,WAAA,GAAc,wBAAA;EACd,IAAA,EAAM,oBAAA;EACN,SAAA;EACA,SAAA;EACA,MAAA,GAAS,WAAA;AAAA;AAAA,KAGC,sBAAA;EACV,QAAA,EAAU,iBAAiB;EAC3B,gBAAA;AAAA;AAAA,KAGU,uBAAA;EACV,cAAA;EACA,iBAAiB;AAAA;;AA7BmB;AAGtC;;;KAkCY,mBAAA;EACV,MAAA;EACA,QAAQ;AAAA;;;;;;;KASE,wBAAA;EACV,WAAA;EACA,YAAA;EACA,gBAAA;EACA,iBAAA;EACA,aAAA;EACA,WAAA;AAAA;;;;;;AAnCoB;KA4CV,0BAAA;EACV,IAAA;EACA,WAAA,WA1C2B;EA4C3B,QAAA;AAAA;;;AA3CgB;AAGlB;;KAgDY,sBAAA;EACV,UAAA,GAAa,wBAAA,EA/CI;EAiDjB,IAAA,GAAO,mBAAA,EAzCsB;EA2C7B,UAAA,GAAa,MAAA,SAAe,wBAAA;AAAA;AAAA,KAGlB,gBAAA;EACV,OAAA;EACA,YAAA;EACA,gBAAA;EACA,cAAA;EACA,MAAA,GAAS,uBAAA,EAtCT;EAwCA,KAAA,GAAQ,sBAAA;EAtCR;;;;AAEW;AASb;EAkCE,iBAAA,GAAoB,0BAAA;EACpB,OAAA,GAAU,MAAA;AAAA;AAAA,KAGA,sBAAA;EACV,EAAA;EACA,IAAA;EACA,OAAA;EACA,cAAA;EACA,OAAA;AAAA;AAAA,KAGU,eAAA;EAEN,IAAA;EACA,IAAA;EACA,MAAA;EACA,GAAA,GAAM,mBAAA;AAAA;EAGN,IAAA;EACA,IAAA;EACA,GAAA,GAAM,mBAAA;EACN,IAAA;EACA,IAAA,WAzCJ;EA2CI,IAAA,GAAO,mBAAA;EA3CiB;;AAAwB;AAGtD;;EA8CM,SAAA,GAAY,wBAAA;EAzCP;;;;;;EAgDL,iBAAA,GAAoB,0BAAA;AAAA;EAGpB,IAAA;EACA,IAAA;EACA,GAAA,GAAM,mBAAA;EACN,UAAA;EACA,MAAA;EACA,KAAA;EACA,IAAA,GAAO,QAAA;EACP,SAAA,GAAY,gBAAA;EACZ,QAAA;EACA,SAAA;EACA,OAAA,GAAU,eAAA;AAAA;AAhDhB;;;;AAAA;EAuDM,IAAA;EACA,UAAA;AAAA;;;AAnDG;AAGT;;EAuDM,IAAA;EACA,OAAA;EACA,IAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAGM,yBAAA;EACV,OAAA;EACA,IAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAGU,oBAAA;EAEN,MAAA;EACA,UAAA;AAAA;EAGA,MAAA;EACA,UAAA;AAAA;EAGA,MAAA;EACA,KAAA,EAAO,yBAAyB;AAAA;AAAA,UAGrB,cAAA;EAAA,SACN,SAAA;EAAA,SACA,MAAA,EAAQ,aAAA,CAAc,eAAA;EAAA,SACtB,MAAA,EAAQ,OAAA,CAAQ,oBAAA;EACzB,MAAA,CAAO,KAAA;IAAU,MAAA;EAAA,IAAoB,OAAA;EACrC,WAAA,CAAY,KAAA;IAAU,MAAA;EAAA,IAAoB,OAAA;AAAA;AAAA,UAG3B,UAAA;EACf,aAAA,CAAc,KAAA,EAAO,qBAAA,GAAwB,OAAA,CAAQ,gBAAA;EACrD,SAAA,CAAU,KAAA,EAAO,mBAAA,GAAsB,cAAA;EAzDnC;;;;;EA+DJ,OAAA,CAAQ,KAAA,EAAO,mBAAA,GAAsB,aAAA,CAAc,eAAA;EACnD,eAAA,EAAiB,KAAA;IACf,MAAA,GAAS,gBAAA;EAAA,IACP,OAAA,CAAQ,sBAAA,IAA0B,sBAAA;EACtC,SAAA,EAAW,KAAA;IAAS,MAAA,EAAQ,gBAAA;IAAkB,MAAA,GAAS,WAAA;EAAA,IAAgB,OAAA,CAAQ,gBAAA;EAC/E,OAAA,EAAS,KAAA;IAAS,MAAA,EAAQ,gBAAA;IAAkB,IAAA;EAAA,IAAiB,OAAA;EAC7D,eAAA,EAAiB,KAAA;IAAS,MAAA,EAAQ,gBAAA;IAAkB,GAAA;IAAa,KAAA;EAAA,IAAkB,OAAA;EACnF,MAAA,KAAW,OAAA,CAAQ,sBAAA;EACnB,MAAA,CAAO,KAAA;IAAS,MAAA,EAAQ,gBAAA;IAAkB,MAAA;EAAA,IAAoB,OAAA;EAC9D,KAAA,CAAM,KAAA;IACJ,MAAA,EAAQ,gBAAA;IACR,MAAA;IACA,sBAAA;EAAA,IACE,OAAA;AAAA;AAAA,KAGM,gBAAA,GAAmB,aAAa;AAAA,UAE3B,eAAA;EACf,IAAA,CAAK,SAAA,WAAoB,OAAA,CAAQ,gBAAA;EACjC,IAAA,CAAK,MAAA,EAAQ,gBAAA,GAAmB,OAAA;AAAA;AAAA,UAGjB,gBAAA;EACf,OAAA,CAAQ,SAAA;EACR,IAAA;AAAA;AAAA,KAGU,iBAAA;EACV,GAAA;EACA,YAAA,EAAc,eAAA;EACd,aAAA,EAAe,gBAAA;EACf,UAAA,GAAa,WAAA;EACb,cAAA,EAAgB,cAAA;EAChB,yBAAA,GAA4B,8BAAA;EAC5B,SAAA;EACA,UAAA;EACA,OAAA;EACA,mBAAA,IACE,GAAA,EAAK,oBAAA,EACL,GAAA;IAAO,MAAA,EAAQ,WAAA;EAAA,MACZ,OAAA,CAAQ,qBAAA;AAAA;AAAA,KAGH,0BAAA;EACV,QAAQ;AAAA;;;KClPE,qBAAA;EACV,aAAA,IAAiB,OAAA,EAAS,qBAAA,QAA6B,SAAA,SAAkB,SAAA;AAAA;AAAA,cAwe9D,iBAAA;EAAA,iBAMQ,OAAA;EAAA,iBACA,IAAA;EAAA,iBANF,iBAAA;EAAA,iBACA,wBAAA;EAAA,iBACA,oBAAA;cAGE,OAAA,EAAS,iBAAA,EACT,IAAA,GAAM,qBAAA;EAAA,QAGjB,YAAA;EAAA,QAIM,2BAAA;EAAA,QAmBA,4BAAA;EAAA,QASA,kBAAA;EAAA,QAgBA,+BAAA;EAAA,QAiBA,yBAAA;EAwCR,aAAA,CAAc,KAAA;IAClB,UAAA;IACA,KAAA;IACA,IAAA;IACA,GAAA;IACA,eAAA;IACA,cAAA,GAAiB,mBAAA;EAAA,IACf,OAAA,CAAQ,aAAA;EAAA,QAsDE,0BAAA;EAAA,QAmDA,oBAAA;EAcd,SAAA,CAAU,KAAA;IACR,MAAA,EAAQ,gBAAA;IACR,IAAA;IACA,WAAA,GAAc,wBAAA;IACd,IAAA,EAAM,oBAAA;IACN,WAAA;IACA,SAAA;IACA,SAAA;IACA,MAAA,GAAS,WAAA;EAAA,IACP,cAAA;EAAA,QAsFU,kBAAA;EAAA,QA8BA,kBAAA;EAAA,QAiCN,gBAAA;EAAA,QAYA,2BAAA;EAAA,QAgBA,0BAAA;EAAA,QAsCM,4BAAA;EAAA,QAUA,wBAAA;EAAA,QAcA,qCAAA;EAAA,QA0BN,6BAAA;EAAA,QAUA,+BAAA;EAAA,QAwBA,oBAAA;EAAA,QAQM,kBAAA;EAAA,QAWA,wBAAA;EAAA,QAoBN,4BAAA;EAAA,QAOM,uBAAA;EAAA,QAgBN,yBAAA;EAAA,QAcA,6BAAA;EAAA,QAYM,6BAAA;EAAA,QAcA,wBAAA;EAAA,QAcN,eAAA;EAAA,QAcM,mBAAA;EAAA,QAkBA,yBAAA;EAiBP,OAAA,CAAQ,KAAA;IACb,MAAA,EAAQ,gBAAA;IACR,IAAA;IACA,WAAA,GAAc,wBAAA;IACd,IAAA,EAAM,oBAAA;IACN,WAAA;IACA,SAAA;IACA,SAAA;IACA,MAAA,GAAS,WAAA;EAAA,IACP,aAAA,CAAc,eAAA;EAMZ,SAAA,CAAU,MAAA,EAAQ,gBAAA,GAAmB,OAAA,CAAQ,gBAAA;EAqB7C,OAAA,CACJ,MAAA,EAAQ,gBAAA,EACR,IAAA,UACA,WAAA,8BACC,OAAA;EAoBG,eAAA,CACJ,MAAA,EAAQ,gBAAA,EACR,GAAA,UACA,KAAA,UACA,WAAA,8BACC,OAAA;EAwBG,MAAA,CAAO,MAAA,EAAQ,gBAAA,GAAmB,OAAA;EAKlC,KAAA,CACJ,MAAA,EAAQ,gBAAA,EACR,OAAA;IAAW,sBAAA;EAAA,IACV,OAAA;EAAA,QAoBW,mBAAA;EAAA,QA2CA,aAAA;AAAA;;;iBC71CA,sBAAA,CAAuB,OAAA,EAAS,0BAAA,GAA6B,eAAe;;;cC3D/E,eAAA;AAAA,KAUD,mBAAA,WAA8B,eAAe;AAAA,cAE5C,eAAA,SAAwB,KAAA;EAAA,SAC1B,IAAA,EAAM,mBAAA;EAAA,SACG,KAAA;cAEN,IAAA,EAAM,mBAAA,EAAqB,OAAA,UAAiB,OAAA;IAAY,KAAA;EAAA;AAAA;AAAA,iBAQtD,iBAAA,CAAkB,KAAA,YAAiB,KAAA,IAAS,eAAe;;;KCxB/D,eAAA;EACV,IAAA;EACA,KAAA;EACA,GAAA;EACA,IAAA;EACA,YAAA;EACA,gBAAA;EACA,cAAA;AAAA;;;iBCDc,4BAAA,CAA6B,KAAsB,EAAf,eAAe;AAAA,iBAKnD,4BAAA,CAA6B,kBAAA,WAA6B,eAAe;;;cCiD5E,eAAA;AAAA,KAMR,eAAA,GAAkB,UAAA;EACrB,iBAAA,IAAqB,OAAA;EACrB,SAAA;EACA,MAAA,IAAU,OAAA,CAAQ,sBAAA;AAAA;AAAA,iBAGJ,mBAAA,CAAoB,MAAA;EAClC,SAAA,GAAY,MAAA;AAAA,IACV,gBAAgB;AAAA,cAWP,WAAA,YAAuB,eAAA;EAAA,iBAMf,OAAA;EAAA,iBACA,WAAA;EAAA,QANX,OAAA;EAAA,QACA,OAAA;EAAA,QACA,cAAA;cAGW,OAAA,EAAS,iBAAA,EACT,WAAA;IACf,cAAA,IAAkB,OAAA,EAAS,iBAAA,KAAsB,iBAAA;IACjD,WAAA,IAAe,OAAA,EAAS,iBAAA,KAAsB,OAAA;MAC5C,EAAA;MACA,OAAA;MACA,OAAA;IAAA;EAAA;EAKN,SAAA;EAIM,iBAAA,IAAqB,OAAA;EAKrB,MAAA,IAAU,OAAA,CAAQ,sBAAA;EAWlB,aAAA,CAAc,KAAA,EAAO,qBAAA,GAAwB,OAAA,CAAQ,gBAAA;EAyC3D,SAAA,CAAU,KAAA,EAAO,mBAAA;;;;;;;MA0BQ,MAAA;IAAA,IAAiB,OAAA;;MAGZ,MAAA;IAAA,IAAiB,OAAA;EAAA;EAMxC,OAAA,CAAQ,KAAA,EAAO,mBAAA,GAAsB,aAAA,CAAc,eAAA;EAepD,eAAA,CAAgB,KAAA;IAAU,MAAA,GAAS,gBAAA;EAAA,IAAqB,OAAA,CAAQ,sBAAA;EAyBhE,SAAA,CAAU,KAAA;IACd,MAAA,EAAQ,gBAAA;IACR,MAAA,GAAS,WAAA;EAAA,IACP,OAAA,CAAQ,gBAAA;EAMN,OAAA,CAAQ,KAAA;IAAS,MAAA,EAAQ,gBAAA;IAAkB,IAAA;EAAA,IAAiB,OAAA;EAM5D,eAAA,CAAgB,KAAA;IACpB,MAAA,EAAQ,gBAAA;IACR,GAAA;IACA,KAAA;EAAA,IACE,OAAA;EAME,MAAA,CAAO,KAAA;IAAS,MAAA,EAAQ,gBAAA;IAAkB,MAAA;EAAA,IAAoB,OAAA;EAM9D,KAAA,CAAM,KAAA;IACV,MAAA,EAAQ,gBAAA;IACR,MAAA;IACA,sBAAA;EAAA,IACE,OAAA;EAAA,QAQU,UAAA;EAAA,QAeA,QAAA;EAAA,QAIN,oBAAA;EAAA,QAcA,kBAAA;AAAA;AAAA,iBA+BM,gBAAA,CAAiB,OAAA,EAAS,iBAAA,GAAoB,WAAW;AAAA,iBAIzD,kBAAA,CAAmB,OAAA;EAAW,QAAA;AAAA,IAAqB,eAAe"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Ct as withTimeout, D as applyLifecycleSnapshotToRecord, Dt as resolveAgentCommand, E as applyConversation, K as assertPersistedKeyPolicy, Mt as extractAcpError, Nt as isAcpResourceNotFoundError, O as reconcileAgentSessionId, S as advertisedModelState, Tt as listBuiltInAgents, _ as createSessionConversation, a as applyRequestedModelIfAdvertised, at as defaultSessionEventLog, b as recordSessionUpdate, c as setCurrentModelId, d as setDesiredModelId, f as syncAdvertisedModelState, g as cloneSessionConversation, h as cloneSessionAcpxState, i as connectAndLoadSession, j as modelStateFromConfigOptions, jt as normalizeOutputError, k as AcpClient, l as setDesiredConfigOption, m as applyConfigOptionsToState, n as runPromptTurn, nt as serializeSessionRecordForDisk, o as currentModelIdFromSetModelResponse, p as applyConfigOptionsToRecord, r as withConnectedSession, s as clearDesiredConfigOption, t as LiveSessionCheckpoint, tt as parseSessionRecord, u as setDesiredModeId, v as recordClientOperation, w as persistSessionOptions, wt as DEFAULT_AGENT_NAME, x as trimConversationForRuntime, y as recordPromptSubmission, yt as textPrompt } from "./live-checkpoint-BZrk9Mjz.js";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
@@ -325,7 +325,7 @@ const PROMPT_EVENT_PARSERS = {
|
|
|
325
325
|
tag: "agent_thought_chunk"
|
|
326
326
|
}),
|
|
327
327
|
usage_update: usageUpdateEvent,
|
|
328
|
-
available_commands_update:
|
|
328
|
+
available_commands_update: availableCommandsUpdateEvent,
|
|
329
329
|
current_mode_update: (payload) => statusUpdateEvent("current_mode_update", payload),
|
|
330
330
|
config_option_update: (payload) => statusUpdateEvent("config_option_update", payload),
|
|
331
331
|
session_info_update: (payload) => statusUpdateEvent("session_info_update", payload),
|
|
@@ -341,14 +341,88 @@ function promptEventParser(type) {
|
|
|
341
341
|
function usageUpdateEvent(payload) {
|
|
342
342
|
const used = asOptionalFiniteNumber(payload.used);
|
|
343
343
|
const size = asOptionalFiniteNumber(payload.size);
|
|
344
|
+
const meta = isRecord(payload._meta) ? payload._meta : void 0;
|
|
345
|
+
return buildUsageUpdateEvent({
|
|
346
|
+
used,
|
|
347
|
+
size,
|
|
348
|
+
cost: normalizeUsageCost(payload.cost),
|
|
349
|
+
breakdown: normalizeUsageBreakdown(meta?.usage)
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
function buildUsageUpdateEvent(parts) {
|
|
353
|
+
const { used, size, cost, breakdown } = parts;
|
|
344
354
|
return {
|
|
345
355
|
type: "status",
|
|
346
356
|
text: used != null && size != null ? `usage updated: ${used}/${size}` : "usage updated",
|
|
347
357
|
tag: "usage_update",
|
|
348
358
|
...used != null ? { used } : {},
|
|
349
|
-
...size != null ? { size } : {}
|
|
359
|
+
...size != null ? { size } : {},
|
|
360
|
+
...cost ? { cost } : {},
|
|
361
|
+
...breakdown ? { breakdown } : {}
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
function availableCommandsUpdateEvent(payload) {
|
|
365
|
+
const raw = Array.isArray(payload.availableCommands) ? payload.availableCommands : [];
|
|
366
|
+
const availableCommands = [];
|
|
367
|
+
for (const entry of raw) {
|
|
368
|
+
if (!isRecord(entry)) continue;
|
|
369
|
+
const name = asTrimmedString(entry.name);
|
|
370
|
+
if (!name) continue;
|
|
371
|
+
const description = asTrimmedString(entry.description);
|
|
372
|
+
availableCommands.push({
|
|
373
|
+
name,
|
|
374
|
+
...description ? { description } : {},
|
|
375
|
+
hasInput: entry.input != null
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
type: "status",
|
|
380
|
+
text: availableCommands.length > 0 ? `available commands updated (${availableCommands.length})` : "available commands updated",
|
|
381
|
+
tag: "available_commands_update",
|
|
382
|
+
availableCommands
|
|
350
383
|
};
|
|
351
384
|
}
|
|
385
|
+
function normalizeUsageCost(value) {
|
|
386
|
+
if (!isRecord(value)) return;
|
|
387
|
+
const amount = asOptionalFiniteNumber(value.amount);
|
|
388
|
+
const currency = asTrimmedString(value.currency);
|
|
389
|
+
if (amount == null && !currency) return;
|
|
390
|
+
return {
|
|
391
|
+
...amount != null ? { amount } : {},
|
|
392
|
+
...currency ? { currency } : {}
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
const USAGE_BREAKDOWN_FIELDS = [
|
|
396
|
+
["inputTokens", ["inputTokens", "input_tokens"]],
|
|
397
|
+
["outputTokens", ["outputTokens", "output_tokens"]],
|
|
398
|
+
["cachedReadTokens", [
|
|
399
|
+
"cachedReadTokens",
|
|
400
|
+
"cacheReadInputTokens",
|
|
401
|
+
"cache_read_input_tokens"
|
|
402
|
+
]],
|
|
403
|
+
["cachedWriteTokens", [
|
|
404
|
+
"cachedWriteTokens",
|
|
405
|
+
"cacheCreationInputTokens",
|
|
406
|
+
"cache_creation_input_tokens"
|
|
407
|
+
]],
|
|
408
|
+
["thoughtTokens", ["thoughtTokens", "thought_tokens"]],
|
|
409
|
+
["totalTokens", ["totalTokens", "total_tokens"]]
|
|
410
|
+
];
|
|
411
|
+
function normalizeUsageBreakdown(value) {
|
|
412
|
+
if (!isRecord(value)) return;
|
|
413
|
+
const breakdown = {};
|
|
414
|
+
for (const [key, aliases] of USAGE_BREAKDOWN_FIELDS) {
|
|
415
|
+
const v = firstFiniteNumber(value, aliases);
|
|
416
|
+
if (v != null) breakdown[key] = v;
|
|
417
|
+
}
|
|
418
|
+
return Object.keys(breakdown).length > 0 ? breakdown : void 0;
|
|
419
|
+
}
|
|
420
|
+
function firstFiniteNumber(record, keys) {
|
|
421
|
+
for (const key of keys) {
|
|
422
|
+
const value = asOptionalFiniteNumber(record[key]);
|
|
423
|
+
if (value != null) return value;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
352
426
|
function statusUpdateEvent(tag, payload) {
|
|
353
427
|
const text = resolveStatusTextForTag({
|
|
354
428
|
tag,
|
|
@@ -540,6 +614,62 @@ function buildModelsField(record) {
|
|
|
540
614
|
availableModelIds: [...available]
|
|
541
615
|
} };
|
|
542
616
|
}
|
|
617
|
+
function tokenUsageToBreakdown(usage) {
|
|
618
|
+
if (!usage) return;
|
|
619
|
+
const breakdown = {};
|
|
620
|
+
assignUsageBreakdownField(breakdown, "inputTokens", usage.input_tokens);
|
|
621
|
+
assignUsageBreakdownField(breakdown, "outputTokens", usage.output_tokens);
|
|
622
|
+
assignUsageBreakdownField(breakdown, "cachedReadTokens", usage.cache_read_input_tokens);
|
|
623
|
+
assignUsageBreakdownField(breakdown, "cachedWriteTokens", usage.cache_creation_input_tokens);
|
|
624
|
+
assignUsageBreakdownField(breakdown, "thoughtTokens", usage.thought_tokens);
|
|
625
|
+
assignUsageBreakdownField(breakdown, "totalTokens", usage.total_tokens);
|
|
626
|
+
return Object.keys(breakdown).length > 0 ? breakdown : void 0;
|
|
627
|
+
}
|
|
628
|
+
function assignUsageBreakdownField(breakdown, key, value) {
|
|
629
|
+
if (value !== void 0) breakdown[key] = value;
|
|
630
|
+
}
|
|
631
|
+
function buildUsageField(record) {
|
|
632
|
+
const cumulative = tokenUsageToBreakdown(record.cumulative_token_usage);
|
|
633
|
+
const perRequestEntries = Object.entries(record.request_token_usage ?? {}).map(([id, value]) => [id, tokenUsageToBreakdown(value)]).filter((entry) => entry[1] !== void 0);
|
|
634
|
+
const perRequest = perRequestEntries.length > 0 ? Object.fromEntries(perRequestEntries) : void 0;
|
|
635
|
+
const cost = record.cumulative_cost;
|
|
636
|
+
const usage = {
|
|
637
|
+
...cumulative ? { cumulative } : {},
|
|
638
|
+
...cost ? { cost } : {},
|
|
639
|
+
...perRequest ? { perRequest } : {}
|
|
640
|
+
};
|
|
641
|
+
return Object.keys(usage).length > 0 ? { usage } : {};
|
|
642
|
+
}
|
|
643
|
+
function buildAvailableCommandsField(record) {
|
|
644
|
+
const commands = record.acpx?.available_commands;
|
|
645
|
+
if (!commands || commands.length === 0) return {};
|
|
646
|
+
const availableCommands = commands.map((command) => runtimeAvailableCommand(command)).filter((command) => command !== void 0);
|
|
647
|
+
return availableCommands.length > 0 ? { availableCommands } : {};
|
|
648
|
+
}
|
|
649
|
+
function runtimeAvailableCommand(command) {
|
|
650
|
+
if (typeof command === "string") {
|
|
651
|
+
const name = command.trim();
|
|
652
|
+
return name ? { name } : void 0;
|
|
653
|
+
}
|
|
654
|
+
const record = commandRecord(command);
|
|
655
|
+
if (!record) return;
|
|
656
|
+
const name = trimmedField(record.name);
|
|
657
|
+
if (!name) return;
|
|
658
|
+
const runtimeCommand = { name };
|
|
659
|
+
const description = trimmedField(record.description);
|
|
660
|
+
if (description) runtimeCommand.description = description;
|
|
661
|
+
if (typeof record.has_input === "boolean") runtimeCommand.hasInput = record.has_input;
|
|
662
|
+
return runtimeCommand;
|
|
663
|
+
}
|
|
664
|
+
function commandRecord(value) {
|
|
665
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return;
|
|
666
|
+
return value;
|
|
667
|
+
}
|
|
668
|
+
function trimmedField(value) {
|
|
669
|
+
if (typeof value !== "string") return;
|
|
670
|
+
const trimmed = value.trim();
|
|
671
|
+
return trimmed ? trimmed : void 0;
|
|
672
|
+
}
|
|
543
673
|
function advertisedConfigOptionIds(record) {
|
|
544
674
|
const configOptions = record.acpx?.config_options;
|
|
545
675
|
if (!configOptions) return;
|
|
@@ -554,6 +684,30 @@ function resolveSupportedConfigOptionId(record, configId) {
|
|
|
554
684
|
const supportedText = supported.length > 0 ? supported.join(", ") : "none";
|
|
555
685
|
throw new AcpRuntimeError("ACP_BACKEND_UNSUPPORTED_CONTROL", `ACP session ${record.acpxRecordId} does not advertise config option '${configId}'. Supported config options: ${supportedText}.`);
|
|
556
686
|
}
|
|
687
|
+
function applyConfigOptionResponseToTurn(turn, response) {
|
|
688
|
+
if (!response?.configOptions) return;
|
|
689
|
+
turn.acpxState = applyConfigOptionsToState(turn.acpxState, response.configOptions);
|
|
690
|
+
}
|
|
691
|
+
function applyDesiredConfigOptionToTurn(turn, configId, value) {
|
|
692
|
+
const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};
|
|
693
|
+
if (configId === modelStateFromConfigOptions(nextState.config_options)?.configId) {
|
|
694
|
+
nextState.session_options = {
|
|
695
|
+
...nextState.session_options,
|
|
696
|
+
model: value
|
|
697
|
+
};
|
|
698
|
+
clearDesiredConfigOption(nextState, configId);
|
|
699
|
+
} else if (configId === "mode") nextState.desired_mode_id = value;
|
|
700
|
+
else nextState.desired_config_options = {
|
|
701
|
+
...nextState.desired_config_options,
|
|
702
|
+
[configId]: value
|
|
703
|
+
};
|
|
704
|
+
turn.acpxState = nextState;
|
|
705
|
+
}
|
|
706
|
+
function applyDesiredConfigOptionToRecord(record, configId, value) {
|
|
707
|
+
if (configId === modelStateFromConfigOptions(record.acpx?.config_options)?.configId) setDesiredModelId(record, value, configId);
|
|
708
|
+
else if (configId === "mode") setDesiredModeId(record, value);
|
|
709
|
+
else setDesiredConfigOption(record, configId, value);
|
|
710
|
+
}
|
|
557
711
|
async function createOrLoadRuntimeSession(client, resumeSessionId, cwd) {
|
|
558
712
|
if (resumeSessionId) {
|
|
559
713
|
if (client.supportsResumeSession()) {
|
|
@@ -722,7 +876,7 @@ var AcpRuntimeManager = class {
|
|
|
722
876
|
record.protocolVersion = client.initializeResult?.protocolVersion;
|
|
723
877
|
record.agentCapabilities = client.initializeResult?.agentCapabilities;
|
|
724
878
|
applyConfigOptionsToRecord(record, session.sessionResult);
|
|
725
|
-
const
|
|
879
|
+
const modelApplication = await applyRequestedModelIfAdvertised({
|
|
726
880
|
client,
|
|
727
881
|
sessionId: session.sessionId,
|
|
728
882
|
requestedModel: input.sessionOptions?.model,
|
|
@@ -730,8 +884,9 @@ var AcpRuntimeManager = class {
|
|
|
730
884
|
agentCommand,
|
|
731
885
|
timeoutMs: this.options.timeoutMs
|
|
732
886
|
});
|
|
733
|
-
|
|
734
|
-
|
|
887
|
+
applyConfigOptionsToRecord(record, modelApplication.response);
|
|
888
|
+
syncAdvertisedModelState(record, modelApplication.response ? modelStateFromConfigOptions(modelApplication.response.configOptions) : session.sessionResult.models);
|
|
889
|
+
if (modelApplication.applied) setCurrentModelId(record, currentModelIdFromSetModelResponse(modelApplication.response, input.sessionOptions?.model));
|
|
735
890
|
applyLifecycleSnapshotToRecord(record, client.getAgentLifecycleSnapshot());
|
|
736
891
|
persistSessionOptions(record, input.sessionOptions);
|
|
737
892
|
await this.options.sessionStore.save(record);
|
|
@@ -904,7 +1059,18 @@ var AcpRuntimeManager = class {
|
|
|
904
1059
|
},
|
|
905
1060
|
setSessionModel: async (modelId) => {
|
|
906
1061
|
await this.waitForRuntimeControlSession(task, turn);
|
|
907
|
-
|
|
1062
|
+
const models = advertisedModelState(turn.acpxState);
|
|
1063
|
+
const response = await turn.client.setSessionModel(turn.activeSessionId, modelId, models);
|
|
1064
|
+
applyConfigOptionResponseToTurn(turn, response);
|
|
1065
|
+
const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};
|
|
1066
|
+
nextState.session_options = {
|
|
1067
|
+
...nextState.session_options,
|
|
1068
|
+
model: modelId
|
|
1069
|
+
};
|
|
1070
|
+
nextState.current_model_id = currentModelIdFromSetModelResponse(response, modelId);
|
|
1071
|
+
clearDesiredConfigOption(nextState, models?.configId);
|
|
1072
|
+
turn.acpxState = nextState;
|
|
1073
|
+
return response;
|
|
908
1074
|
},
|
|
909
1075
|
setSessionConfigOption: async (configId, value) => {
|
|
910
1076
|
return (await task.state.activeController.setResolvedSessionConfigOption(configId, value)).response;
|
|
@@ -936,25 +1102,8 @@ var AcpRuntimeManager = class {
|
|
|
936
1102
|
};
|
|
937
1103
|
}
|
|
938
1104
|
applyRuntimeConfigOptionState(turn, configId, value, response) {
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
nextState.config_options = structuredClone(response.configOptions);
|
|
942
|
-
turn.acpxState = nextState;
|
|
943
|
-
}
|
|
944
|
-
if (configId === "mode") {
|
|
945
|
-
const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};
|
|
946
|
-
nextState.desired_mode_id = value;
|
|
947
|
-
turn.acpxState = nextState;
|
|
948
|
-
return;
|
|
949
|
-
}
|
|
950
|
-
if (configId !== "model") {
|
|
951
|
-
const nextState = cloneSessionAcpxState(turn.acpxState) ?? {};
|
|
952
|
-
nextState.desired_config_options = {
|
|
953
|
-
...nextState.desired_config_options,
|
|
954
|
-
[configId]: value
|
|
955
|
-
};
|
|
956
|
-
turn.acpxState = nextState;
|
|
957
|
-
}
|
|
1105
|
+
applyConfigOptionResponseToTurn(turn, response);
|
|
1106
|
+
applyDesiredConfigOptionToTurn(turn, configId, value);
|
|
958
1107
|
}
|
|
959
1108
|
installRuntimeTurnEventHandlers(task, turn) {
|
|
960
1109
|
turn.client.setEventHandlers({
|
|
@@ -1106,6 +1255,8 @@ var AcpRuntimeManager = class {
|
|
|
1106
1255
|
backendSessionId: record.acpSessionId,
|
|
1107
1256
|
agentSessionId: record.agentSessionId,
|
|
1108
1257
|
...buildModelsField(record),
|
|
1258
|
+
...buildUsageField(record),
|
|
1259
|
+
...buildAvailableCommandsField(record),
|
|
1109
1260
|
details: {
|
|
1110
1261
|
cwd: record.cwd,
|
|
1111
1262
|
lastUsedAt: record.lastUsedAt,
|
|
@@ -1131,16 +1282,14 @@ var AcpRuntimeManager = class {
|
|
|
1131
1282
|
if (controller) {
|
|
1132
1283
|
const { configId, response } = await controller.setResolvedSessionConfigOption(key, value);
|
|
1133
1284
|
applyConfigOptionsToRecord(record, response);
|
|
1134
|
-
|
|
1135
|
-
else setDesiredConfigOption(record, configId, value);
|
|
1285
|
+
applyDesiredConfigOptionToRecord(record, configId, value);
|
|
1136
1286
|
await this.options.sessionStore.save(record);
|
|
1137
1287
|
return;
|
|
1138
1288
|
}
|
|
1139
1289
|
const result = await this.withRuntimeControlSession(record, sessionMode, async ({ client, sessionId, record: connectedRecord }) => {
|
|
1140
1290
|
const configId = resolveSupportedConfigOptionId(connectedRecord, key);
|
|
1141
1291
|
applyConfigOptionsToRecord(connectedRecord, await client.setSessionConfigOption(sessionId, configId, value));
|
|
1142
|
-
|
|
1143
|
-
else setDesiredConfigOption(connectedRecord, configId, value);
|
|
1292
|
+
applyDesiredConfigOptionToRecord(connectedRecord, configId, value);
|
|
1144
1293
|
});
|
|
1145
1294
|
await this.options.sessionStore.save(result.record);
|
|
1146
1295
|
}
|
|
@@ -1212,13 +1361,20 @@ var FileSessionStore = class {
|
|
|
1212
1361
|
}
|
|
1213
1362
|
async load(sessionId) {
|
|
1214
1363
|
await this.ensureDir();
|
|
1364
|
+
let payload;
|
|
1215
1365
|
try {
|
|
1216
|
-
|
|
1217
|
-
return parseSessionRecord(JSON.parse(payload)) ?? void 0;
|
|
1366
|
+
payload = await fs.readFile(this.filePath(sessionId), "utf8");
|
|
1218
1367
|
} catch (error) {
|
|
1219
1368
|
if (error.code === "ENOENT") return;
|
|
1220
1369
|
throw error;
|
|
1221
1370
|
}
|
|
1371
|
+
let parsed;
|
|
1372
|
+
try {
|
|
1373
|
+
parsed = JSON.parse(payload);
|
|
1374
|
+
} catch {
|
|
1375
|
+
return;
|
|
1376
|
+
}
|
|
1377
|
+
return parseSessionRecord(parsed) ?? void 0;
|
|
1222
1378
|
}
|
|
1223
1379
|
async save(record) {
|
|
1224
1380
|
await this.ensureDir();
|