@letrquan/book 0.2.0 → 0.4.0-beta.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/CHANGELOG.md +3771 -40
- package/README.md +135 -1311
- package/dist/additional-roots-VAWRQ625.js +32 -0
- package/dist/{app-MOXXWEOY.js → app-J7BVPSUH.js} +9648 -5509
- package/dist/app-J7BVPSUH.js.map +1 -0
- package/dist/chunk-2AAOF5B5.js +28 -0
- package/dist/chunk-2AAOF5B5.js.map +1 -0
- package/dist/chunk-32WBCUAN.js +660 -0
- package/dist/chunk-32WBCUAN.js.map +1 -0
- package/dist/chunk-4DKHLZRI.js +120 -0
- package/dist/chunk-4DKHLZRI.js.map +1 -0
- package/dist/{chunk-CAGOB2N4.js → chunk-62EEAUID.js} +6 -4
- package/dist/chunk-62EEAUID.js.map +1 -0
- package/dist/chunk-AHC7OU75.js +1124 -0
- package/dist/chunk-AHC7OU75.js.map +1 -0
- package/dist/{chunk-E75IPST5.js → chunk-AJZWLKLQ.js} +73 -70
- package/dist/chunk-AJZWLKLQ.js.map +1 -0
- package/dist/chunk-B5FC3MYZ.js +395 -0
- package/dist/chunk-B5FC3MYZ.js.map +1 -0
- package/dist/{chunk-KWHQ2XXL.js → chunk-DNFQTSMJ.js} +55 -13
- package/dist/chunk-DNFQTSMJ.js.map +1 -0
- package/dist/{chunk-J7MIZ5CA.js → chunk-E5WLQSKA.js} +719 -89
- package/dist/chunk-E5WLQSKA.js.map +1 -0
- package/dist/chunk-ECLC4CIJ.js +1181 -0
- package/dist/chunk-ECLC4CIJ.js.map +1 -0
- package/dist/chunk-EEX6QNXV.js +127 -0
- package/dist/chunk-EEX6QNXV.js.map +1 -0
- package/dist/chunk-EFXVSQ5J.js +931 -0
- package/dist/chunk-EFXVSQ5J.js.map +1 -0
- package/dist/{chunk-V4BOYR52.js → chunk-ENLB7NYV.js} +1304 -326
- package/dist/chunk-ENLB7NYV.js.map +1 -0
- package/dist/chunk-FPR7SKIE.js +6926 -0
- package/dist/chunk-FPR7SKIE.js.map +1 -0
- package/dist/{chunk-DGMQEI6Y.js → chunk-HFB74CLM.js} +30 -9
- package/dist/chunk-HFB74CLM.js.map +1 -0
- package/dist/{chunk-5RDRAO4B.js → chunk-HOZXKOE3.js} +37 -1
- package/dist/chunk-HOZXKOE3.js.map +1 -0
- package/dist/chunk-IDYWN37T.js +36 -0
- package/dist/chunk-IDYWN37T.js.map +1 -0
- package/dist/chunk-J4F2QLM2.js +273 -0
- package/dist/chunk-J4F2QLM2.js.map +1 -0
- package/dist/chunk-JGF5HLSI.js +1065 -0
- package/dist/chunk-JGF5HLSI.js.map +1 -0
- package/dist/{chunk-XIFFTATU.js → chunk-KDNWMKXV.js} +7166 -4237
- package/dist/chunk-KDNWMKXV.js.map +1 -0
- package/dist/chunk-KXAYUIKP.js +90 -0
- package/dist/chunk-KXAYUIKP.js.map +1 -0
- package/dist/{chunk-3U5IBM24.js → chunk-MEOB2DZA.js} +12 -2
- package/dist/chunk-MEOB2DZA.js.map +1 -0
- package/dist/{chunk-WKBO5R4O.js → chunk-MV5PQNIA.js} +2 -2
- package/dist/chunk-MV5PQNIA.js.map +1 -0
- package/dist/chunk-N2G4Q7ME.js +2672 -0
- package/dist/chunk-N2G4Q7ME.js.map +1 -0
- package/dist/chunk-OJBMDM5H.js +299 -0
- package/dist/chunk-OJBMDM5H.js.map +1 -0
- package/dist/{chunk-URLQAXTR.js → chunk-PTDC7ZUP.js} +2 -2
- package/dist/chunk-PTDC7ZUP.js.map +1 -0
- package/dist/{chunk-574C6MQR.js → chunk-REASC2QG.js} +173 -64
- package/dist/chunk-REASC2QG.js.map +1 -0
- package/dist/{chunk-7N4J557C.js → chunk-RT5SATF7.js} +1 -1
- package/dist/chunk-RT5SATF7.js.map +1 -0
- package/dist/chunk-SBTU5BEC.js +114 -0
- package/dist/chunk-SBTU5BEC.js.map +1 -0
- package/dist/{chunk-5KLVH3PY.js → chunk-SWPDKLNM.js} +5 -3
- package/dist/chunk-SWPDKLNM.js.map +1 -0
- package/dist/chunk-UCFJ43OS.js +520 -0
- package/dist/chunk-UCFJ43OS.js.map +1 -0
- package/dist/{chunk-VZQXX3WW.js → chunk-W7SLYS3M.js} +80 -16
- package/dist/chunk-W7SLYS3M.js.map +1 -0
- package/dist/{chunk-ANSJPYGI.js → chunk-WV3O5PGX.js} +3 -3
- package/dist/chunk-WV3O5PGX.js.map +1 -0
- package/dist/chunk-XHAO3K7I.js +18 -0
- package/dist/chunk-XHAO3K7I.js.map +1 -0
- package/dist/chunk-XJRJVXJR.js +1050 -0
- package/dist/chunk-XJRJVXJR.js.map +1 -0
- package/dist/chunk-YIL6HTJX.js +663 -0
- package/dist/chunk-YIL6HTJX.js.map +1 -0
- package/dist/{chunk-24AXE6SP.js → chunk-ZPSZZUWF.js} +1 -1
- package/dist/chunk-ZPSZZUWF.js.map +1 -0
- package/dist/{command-approvals-6Y57VCWZ.js → command-approvals-ZRY66LCW.js} +7 -5
- package/dist/context-C3RAP6K5.js +41 -0
- package/dist/{hook-approvals-CTUFKEJT.js → hook-approvals-DPQD5H65.js} +6 -5
- package/dist/index.js +947 -203
- package/dist/index.js.map +1 -1
- package/dist/{interactive-assets-CCAAWVKH.js → interactive-assets-73AQO5WP.js} +18 -9
- package/dist/interactive-assets-73AQO5WP.js.map +1 -0
- package/dist/job-runner.js +166 -111
- package/dist/job-runner.js.map +1 -1
- package/dist/job-supervisor.d.ts +2 -0
- package/dist/job-supervisor.js +121 -0
- package/dist/job-supervisor.js.map +1 -0
- package/dist/loader-DQNPDKOX.js +27 -0
- package/dist/{mcp-approvals-WNPH65BK.js → mcp-approvals-27LJYADQ.js} +6 -5
- package/dist/{mcp-config-YIJIES2C.js → mcp-config-GXSODNCM.js} +4 -3
- package/dist/memory-store-I6Z54VUN.js +51 -0
- package/dist/{model-window-store-YFVNXCIP.js → model-window-store-6VKXXTPJ.js} +9 -4
- package/dist/openai-compatible-IPUNBJ53.js +16 -0
- package/dist/permission-approvals-Q5IMFEZI.js +15 -0
- package/dist/permissions-7Y35X6HZ.js +62 -0
- package/dist/provider-approvals-5AGH3RVT.js +76 -0
- package/dist/sandbox-N2RY72GN.js +42 -0
- package/dist/{scrollback-LUKLIBVI.js → scrollback-GD76GNM4.js} +44 -26
- package/dist/scrollback-GD76GNM4.js.map +1 -0
- package/dist/sdk.d.ts +2739 -2069
- package/dist/sdk.js +77 -42
- package/dist/sdk.js.map +1 -1
- package/dist/settings-loader-KDBH45AQ.js +43 -0
- package/dist/settings-loader-KDBH45AQ.js.map +1 -0
- package/dist/{settings-removed-JWWPT4WA.js → settings-removed-3ATWJEF3.js} +2 -2
- package/dist/settings-removed-3ATWJEF3.js.map +1 -0
- package/dist/shell-selection-Z5WORZU4.js +31 -0
- package/dist/shell-selection-Z5WORZU4.js.map +1 -0
- package/package.json +25 -24
- package/dist/app-MOXXWEOY.js.map +0 -1
- package/dist/chunk-24AXE6SP.js.map +0 -1
- package/dist/chunk-3U5IBM24.js.map +0 -1
- package/dist/chunk-574C6MQR.js.map +0 -1
- package/dist/chunk-5GDZ22YP.js +0 -449
- package/dist/chunk-5GDZ22YP.js.map +0 -1
- package/dist/chunk-5KLVH3PY.js.map +0 -1
- package/dist/chunk-5RDRAO4B.js.map +0 -1
- package/dist/chunk-7N4J557C.js.map +0 -1
- package/dist/chunk-A7JLBK2Y.js +0 -3506
- package/dist/chunk-A7JLBK2Y.js.map +0 -1
- package/dist/chunk-ANSJPYGI.js.map +0 -1
- package/dist/chunk-BTZZUCLI.js +0 -264
- package/dist/chunk-BTZZUCLI.js.map +0 -1
- package/dist/chunk-C7D4NJ2D.js +0 -217
- package/dist/chunk-C7D4NJ2D.js.map +0 -1
- package/dist/chunk-CAGOB2N4.js.map +0 -1
- package/dist/chunk-DGMQEI6Y.js.map +0 -1
- package/dist/chunk-E75IPST5.js.map +0 -1
- package/dist/chunk-EYGD6X2T.js +0 -180
- package/dist/chunk-EYGD6X2T.js.map +0 -1
- package/dist/chunk-GTVB4HEM.js +0 -765
- package/dist/chunk-GTVB4HEM.js.map +0 -1
- package/dist/chunk-J7MIZ5CA.js.map +0 -1
- package/dist/chunk-KWHQ2XXL.js.map +0 -1
- package/dist/chunk-L6LK2QIQ.js +0 -657
- package/dist/chunk-L6LK2QIQ.js.map +0 -1
- package/dist/chunk-MAQXCUR4.js +0 -1007
- package/dist/chunk-MAQXCUR4.js.map +0 -1
- package/dist/chunk-S4XL7HOM.js +0 -402
- package/dist/chunk-S4XL7HOM.js.map +0 -1
- package/dist/chunk-URLQAXTR.js.map +0 -1
- package/dist/chunk-V4BOYR52.js.map +0 -1
- package/dist/chunk-VZQXX3WW.js.map +0 -1
- package/dist/chunk-WKBO5R4O.js.map +0 -1
- package/dist/chunk-XIFFTATU.js.map +0 -1
- package/dist/context-ZC5IFEAX.js +0 -25
- package/dist/interactive-assets-CCAAWVKH.js.map +0 -1
- package/dist/loader-4IDS2RIE.js +0 -15
- package/dist/openai-compatible-RHZUBHV6.js +0 -10
- package/dist/permission-approvals-76PVREFD.js +0 -14
- package/dist/permissions-CHCKTFQQ.js +0 -28
- package/dist/sandbox-CNVAQDA7.js +0 -23
- package/dist/scrollback-LUKLIBVI.js.map +0 -1
- package/dist/settings-loader-M2QP5TX2.js +0 -21
- package/dist/shell-selection-V6QAYXPX.js +0 -17
- package/patches/ink+6.8.0.patch +0 -13
- package/scripts/apply-ink-patch.mjs +0 -29
- package/scripts/ink-patch.mjs +0 -59
- package/scripts/verify-ink-patch.mjs +0 -11
- /package/dist/{command-approvals-6Y57VCWZ.js.map → additional-roots-VAWRQ625.js.map} +0 -0
- /package/dist/{context-ZC5IFEAX.js.map → command-approvals-ZRY66LCW.js.map} +0 -0
- /package/dist/{hook-approvals-CTUFKEJT.js.map → context-C3RAP6K5.js.map} +0 -0
- /package/dist/{loader-4IDS2RIE.js.map → hook-approvals-DPQD5H65.js.map} +0 -0
- /package/dist/{mcp-approvals-WNPH65BK.js.map → loader-DQNPDKOX.js.map} +0 -0
- /package/dist/{mcp-config-YIJIES2C.js.map → mcp-approvals-27LJYADQ.js.map} +0 -0
- /package/dist/{model-window-store-YFVNXCIP.js.map → mcp-config-GXSODNCM.js.map} +0 -0
- /package/dist/{openai-compatible-RHZUBHV6.js.map → memory-store-I6Z54VUN.js.map} +0 -0
- /package/dist/{permission-approvals-76PVREFD.js.map → model-window-store-6VKXXTPJ.js.map} +0 -0
- /package/dist/{permissions-CHCKTFQQ.js.map → openai-compatible-IPUNBJ53.js.map} +0 -0
- /package/dist/{sandbox-CNVAQDA7.js.map → permission-approvals-Q5IMFEZI.js.map} +0 -0
- /package/dist/{settings-loader-M2QP5TX2.js.map → permissions-7Y35X6HZ.js.map} +0 -0
- /package/dist/{settings-removed-JWWPT4WA.js.map → provider-approvals-5AGH3RVT.js.map} +0 -0
- /package/dist/{shell-selection-V6QAYXPX.js.map → sandbox-N2RY72GN.js.map} +0 -0
package/dist/sdk.js
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
|
+
cleanupRunStatus,
|
|
3
|
+
collectSkippedProjectFileNotices,
|
|
2
4
|
collectWithheldProjectNotices,
|
|
3
5
|
connectMcpServers,
|
|
4
6
|
disconnectMcpServers,
|
|
5
7
|
runHeadless
|
|
6
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-E5WLQSKA.js";
|
|
9
|
+
import {
|
|
10
|
+
mcpServersToRecord,
|
|
11
|
+
partitionMcpServersByApproval
|
|
12
|
+
} from "./chunk-PTDC7ZUP.js";
|
|
7
13
|
import {
|
|
8
14
|
SessionStore,
|
|
9
15
|
createAgentSessionSnapshot,
|
|
16
|
+
discardUntouchedSession,
|
|
10
17
|
reduceAgentSessionSnapshot,
|
|
11
|
-
resolveSessionBootstrap
|
|
12
|
-
|
|
18
|
+
resolveSessionBootstrap,
|
|
19
|
+
resolveSessionDriver
|
|
20
|
+
} from "./chunk-ENLB7NYV.js";
|
|
13
21
|
import {
|
|
14
22
|
AgentManager,
|
|
15
23
|
SessionRuntime,
|
|
@@ -17,14 +25,18 @@ import {
|
|
|
17
25
|
SkillRegistryError,
|
|
18
26
|
createDefaultRegistry,
|
|
19
27
|
createRegistry,
|
|
20
|
-
createToolSurface
|
|
21
|
-
|
|
22
|
-
loadConfig
|
|
23
|
-
} from "./chunk-XIFFTATU.js";
|
|
28
|
+
createToolSurface
|
|
29
|
+
} from "./chunk-KDNWMKXV.js";
|
|
24
30
|
import {
|
|
25
31
|
buildSkillReport,
|
|
26
32
|
resolvePermissionMode
|
|
27
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-FPR7SKIE.js";
|
|
34
|
+
import {
|
|
35
|
+
freezeAgentConfig,
|
|
36
|
+
loadConfig
|
|
37
|
+
} from "./chunk-N2G4Q7ME.js";
|
|
38
|
+
import "./chunk-XJRJVXJR.js";
|
|
39
|
+
import "./chunk-AHC7OU75.js";
|
|
28
40
|
import {
|
|
29
41
|
applySkillOverrides,
|
|
30
42
|
buildSkillListing,
|
|
@@ -33,40 +45,44 @@ import {
|
|
|
33
45
|
generateSkillListing,
|
|
34
46
|
loadSkillBody,
|
|
35
47
|
skillRoots
|
|
36
|
-
} from "./chunk-
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-
|
|
39
|
-
import "./chunk-
|
|
48
|
+
} from "./chunk-DNFQTSMJ.js";
|
|
49
|
+
import "./chunk-UCFJ43OS.js";
|
|
50
|
+
import "./chunk-HOZXKOE3.js";
|
|
51
|
+
import "./chunk-EFXVSQ5J.js";
|
|
52
|
+
import "./chunk-62EEAUID.js";
|
|
53
|
+
import "./chunk-AJZWLKLQ.js";
|
|
54
|
+
import "./chunk-KXAYUIKP.js";
|
|
55
|
+
import "./chunk-SWPDKLNM.js";
|
|
56
|
+
import "./chunk-2AAOF5B5.js";
|
|
40
57
|
import {
|
|
41
58
|
resolveMcpServerList
|
|
42
|
-
} from "./chunk-
|
|
43
|
-
import
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
import "./chunk-
|
|
48
|
-
import
|
|
49
|
-
|
|
50
|
-
toolSuccess
|
|
51
|
-
} from "./chunk-5GDZ22YP.js";
|
|
52
|
-
import "./chunk-EYGD6X2T.js";
|
|
59
|
+
} from "./chunk-MEOB2DZA.js";
|
|
60
|
+
import "./chunk-W7SLYS3M.js";
|
|
61
|
+
import "./chunk-JGF5HLSI.js";
|
|
62
|
+
import "./chunk-32WBCUAN.js";
|
|
63
|
+
import "./chunk-RT5SATF7.js";
|
|
64
|
+
import "./chunk-XHAO3K7I.js";
|
|
65
|
+
import "./chunk-SBTU5BEC.js";
|
|
66
|
+
import "./chunk-4DKHLZRI.js";
|
|
53
67
|
import {
|
|
54
68
|
DEFAULT_LOCAL_DATA_RETENTION_DAYS,
|
|
55
69
|
cleanupDebugLogs,
|
|
56
70
|
getDebugLogPath
|
|
57
|
-
} from "./chunk-
|
|
58
|
-
import
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
import "./chunk-
|
|
63
|
-
import "./chunk-
|
|
64
|
-
import "./chunk-
|
|
65
|
-
import "./chunk-
|
|
66
|
-
import "./chunk-
|
|
71
|
+
} from "./chunk-OJBMDM5H.js";
|
|
72
|
+
import {
|
|
73
|
+
toolFailure,
|
|
74
|
+
toolSuccess
|
|
75
|
+
} from "./chunk-YIL6HTJX.js";
|
|
76
|
+
import "./chunk-EEX6QNXV.js";
|
|
77
|
+
import "./chunk-MV5PQNIA.js";
|
|
78
|
+
import "./chunk-B5FC3MYZ.js";
|
|
79
|
+
import "./chunk-WV3O5PGX.js";
|
|
80
|
+
import "./chunk-HFB74CLM.js";
|
|
81
|
+
import "./chunk-REASC2QG.js";
|
|
82
|
+
import "./chunk-IDYWN37T.js";
|
|
67
83
|
import {
|
|
68
84
|
resolveBookHome
|
|
69
|
-
} from "./chunk-
|
|
85
|
+
} from "./chunk-ZPSZZUWF.js";
|
|
70
86
|
|
|
71
87
|
// src/sdk.ts
|
|
72
88
|
import { join } from "path";
|
|
@@ -514,6 +530,7 @@ async function* query(prompt, options = {}) {
|
|
|
514
530
|
});
|
|
515
531
|
const config = freezeAgentConfig({
|
|
516
532
|
...loadedConfig,
|
|
533
|
+
sessionDriver: resolveSessionDriver({ explicit: options.sessionDriver, env: process.env }).driver,
|
|
517
534
|
...options.model ? { model: options.model } : {},
|
|
518
535
|
...options.maxTurns ? { maxTurns: options.maxTurns } : {},
|
|
519
536
|
...options.agents ? {
|
|
@@ -531,23 +548,31 @@ async function* query(prompt, options = {}) {
|
|
|
531
548
|
const sessionStore = persistSession ? options.sessionStore ?? new SessionStore(join(resolveBookHome(), "sessions")) : void 0;
|
|
532
549
|
const bootstrap = resolveSessionBootstrap(sessionStore, {
|
|
533
550
|
cwd: config.workspace,
|
|
534
|
-
sessionId: options.sessionId
|
|
551
|
+
sessionId: options.sessionId,
|
|
552
|
+
driver: config.sessionDriver
|
|
535
553
|
});
|
|
536
554
|
if (persistSession && !options.sessionStore && sessionStore) {
|
|
537
555
|
cleanupDebugLogs(DEFAULT_LOCAL_DATA_RETENTION_DAYS, getDebugLogPath());
|
|
538
556
|
sessionStore.cleanup(DEFAULT_LOCAL_DATA_RETENTION_DAYS, /* @__PURE__ */ new Set([bootstrap.sessionId]));
|
|
539
557
|
}
|
|
558
|
+
cleanupRunStatus(DEFAULT_LOCAL_DATA_RETENTION_DAYS);
|
|
540
559
|
const queue = new AsyncEventQueue();
|
|
541
560
|
let connections = [];
|
|
542
561
|
queue.push({ type: "system", model: config.model, cwd: config.workspace });
|
|
543
562
|
queue.push({ type: "session", sessionId: bootstrap.sessionId });
|
|
544
563
|
const running = (async () => {
|
|
545
564
|
try {
|
|
546
|
-
for (const notice of
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
565
|
+
for (const notice of [
|
|
566
|
+
...collectWithheldProjectNotices({
|
|
567
|
+
workspace: config.workspace,
|
|
568
|
+
settings: config.settings,
|
|
569
|
+
settingsEnabled: !options.noSettings,
|
|
570
|
+
providerGate: config.workspaceProviderGate
|
|
571
|
+
}),
|
|
572
|
+
// Instruction files, REVIEW.md and command files that link out of the repository are not
|
|
573
|
+
// loaded (#539, #543).
|
|
574
|
+
...collectSkippedProjectFileNotices(config.workspace)
|
|
575
|
+
]) {
|
|
551
576
|
console.warn(notice);
|
|
552
577
|
}
|
|
553
578
|
const declaredMcpServers = resolveMcpServerList(config.workspace);
|
|
@@ -569,9 +594,14 @@ async function* query(prompt, options = {}) {
|
|
|
569
594
|
prompt,
|
|
570
595
|
inputFormat: "text",
|
|
571
596
|
outputFormat: "text",
|
|
597
|
+
// Progress lines are for a person watching `book -p` in a terminal. An
|
|
598
|
+
// SDK host owns its stderr and receives every tool call as an event.
|
|
599
|
+
quiet: true,
|
|
572
600
|
history: bootstrap.history,
|
|
573
601
|
transcript: bootstrap.transcript,
|
|
574
602
|
compactBoundaries: bootstrap.compactBoundaries,
|
|
603
|
+
// A resumed session's unmet `/goal` keeps being checked, and `/goal clear` can see it.
|
|
604
|
+
goal: bootstrap.goal,
|
|
575
605
|
mode: resolvePermissionMode(config.settings, options.permissionMode),
|
|
576
606
|
maxTurns: options.maxTurns,
|
|
577
607
|
persistSession,
|
|
@@ -598,7 +628,8 @@ async function* query(prompt, options = {}) {
|
|
|
598
628
|
runs: result.runs,
|
|
599
629
|
// `stdout` above is a discard sink, so this is the only way an SDK
|
|
600
630
|
// caller sees a slash command the host performed on its behalf.
|
|
601
|
-
commandResults: result.commandResults
|
|
631
|
+
commandResults: result.commandResults,
|
|
632
|
+
answer: result.answer
|
|
602
633
|
});
|
|
603
634
|
} catch (error) {
|
|
604
635
|
if (!controller.signal.aborted) {
|
|
@@ -622,7 +653,11 @@ async function* query(prompt, options = {}) {
|
|
|
622
653
|
} finally {
|
|
623
654
|
controller.abort(new Error("SDK event consumer stopped"));
|
|
624
655
|
options.signal?.removeEventListener("abort", abortFromCaller);
|
|
625
|
-
|
|
656
|
+
try {
|
|
657
|
+
await running;
|
|
658
|
+
} finally {
|
|
659
|
+
discardUntouchedSession(sessionStore, bootstrap);
|
|
660
|
+
}
|
|
626
661
|
}
|
|
627
662
|
}
|
|
628
663
|
function createAgentManager(config) {
|
package/dist/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk.ts","../src/skill-evaluation.ts","../src/agents/evaluation.ts"],"sourcesContent":["/** Book Agent SDK — programmatic API for embedding Book as a library. */\r\n\r\nimport { join } from 'path';\r\nimport type { ElicitationHandler, UserQuestionHandler } from './types/tools.js';\r\nimport type { AgentConfig } from './types/runtime.js';\r\nimport type { SessionStoreInterface } from './types/sessions.js';\r\nimport { freezeAgentConfig, loadConfig, type LoadConfigOptions } from './config.js';\r\nimport { runHeadless } from './headless.js';\r\nimport { createDefaultRegistry } from './tools/registry.js';\r\nimport { connectMcpServers, disconnectMcpServers } from './mcp.js';\r\nimport { mcpServersToRecord, partitionMcpServersByApproval } from './mcp-approvals.js';\r\nimport { resolveMcpServerList } from './mcp-config.js';\r\nimport { collectWithheldProjectNotices } from './project-approval-notices.js';\r\nimport { AgentManager } from './agents/manager.js';\r\nimport { SessionStore } from './session/store.js';\r\nimport { resolveSessionBootstrap } from './session/resolve.js';\r\nimport type { AgentEvent } from './session/agent-events.js';\r\nimport {\r\n cleanupDebugLogs,\r\n DEFAULT_LOCAL_DATA_RETENTION_DAYS,\r\n getDebugLogPath,\r\n} from './debug-log.js';\r\nimport { resolvePermissionMode } from './permission-mode.js';\r\nimport { resolveBookHome } from './book-home.js';\r\n\r\nexport type QueryEvent = AgentEvent;\r\n\r\nexport interface QueryOptions {\r\n workspace?: string;\r\n model?: string;\r\n permissionMode?: string;\r\n maxTurns?: number;\r\n settingsPath?: string;\r\n noSettings?: boolean;\r\n persistSession?: boolean;\r\n sessionId?: string;\r\n sessionStore?: SessionStoreInterface;\r\n signal?: AbortSignal;\r\n onUserQuestionRequired?: UserQuestionHandler;\r\n /**\r\n * Answer MCP form elicitations. Supplying it declares the elicitation\r\n * capability to connected servers; without it they fail such requests\r\n * themselves rather than blocking on a prompt no one can see.\r\n */\r\n onElicit?: ElicitationHandler;\r\n agents?: 'adaptive' | 'manual' | 'off';\r\n /** Forward high-volume managed-agent text deltas. Defaults to false. */\r\n forwardSubagentText?: boolean;\r\n}\r\n\r\nclass AsyncEventQueue<T> {\r\n private values: T[] = [];\r\n private waiters: Array<(value: T | undefined) => void> = [];\r\n private closed = false;\r\n\r\n push(value: T): void {\r\n if (this.closed) return;\r\n const waiter = this.waiters.shift();\r\n if (waiter) waiter(value);\r\n else this.values.push(value);\r\n }\r\n\r\n close(): void {\r\n if (this.closed) return;\r\n this.closed = true;\r\n for (const waiter of this.waiters.splice(0)) waiter(undefined);\r\n }\r\n\r\n next(): Promise<T | undefined> {\r\n const value = this.values.shift();\r\n if (value !== undefined) return Promise.resolve(value);\r\n if (this.closed) return Promise.resolve(undefined);\r\n return new Promise((resolve) => this.waiters.push(resolve));\r\n }\r\n}\r\n\r\nexport async function* query(\r\n prompt: string,\r\n options: QueryOptions = {},\r\n): AsyncGenerator<QueryEvent, void, undefined> {\r\n const workspace = options.workspace || process.cwd();\r\n const loadedConfig = loadConfig(workspace, {\r\n settingsOverridePath: options.settingsPath,\r\n noSettings: options.noSettings,\r\n runMigrations: !options.noSettings,\r\n });\r\n const config = freezeAgentConfig({\r\n ...loadedConfig,\r\n ...(options.model ? { model: options.model } : {}),\r\n ...(options.maxTurns ? { maxTurns: options.maxTurns } : {}),\r\n ...(options.agents\r\n ? {\r\n settings: {\r\n ...loadedConfig.settings,\r\n agents: { ...loadedConfig.settings.agents, mode: options.agents },\r\n },\r\n }\r\n : {}),\r\n });\r\n\r\n const controller = new AbortController();\r\n const abortFromCaller = () => controller.abort(options.signal?.reason);\r\n if (options.signal?.aborted) abortFromCaller();\r\n else options.signal?.addEventListener('abort', abortFromCaller, { once: true });\r\n\r\n const persistSession = options.persistSession !== false;\r\n const sessionStore = persistSession\r\n ? (options.sessionStore ?? new SessionStore(join(resolveBookHome(), 'sessions')))\r\n : undefined;\r\n const bootstrap = resolveSessionBootstrap(sessionStore, {\r\n cwd: config.workspace,\r\n sessionId: options.sessionId,\r\n });\r\n if (persistSession && !options.sessionStore && sessionStore) {\r\n cleanupDebugLogs(DEFAULT_LOCAL_DATA_RETENTION_DAYS, getDebugLogPath());\r\n sessionStore.cleanup(DEFAULT_LOCAL_DATA_RETENTION_DAYS, new Set([bootstrap.sessionId]));\r\n }\r\n const queue = new AsyncEventQueue<QueryEvent>();\r\n let connections: Awaited<ReturnType<typeof connectMcpServers>>['connections'] = [];\r\n\r\n queue.push({ type: 'system', model: config.model, cwd: config.workspace });\r\n queue.push({ type: 'session', sessionId: bootstrap.sessionId });\r\n\r\n const running = (async () => {\r\n try {\r\n // Project-declared MCP servers require a prior interactive approval;\r\n // SDK runs cannot prompt, so unapproved servers are skipped with a warning.\r\n // Repository-declared allow rules and hooks are withheld until the user\r\n // decides on them; an SDK run cannot ask, so it reports and continues.\r\n for (const notice of collectWithheldProjectNotices({\r\n workspace: config.workspace,\r\n settings: config.settings,\r\n settingsEnabled: !options.noSettings,\r\n })) {\r\n console.warn(notice);\r\n }\r\n const declaredMcpServers = resolveMcpServerList(config.workspace);\r\n const mcpPartition = partitionMcpServersByApproval(declaredMcpServers, config.settings);\r\n for (const server of mcpPartition.pending) {\r\n console.warn(\r\n `⚠ Skipping MCP server \"${server.name}\" (${server.path}): project-declared servers require one-time approval. Approve it in an interactive session first.`,\r\n );\r\n }\r\n const mcp = await connectMcpServers(config.workspace, {\r\n signal: controller.signal,\r\n servers: mcpServersToRecord(mcpPartition.allowed),\r\n onElicit: options.onElicit,\r\n });\r\n connections = mcp.connections;\r\n const registry = createDefaultRegistry({ agents: config.settings.agents.mode !== 'off' });\r\n if (mcp.tools.length > 0) registry.registerAll(mcp.tools);\r\n\r\n const result = await runHeadless(config, registry, {\r\n prompt,\r\n inputFormat: 'text',\r\n outputFormat: 'text',\r\n history: bootstrap.history,\r\n transcript: bootstrap.transcript,\r\n compactBoundaries: bootstrap.compactBoundaries,\r\n mode: resolvePermissionMode(config.settings, options.permissionMode),\r\n maxTurns: options.maxTurns,\r\n persistSession,\r\n sessionStore,\r\n sessionId: bootstrap.sessionId,\r\n sessionCreated: bootstrap.created,\r\n runSource: 'sdk',\r\n signal: controller.signal,\r\n onUserQuestionRequired: options.onUserQuestionRequired,\r\n forwardSubagentText: options.forwardSubagentText,\r\n stdout: { write: () => true },\r\n onAgentEvent: (event) => {\r\n if (\r\n event.type !== 'system' &&\r\n event.type !== 'session' &&\r\n event.type !== 'result' &&\r\n event.type !== 'done' &&\r\n (event.type !== 'agent_text_delta' || options.forwardSubagentText === true)\r\n ) {\r\n queue.push(event);\r\n }\r\n },\r\n });\r\n queue.push({\r\n type: 'result',\r\n messages: result.messages,\r\n usage: result.usage,\r\n sessionId: bootstrap.sessionId,\r\n outcome: result.outcome,\r\n runs: result.runs,\r\n // `stdout` above is a discard sink, so this is the only way an SDK\r\n // caller sees a slash command the host performed on its behalf.\r\n commandResults: result.commandResults,\r\n });\r\n } catch (error) {\r\n if (!controller.signal.aborted) {\r\n queue.push({\r\n type: 'error',\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n } finally {\r\n await disconnectMcpServers(connections);\r\n queue.push({ type: 'done' });\r\n queue.close();\r\n }\r\n })();\r\n\r\n try {\r\n while (true) {\r\n const event = await queue.next();\r\n if (!event) break;\r\n yield event;\r\n }\r\n } finally {\r\n controller.abort(new Error('SDK event consumer stopped'));\r\n options.signal?.removeEventListener('abort', abortFromCaller);\r\n await running;\r\n }\r\n}\r\n\r\nexport { loadConfig, type LoadConfigOptions };\r\nexport type { ToolDiscoverySettings } from './settings.js';\r\nexport { AgentManager };\r\nexport { createDefaultRegistry, createRegistry } from './tools/registry.js';\r\nexport { createToolSurface } from './tools/catalog.js';\r\nexport { toolFailure, toolSuccess } from './tools/result.js';\r\nexport {\r\n applySkillOverrides,\r\n buildSkillListing,\r\n discoverSkills,\r\n explicitSkillMentions,\r\n generateSkillListing,\r\n loadSkillBody,\r\n skillRoots,\r\n} from './skills.js';\r\nexport type {\r\n DiscoverSkillsOptions,\r\n LoadedSkillBody,\r\n ShadowedSkill,\r\n Skill,\r\n SkillIssue,\r\n SkillListingResult,\r\n SkillResource,\r\n SkillRoot,\r\n SkillRootKind,\r\n SkillSource,\r\n} from './skills.js';\r\nexport {\r\n SkillRegistry,\r\n SkillRegistryError,\r\n type SkillActivationFrame,\r\n type SkillActivationFrameSummary,\r\n type SkillActivationReason,\r\n type SkillLifecycleEvent,\r\n type SkillLifecycleEventType,\r\n type SkillRegistrySnapshot,\r\n} from './skill-registry.js';\r\nexport {\r\n DEFAULT_SKILL_EVALUATION_THRESHOLDS,\r\n DEFAULT_SKILL_EVALUATION_FIXTURES,\r\n SKILL_EVALUATION_CATEGORIES,\r\n evaluateSkillActivation,\r\n observeSkillEvaluation,\r\n renderSkillEvaluationReport,\r\n runSkillActivationEvaluation,\r\n writeSkillEvaluationReport,\r\n} from './skill-evaluation.js';\r\nexport type {\r\n SkillEvaluationCategory,\r\n SkillEvaluationFixture,\r\n SkillEvaluationObservation,\r\n SkillEvaluationOutcome,\r\n SkillEvaluationPromptFixture,\r\n SkillEvaluationReport,\r\n SkillEvaluationThresholds,\r\n} from './skill-evaluation.js';\r\nexport { SessionRuntime } from './session/runtime.js';\r\nexport { buildSkillReport } from './skill-report.js';\r\nexport function createAgentManager(config: AgentConfig): AgentManager {\r\n return new AgentManager(config, createDefaultRegistry({ agents: true }).getDefinitions());\r\n}\r\nexport { runPairedEvaluation, evaluateSuccess } from './agents/evaluation.js';\r\nexport { createAgentSessionSnapshot, reduceAgentSessionSnapshot } from './session/agent-events.js';\r\nexport type {\r\n AgentEvent,\r\n AgentSessionSnapshot,\r\n AgentSessionStatus,\r\n} from './session/agent-events.js';\r\nexport type {\r\n EvaluationFixture,\r\n EvaluationMetric,\r\n EvaluationRunResult,\r\n} from './agents/evaluation.js';\r\nexport type {\r\n AgentPlanRecord,\r\n AgentApplyResult,\r\n AgentRecord,\r\n AgentSummary,\r\n AgentCompletion,\r\n AgentCompletionNotification,\r\n AgentProfile,\r\n AgentActivity,\r\n AgentRuntimeEvent,\r\n AgentRunMetrics,\r\n AgentSnapshot,\r\n AgentSpawnRequest,\r\n EvidenceItem,\r\n} from './agents/types.js';\r\nexport type {\r\n AgentTerminalOutcome,\r\n AgentTerminalReason,\r\n AgentTerminalStatus,\r\n} from './types/terminal.js';\r\nexport type {\r\n AgentModelIdentity,\r\n AgentModelIdentityStatus,\r\n AgentRunAmbientSnapshot,\r\n AgentRunAccounting,\r\n AgentRunContext,\r\n AgentRunResult,\r\n AgentRunSource,\r\n} from './types/runs.js';\r\nexport type {\r\n JsonSchemaObject,\r\n ToolCatalogMetadata,\r\n ToolCategory,\r\n ToolDefinition,\r\n ToolDiscoveryContext,\r\n ToolEffect,\r\n ToolPolicy,\r\n ToolResult,\r\n ToolResultArtifacts,\r\n ToolResultError,\r\n ToolResultPresentation,\r\n ToolResultStatus,\r\n ToolSearchMatch,\r\n UserQuestion,\r\n UserQuestionOption,\r\n UserQuestionRequest,\r\n UserQuestionResponse,\r\n UserQuestionSource,\r\n UserQuestionHandler,\r\n ElicitationField,\r\n ElicitationRequest,\r\n ElicitationResponse,\r\n ElicitationValue,\r\n ElicitationHandler,\r\n} from './types/tools.js';\r\n","import { createHash } from 'node:crypto';\r\nimport { mkdirSync, writeFileSync } from 'node:fs';\r\nimport { dirname } from 'node:path';\r\nimport type { SkillLifecycleEvent } from './skill-registry.js';\r\n\r\nexport const SKILL_EVALUATION_CATEGORIES = [\r\n 'direct',\r\n 'indirect',\r\n 'negative',\r\n 'ambiguous',\r\n 'conflicting',\r\n 'disabled',\r\n 'invalid',\r\n 'missing-body',\r\n 'missing-resource',\r\n] as const;\r\n\r\nexport type SkillEvaluationCategory = (typeof SKILL_EVALUATION_CATEGORIES)[number];\r\n\r\nexport interface SkillEvaluationFixture {\r\n id: string;\r\n category: SkillEvaluationCategory;\r\n promptHash: string;\r\n expectedSkills: string[];\r\n expectedBlockedCodes?: string[];\r\n}\r\n\r\nexport interface SkillEvaluationPromptFixture {\r\n id: string;\r\n category: SkillEvaluationCategory;\r\n prompt: string;\r\n expectedSkills: string[];\r\n expectedBlockedCodes?: string[];\r\n}\r\n\r\nexport interface SkillEvaluationOutcome {\r\n promptChars?: number;\r\n promptTokens?: number;\r\n bodyTokens?: number;\r\n taskCompleted?: boolean;\r\n userCorrections?: number;\r\n skillToolFailures?: number;\r\n exposure?: 'eager' | 'deferred';\r\n activationTurns?: number;\r\n}\r\n\r\nexport interface SkillEvaluationObservation extends SkillEvaluationFixture {\r\n activatedSkills: string[];\r\n blockedCodes: string[];\r\n promptChars: number;\r\n promptTokens: number;\r\n bodyBytes: number;\r\n bodyTokens: number;\r\n falseActivationBytes: number;\r\n activationLatencyMs: number[];\r\n consentRequests: number;\r\n unnecessaryPermissionPrompts: number;\r\n taskCompleted?: boolean;\r\n userCorrections: number;\r\n skillToolFailures: number;\r\n blockingMismatch: boolean;\r\n exposure?: 'eager' | 'deferred';\r\n activationTurns?: number;\r\n}\r\n\r\nexport interface SkillEvaluationThresholds {\r\n minimumPrecision: number;\r\n minimumRecall: number;\r\n maximumFalseActivations: number;\r\n maximumUnnecessaryPermissionPrompts: number;\r\n maximumSkillToolFailures: number;\r\n}\r\n\r\nexport interface SkillEvaluationExecution {\r\n evidenceKind: 'offline-observation';\r\n providerRunEligibility: 'not-applicable';\r\n controls: {\r\n evaluationDate: string;\r\n randomSeed: string;\r\n runtimeRevision: string;\r\n fixtureRevision: string;\r\n fixtureRevisionStatus: 'captured' | 'incomplete';\r\n };\r\n}\r\n\r\nexport interface SkillEvaluationReport {\r\n generatedAt: string;\r\n fixtureCount: number;\r\n categoryCounts: Record<SkillEvaluationCategory, number>;\r\n truePositives: number;\r\n falsePositives: number;\r\n falseNegatives: number;\r\n precision: number;\r\n recall: number;\r\n falseActivationBytes: number;\r\n promptChars: { total: number; median: number };\r\n promptTokens: { total: number; median: number };\r\n bodyBytes: { total: number; median: number };\r\n bodyTokens: { total: number; median: number };\r\n activationLatencyMs: { median: number; p95: number };\r\n consentRequests: number;\r\n unnecessaryPermissionPrompts: number;\r\n taskCompletionRate?: number;\r\n userCorrections: number;\r\n skillToolFailures: number;\r\n blockingMismatches: number;\r\n exposure: Record<\r\n 'eager' | 'deferred',\r\n { samples: number; activationRate: number; medianActivationTurns: number }\r\n >;\r\n thresholds: SkillEvaluationThresholds;\r\n rolloutReady: boolean;\r\n reasons: string[];\r\n observations: SkillEvaluationObservation[];\r\n evaluation?: SkillEvaluationExecution;\r\n}\r\n\r\nexport const DEFAULT_SKILL_EVALUATION_THRESHOLDS: SkillEvaluationThresholds = {\r\n minimumPrecision: 0.95,\r\n minimumRecall: 0.8,\r\n maximumFalseActivations: 0,\r\n maximumUnnecessaryPermissionPrompts: 0,\r\n maximumSkillToolFailures: 0,\r\n};\r\n\r\nexport const DEFAULT_SKILL_EVALUATION_FIXTURES: readonly SkillEvaluationPromptFixture[] = [\r\n {\r\n id: 'direct-review',\r\n category: 'direct',\r\n prompt: '$review inspect the current change',\r\n expectedSkills: ['review'],\r\n },\r\n {\r\n id: 'indirect-review',\r\n category: 'indirect',\r\n prompt: 'Inspect this diff for correctness regressions and missing tests',\r\n expectedSkills: ['review'],\r\n },\r\n {\r\n id: 'negative-general-question',\r\n category: 'negative',\r\n prompt: 'Explain what this function returns',\r\n expectedSkills: [],\r\n },\r\n {\r\n id: 'ambiguous-review-word',\r\n category: 'ambiguous',\r\n prompt: 'Review the available deployment choices with me',\r\n expectedSkills: [],\r\n },\r\n {\r\n id: 'conflicting-tool-ceilings',\r\n category: 'conflicting',\r\n prompt: '$read-review $write-review inspect the change',\r\n expectedSkills: ['read-review'],\r\n expectedBlockedCodes: ['skill_tool_intersection_empty'],\r\n },\r\n {\r\n id: 'disabled-skill',\r\n category: 'disabled',\r\n prompt: '$disabled-skill run the workflow',\r\n expectedSkills: [],\r\n expectedBlockedCodes: ['skill_disabled'],\r\n },\r\n {\r\n id: 'invalid-skill',\r\n category: 'invalid',\r\n prompt: '$invalid-skill run the workflow',\r\n expectedSkills: [],\r\n expectedBlockedCodes: ['skill_invalid'],\r\n },\r\n {\r\n id: 'missing-body',\r\n category: 'missing-body',\r\n prompt: '$missing-body run the workflow',\r\n expectedSkills: [],\r\n expectedBlockedCodes: ['skill_load_failed'],\r\n },\r\n {\r\n id: 'missing-resource',\r\n category: 'missing-resource',\r\n prompt: '$missing-resource load references/checklist.md',\r\n expectedSkills: ['missing-resource'],\r\n expectedBlockedCodes: ['skill_resource_unreadable'],\r\n },\r\n];\r\n\r\nfunction numberDetail(event: SkillLifecycleEvent, key: string): number {\r\n const value = event.details?.[key];\r\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\r\n}\r\n\r\nfunction median(values: readonly number[]): number {\r\n if (values.length === 0) return 0;\r\n const sorted = [...values].sort((left, right) => left - right);\r\n return sorted[Math.floor(sorted.length / 2)] ?? 0;\r\n}\r\n\r\nfunction percentile(values: readonly number[], fraction: number): number {\r\n if (values.length === 0) return 0;\r\n const sorted = [...values].sort((left, right) => left - right);\r\n const index = Math.min(sorted.length - 1, Math.ceil(sorted.length * fraction) - 1);\r\n return sorted[index] ?? 0;\r\n}\r\n\r\n/** Convert bounded lifecycle evidence into one prompt-free evaluation observation. */\r\nexport function observeSkillEvaluation(\r\n fixture: SkillEvaluationFixture,\r\n events: readonly SkillLifecycleEvent[],\r\n outcome: SkillEvaluationOutcome = {},\r\n): SkillEvaluationObservation {\r\n const applied = events.filter(\r\n (event) => event.type === 'skill_activation_applied' && event.skill,\r\n );\r\n const activatedSkills = [...new Set(applied.map((event) => event.skill!))];\r\n const expected = new Set(fixture.expectedSkills);\r\n const falseActivations = applied.filter((event) => event.skill && !expected.has(event.skill));\r\n const consentEvents = events.filter((event) => event.type === 'skill_consent_requested');\r\n const blockedCodes = events\r\n .filter(\r\n (event) =>\r\n event.type === 'skill_activation_blocked' || event.type === 'skill_resource_blocked',\r\n )\r\n .map((event) => event.details?.code)\r\n .filter((code): code is string => typeof code === 'string');\r\n const expectedBlockedCodes = fixture.expectedBlockedCodes ?? [];\r\n const promptChars = outcome.promptChars ?? 0;\r\n const bodyBytes = applied.reduce(\r\n (total, event) => total + numberDetail(event, 'bodyByteSize'),\r\n 0,\r\n );\r\n return {\r\n ...fixture,\r\n expectedSkills: [...fixture.expectedSkills],\r\n activatedSkills,\r\n expectedBlockedCodes: [...expectedBlockedCodes],\r\n blockedCodes,\r\n promptChars,\r\n promptTokens: outcome.promptTokens ?? Math.ceil(promptChars / 4),\r\n bodyBytes,\r\n bodyTokens: outcome.bodyTokens ?? Math.ceil(bodyBytes / 4),\r\n falseActivationBytes: falseActivations.reduce(\r\n (total, event) => total + numberDetail(event, 'bodyByteSize'),\r\n 0,\r\n ),\r\n activationLatencyMs: applied.map((event) => numberDetail(event, 'activationLatencyMs')),\r\n consentRequests: consentEvents.length,\r\n unnecessaryPermissionPrompts: consentEvents.filter(\r\n (event) => !event.skill || !expected.has(event.skill),\r\n ).length,\r\n taskCompleted: outcome.taskCompleted,\r\n userCorrections: outcome.userCorrections ?? 0,\r\n skillToolFailures: outcome.skillToolFailures ?? 0,\r\n blockingMismatch:\r\n expectedBlockedCodes.some((code) => !blockedCodes.includes(code)) ||\r\n blockedCodes.some((code) => !expectedBlockedCodes.includes(code)),\r\n exposure: outcome.exposure,\r\n activationTurns: outcome.activationTurns,\r\n };\r\n}\r\n\r\nexport function evaluateSkillActivation(\r\n observations: readonly SkillEvaluationObservation[],\r\n thresholds: SkillEvaluationThresholds = DEFAULT_SKILL_EVALUATION_THRESHOLDS,\r\n): SkillEvaluationReport {\r\n const categoryCounts = Object.fromEntries(\r\n SKILL_EVALUATION_CATEGORIES.map((category) => [\r\n category,\r\n observations.filter((observation) => observation.category === category).length,\r\n ]),\r\n ) as Record<SkillEvaluationCategory, number>;\r\n let truePositives = 0;\r\n let falsePositives = 0;\r\n let falseNegatives = 0;\r\n for (const observation of observations) {\r\n const expected = new Set(observation.expectedSkills);\r\n const activated = new Set(observation.activatedSkills);\r\n truePositives += [...activated].filter((skill) => expected.has(skill)).length;\r\n falsePositives += [...activated].filter((skill) => !expected.has(skill)).length;\r\n falseNegatives += [...expected].filter((skill) => !activated.has(skill)).length;\r\n }\r\n const precision =\r\n truePositives + falsePositives === 0 ? 1 : truePositives / (truePositives + falsePositives);\r\n const recall =\r\n truePositives + falseNegatives === 0 ? 1 : truePositives / (truePositives + falseNegatives);\r\n const completed = observations.filter(\r\n (observation): observation is SkillEvaluationObservation & { taskCompleted: boolean } =>\r\n observation.taskCompleted !== undefined,\r\n );\r\n const exposure = Object.fromEntries(\r\n (['eager', 'deferred'] as const).map((mode) => {\r\n const samples = observations.filter((observation) => observation.exposure === mode);\r\n return [\r\n mode,\r\n {\r\n samples: samples.length,\r\n activationRate:\r\n samples.length === 0\r\n ? 0\r\n : samples.filter((observation) => observation.activatedSkills.length > 0).length /\r\n samples.length,\r\n medianActivationTurns: median(\r\n samples.map((observation) => observation.activationTurns ?? 0),\r\n ),\r\n },\r\n ];\r\n }),\r\n ) as SkillEvaluationReport['exposure'];\r\n const reasons: string[] = [];\r\n const missingCategories = SKILL_EVALUATION_CATEGORIES.filter(\r\n (category) => categoryCounts[category] === 0,\r\n );\r\n if (missingCategories.length)\r\n reasons.push(`Missing fixture categories: ${missingCategories.join(', ')}.`);\r\n if (precision < thresholds.minimumPrecision) {\r\n reasons.push(\r\n `Activation precision ${precision.toFixed(3)} is below ${thresholds.minimumPrecision}.`,\r\n );\r\n }\r\n if (recall < thresholds.minimumRecall) {\r\n reasons.push(`Activation recall ${recall.toFixed(3)} is below ${thresholds.minimumRecall}.`);\r\n }\r\n if (falsePositives > thresholds.maximumFalseActivations) {\r\n reasons.push(\r\n `False activations ${falsePositives} exceed ${thresholds.maximumFalseActivations}.`,\r\n );\r\n }\r\n const unnecessaryPermissionPrompts = observations.reduce(\r\n (total, observation) => total + observation.unnecessaryPermissionPrompts,\r\n 0,\r\n );\r\n if (unnecessaryPermissionPrompts > thresholds.maximumUnnecessaryPermissionPrompts) {\r\n reasons.push(\r\n `Unnecessary permission prompts ${unnecessaryPermissionPrompts} exceed ${thresholds.maximumUnnecessaryPermissionPrompts}.`,\r\n );\r\n }\r\n const skillToolFailures = observations.reduce(\r\n (total, observation) => total + observation.skillToolFailures,\r\n 0,\r\n );\r\n if (skillToolFailures > thresholds.maximumSkillToolFailures) {\r\n reasons.push(\r\n `Skill-caused tool failures ${skillToolFailures} exceed ${thresholds.maximumSkillToolFailures}.`,\r\n );\r\n }\r\n const blockingMismatches = observations.filter(\r\n (observation) => observation.blockingMismatch,\r\n ).length;\r\n if (blockingMismatches > 0) {\r\n reasons.push(`${blockingMismatches} fixture(s) had unexpected or missing block outcomes.`);\r\n }\r\n const latencies = observations.flatMap((observation) => observation.activationLatencyMs);\r\n return {\r\n generatedAt: new Date().toISOString(),\r\n fixtureCount: observations.length,\r\n categoryCounts,\r\n truePositives,\r\n falsePositives,\r\n falseNegatives,\r\n precision,\r\n recall,\r\n falseActivationBytes: observations.reduce(\r\n (total, observation) => total + observation.falseActivationBytes,\r\n 0,\r\n ),\r\n promptChars: {\r\n total: observations.reduce((total, observation) => total + observation.promptChars, 0),\r\n median: median(observations.map((observation) => observation.promptChars)),\r\n },\r\n promptTokens: {\r\n total: observations.reduce((total, observation) => total + observation.promptTokens, 0),\r\n median: median(observations.map((observation) => observation.promptTokens)),\r\n },\r\n bodyBytes: {\r\n total: observations.reduce((total, observation) => total + observation.bodyBytes, 0),\r\n median: median(observations.map((observation) => observation.bodyBytes)),\r\n },\r\n bodyTokens: {\r\n total: observations.reduce((total, observation) => total + observation.bodyTokens, 0),\r\n median: median(observations.map((observation) => observation.bodyTokens)),\r\n },\r\n activationLatencyMs: { median: median(latencies), p95: percentile(latencies, 0.95) },\r\n consentRequests: observations.reduce(\r\n (total, observation) => total + observation.consentRequests,\r\n 0,\r\n ),\r\n unnecessaryPermissionPrompts,\r\n taskCompletionRate:\r\n completed.length === 0\r\n ? undefined\r\n : completed.filter((observation) => observation.taskCompleted).length / completed.length,\r\n userCorrections: observations.reduce(\r\n (total, observation) => total + observation.userCorrections,\r\n 0,\r\n ),\r\n skillToolFailures,\r\n blockingMismatches,\r\n exposure,\r\n thresholds: { ...thresholds },\r\n rolloutReady: reasons.length === 0,\r\n reasons,\r\n observations: observations.map((observation) => ({\r\n ...observation,\r\n expectedSkills: [...observation.expectedSkills],\r\n expectedBlockedCodes: observation.expectedBlockedCodes\r\n ? [...observation.expectedBlockedCodes]\r\n : undefined,\r\n activatedSkills: [...observation.activatedSkills],\r\n blockedCodes: [...observation.blockedCodes],\r\n activationLatencyMs: [...observation.activationLatencyMs],\r\n })),\r\n };\r\n}\r\n\r\nexport async function runSkillActivationEvaluation(\r\n fixtures: readonly SkillEvaluationPromptFixture[],\r\n execute: (\r\n fixture: SkillEvaluationPromptFixture,\r\n ) => Promise<{ events: readonly SkillLifecycleEvent[]; outcome?: SkillEvaluationOutcome }>,\r\n thresholds: SkillEvaluationThresholds = DEFAULT_SKILL_EVALUATION_THRESHOLDS,\r\n): Promise<SkillEvaluationReport> {\r\n const observations: SkillEvaluationObservation[] = [];\r\n for (const fixture of fixtures) {\r\n const result = await execute(fixture);\r\n observations.push(\r\n observeSkillEvaluation(\r\n {\r\n id: fixture.id,\r\n category: fixture.category,\r\n promptHash: createHash('sha256').update(fixture.prompt).digest('hex'),\r\n expectedSkills: [...fixture.expectedSkills],\r\n expectedBlockedCodes: fixture.expectedBlockedCodes\r\n ? [...fixture.expectedBlockedCodes]\r\n : undefined,\r\n },\r\n result.events,\r\n result.outcome,\r\n ),\r\n );\r\n }\r\n return evaluateSkillActivation(observations, thresholds);\r\n}\r\n\r\nexport function renderSkillEvaluationReport(report: SkillEvaluationReport): string {\r\n const categories = SKILL_EVALUATION_CATEGORIES.map(\r\n (category) => `- ${category}: ${report.categoryCounts[category]}`,\r\n ).join('\\n');\r\n return [\r\n '# Skill Activation Evaluation',\r\n '',\r\n `Generated: ${report.generatedAt}`,\r\n `Rollout ready: ${report.rolloutReady ? 'yes' : 'no'}`,\r\n `Precision: ${report.precision.toFixed(3)}`,\r\n `Recall: ${report.recall.toFixed(3)}`,\r\n `False activations: ${report.falsePositives}`,\r\n `False-activation body bytes: ${report.falseActivationBytes}`,\r\n `Median prompt tokens: ${report.promptTokens.median}`,\r\n `Median activated body tokens: ${report.bodyTokens.median}`,\r\n `Median activation latency: ${report.activationLatencyMs.median} ms`,\r\n `Unnecessary permission prompts: ${report.unnecessaryPermissionPrompts}`,\r\n `Skill-caused tool failures: ${report.skillToolFailures}`,\r\n `Blocking mismatches: ${report.blockingMismatches}`,\r\n ...(report.evaluation\r\n ? [\r\n `Evidence kind: ${report.evaluation.evidenceKind}`,\r\n `Provider run eligibility: ${report.evaluation.providerRunEligibility}`,\r\n `Evaluation date: ${report.evaluation.controls.evaluationDate}`,\r\n `Evaluation seed: ${report.evaluation.controls.randomSeed}`,\r\n `Runtime revision: ${report.evaluation.controls.runtimeRevision}`,\r\n `Fixture revision: ${report.evaluation.controls.fixtureRevision} (${report.evaluation.controls.fixtureRevisionStatus})`,\r\n ]\r\n : []),\r\n '',\r\n '## Fixture Coverage',\r\n '',\r\n categories,\r\n '',\r\n '## Gate',\r\n '',\r\n ...(report.reasons.length\r\n ? report.reasons.map((reason) => `- ${reason}`)\r\n : ['- All thresholds passed.']),\r\n '',\r\n ].join('\\n');\r\n}\r\n\r\nexport function writeSkillEvaluationReport(\r\n report: SkillEvaluationReport,\r\n jsonPath: string,\r\n markdownPath?: string,\r\n): void {\r\n mkdirSync(dirname(jsonPath), { recursive: true });\r\n writeFileSync(jsonPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\r\n if (markdownPath) {\r\n mkdirSync(dirname(markdownPath), { recursive: true });\r\n writeFileSync(markdownPath, renderSkillEvaluationReport(report), 'utf8');\r\n }\r\n}\r\n","import { createHash } from 'crypto';\r\nimport { mkdirSync, writeFileSync } from 'fs';\r\nimport { dirname } from 'path';\r\nimport type { AgentMode, AgentTopology, IssueQuality } from './types.js';\r\n\r\nexport interface EvaluationFixture {\r\n id: string;\r\n cohort: 'decomposable' | 'ambiguous' | 'sequential';\r\n prompt: string;\r\n}\r\n\r\nexport interface EvaluationRunResult {\r\n passed: boolean;\r\n validationCorrect?: boolean;\r\n wallTimeMs: number;\r\n totalTokens?: number;\r\n costUsd?: number;\r\n spawnCount?: number;\r\n route?: AgentTopology;\r\n issueQuality?: IssueQuality;\r\n conflicts?: number;\r\n interruptions?: number;\r\n unvalidatedApplications?: number;\r\n}\r\n\r\nexport interface EvaluationMetric extends Omit<EvaluationRunResult, 'route' | 'issueQuality'> {\r\n fixtureId: string;\r\n promptHash: string;\r\n cohort: EvaluationFixture['cohort'];\r\n mode: Extract<AgentMode, 'adaptive' | 'off'>;\r\n route?: AgentTopology;\r\n issueQuality?: IssueQuality;\r\n}\r\n\r\n/** Run each fixture with the single-agent control and adaptive treatment. */\r\nexport async function runPairedEvaluation(\r\n fixtures: EvaluationFixture[],\r\n execute: (\r\n fixture: EvaluationFixture,\r\n mode: Extract<AgentMode, 'adaptive' | 'off'>,\r\n ) => Promise<EvaluationRunResult>,\r\n outputPath: string,\r\n): Promise<EvaluationMetric[]> {\r\n const metrics: EvaluationMetric[] = [];\r\n for (const fixture of fixtures) {\r\n for (const mode of ['off', 'adaptive'] as const) {\r\n const result = await execute(fixture, mode);\r\n metrics.push({\r\n fixtureId: fixture.id,\r\n promptHash: createHash('sha256').update(fixture.prompt).digest('hex'),\r\n cohort: fixture.cohort,\r\n mode,\r\n ...result,\r\n });\r\n }\r\n }\r\n mkdirSync(dirname(outputPath), { recursive: true });\r\n writeFileSync(\r\n outputPath,\r\n `${metrics.map((metric) => JSON.stringify(metric)).join('\\n')}\\n`,\r\n 'utf8',\r\n );\r\n return metrics;\r\n}\r\n\r\nexport function evaluateSuccess(metrics: EvaluationMetric[]): {\r\n successful: boolean;\r\n reasons: string[];\r\n} {\r\n const reasons: string[] = [];\r\n const byMode = (cohorts: EvaluationFixture['cohort'][], mode: EvaluationMetric['mode']) =>\r\n metrics.filter((metric) => cohorts.includes(metric.cohort) && metric.mode === mode);\r\n const rate = (items: EvaluationMetric[]) =>\r\n items.length === 0 ? 0 : items.filter((item) => item.passed).length / items.length;\r\n const median = (values: number[]) => {\r\n if (values.length === 0) return 0;\r\n const sorted = [...values].sort((left, right) => left - right);\r\n return sorted[Math.floor(sorted.length / 2)];\r\n };\r\n\r\n const treatment = byMode(['decomposable', 'ambiguous'], 'adaptive');\r\n const control = byMode(['decomposable', 'ambiguous'], 'off');\r\n const passGain = rate(treatment) - rate(control);\r\n const treatmentWall = median(treatment.map((item) => item.wallTimeMs));\r\n const controlWall = median(control.map((item) => item.wallTimeMs));\r\n if (passGain < 0.05 && !(passGain >= 0 && treatmentWall <= controlWall * 0.8)) {\r\n reasons.push('Decomposable/ambiguous cohort missed the pass-rate or wall-time target.');\r\n }\r\n\r\n const sequentialTreatment = byMode(['sequential'], 'adaptive');\r\n const sequentialControl = byMode(['sequential'], 'off');\r\n if (rate(sequentialTreatment) < rate(sequentialControl) - 0.02) {\r\n reasons.push('Sequential cohort regressed by more than two pass-rate points.');\r\n }\r\n\r\n const adaptiveTokens = median(\r\n metrics.filter((item) => item.mode === 'adaptive').map((item) => item.totalTokens ?? 0),\r\n );\r\n const controlTokens = median(\r\n metrics.filter((item) => item.mode === 'off').map((item) => item.totalTokens ?? 0),\r\n );\r\n if (controlTokens > 0 && adaptiveTokens >= controlTokens * 3) {\r\n reasons.push('Median adaptive token overhead is not below 3x.');\r\n }\r\n if (metrics.some((item) => (item.unvalidatedApplications ?? 0) > 0)) {\r\n reasons.push('At least one unvalidated patch was applied.');\r\n }\r\n return { successful: reasons.length === 0, reasons };\r\n}\r\n"],"mappings":"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","names":["createHash","mkdirSync","writeFileSync","dirname","median"]}
|
|
1
|
+
{"version":3,"sources":["../src/sdk.ts","../src/skill-evaluation.ts","../src/agents/evaluation.ts"],"sourcesContent":["/** Book Agent SDK — programmatic API for embedding Book as a library. */\n\nimport { join } from 'path';\nimport type { ElicitationHandler, UserQuestionHandler } from './types/tools.js';\nimport type { AgentConfig, SessionDriver } from './types/runtime.js';\nimport type { SessionStoreInterface } from './types/sessions.js';\nimport { freezeAgentConfig, loadConfig, type LoadConfigOptions } from './config.js';\nimport { runHeadless } from './headless.js';\nimport { createDefaultRegistry } from './tools/registry.js';\nimport { connectMcpServers, disconnectMcpServers } from './mcp.js';\nimport { mcpServersToRecord, partitionMcpServersByApproval } from './mcp-approvals.js';\nimport { resolveMcpServerList } from './mcp-config.js';\nimport {\n collectSkippedProjectFileNotices,\n collectWithheldProjectNotices,\n} from './project-approval-notices.js';\nimport { AgentManager } from './agents/manager.js';\nimport { SessionStore } from './session/store.js';\nimport { discardUntouchedSession, resolveSessionBootstrap } from './session/resolve.js';\nimport type { AgentEvent } from './session/agent-events.js';\nimport {\n cleanupDebugLogs,\n DEFAULT_LOCAL_DATA_RETENTION_DAYS,\n getDebugLogPath,\n} from './debug-log.js';\nimport { resolvePermissionMode } from './permission-mode.js';\nimport { resolveBookHome } from './book-home.js';\nimport { cleanupRunStatus } from './run-status.js';\nimport { resolveSessionDriver } from './session-driver.js';\n\nexport type QueryEvent = AgentEvent;\n\nexport interface QueryOptions {\n workspace?: string;\n model?: string;\n permissionMode?: string;\n maxTurns?: number;\n settingsPath?: string;\n noSettings?: boolean;\n persistSession?: boolean;\n sessionId?: string;\n sessionStore?: SessionStoreInterface;\n signal?: AbortSignal;\n onUserQuestionRequired?: UserQuestionHandler;\n /**\n * Answer MCP form elicitations. Supplying it declares the elicitation\n * capability to connected servers; without it they fail such requests\n * themselves rather than blocking on a prompt no one can see.\n */\n onElicit?: ElicitationHandler;\n agents?: 'adaptive' | 'manual' | 'off';\n /** Forward high-volume managed-agent text deltas. Defaults to false. */\n forwardSubagentText?: boolean;\n /**\n * Who drives the session. Defaults to `BOOK_SESSION_DRIVER`, then to `agent` under another agent\n * harness and `human` otherwise; an agent-driven session saves only what it learned, as\n * project or reference memory, never its delegator's instructions.\n */\n sessionDriver?: SessionDriver;\n}\n\nclass AsyncEventQueue<T> {\n private values: T[] = [];\n private waiters: Array<(value: T | undefined) => void> = [];\n private closed = false;\n\n push(value: T): void {\n if (this.closed) return;\n const waiter = this.waiters.shift();\n if (waiter) waiter(value);\n else this.values.push(value);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) waiter(undefined);\n }\n\n next(): Promise<T | undefined> {\n const value = this.values.shift();\n if (value !== undefined) return Promise.resolve(value);\n if (this.closed) return Promise.resolve(undefined);\n return new Promise((resolve) => this.waiters.push(resolve));\n }\n}\n\nexport async function* query(\n prompt: string,\n options: QueryOptions = {},\n): AsyncGenerator<QueryEvent, void, undefined> {\n const workspace = options.workspace || process.cwd();\n const loadedConfig = loadConfig(workspace, {\n settingsOverridePath: options.settingsPath,\n noSettings: options.noSettings,\n runMigrations: !options.noSettings,\n });\n const config = freezeAgentConfig({\n ...loadedConfig,\n sessionDriver: resolveSessionDriver({ explicit: options.sessionDriver, env: process.env })\n .driver,\n ...(options.model ? { model: options.model } : {}),\n ...(options.maxTurns ? { maxTurns: options.maxTurns } : {}),\n ...(options.agents\n ? {\n settings: {\n ...loadedConfig.settings,\n agents: { ...loadedConfig.settings.agents, mode: options.agents },\n },\n }\n : {}),\n });\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(options.signal?.reason);\n if (options.signal?.aborted) abortFromCaller();\n else options.signal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const persistSession = options.persistSession !== false;\n const sessionStore = persistSession\n ? (options.sessionStore ?? new SessionStore(join(resolveBookHome(), 'sessions')))\n : undefined;\n const bootstrap = resolveSessionBootstrap(sessionStore, {\n cwd: config.workspace,\n sessionId: options.sessionId,\n driver: config.sessionDriver,\n });\n if (persistSession && !options.sessionStore && sessionStore) {\n cleanupDebugLogs(DEFAULT_LOCAL_DATA_RETENTION_DAYS, getDebugLogPath());\n sessionStore.cleanup(DEFAULT_LOCAL_DATA_RETENTION_DAYS, new Set([bootstrap.sessionId]));\n }\n // headless.ts writes a run record on every query, whatever the session settings.\n cleanupRunStatus(DEFAULT_LOCAL_DATA_RETENTION_DAYS);\n const queue = new AsyncEventQueue<QueryEvent>();\n let connections: Awaited<ReturnType<typeof connectMcpServers>>['connections'] = [];\n\n queue.push({ type: 'system', model: config.model, cwd: config.workspace });\n queue.push({ type: 'session', sessionId: bootstrap.sessionId });\n\n const running = (async () => {\n try {\n // Project-declared MCP servers require a prior interactive approval;\n // SDK runs cannot prompt, so unapproved servers are skipped with a warning.\n // Repository-declared allow rules and hooks are withheld until the user\n // decides on them; an SDK run cannot ask, so it reports and continues.\n for (const notice of [\n ...collectWithheldProjectNotices({\n workspace: config.workspace,\n settings: config.settings,\n settingsEnabled: !options.noSettings,\n providerGate: config.workspaceProviderGate,\n }),\n // Instruction files, REVIEW.md and command files that link out of the repository are not\n // loaded (#539, #543).\n ...collectSkippedProjectFileNotices(config.workspace),\n ]) {\n console.warn(notice);\n }\n const declaredMcpServers = resolveMcpServerList(config.workspace);\n const mcpPartition = partitionMcpServersByApproval(declaredMcpServers, config.settings);\n for (const server of mcpPartition.pending) {\n console.warn(\n `⚠ Skipping MCP server \"${server.name}\" (${server.path}): project-declared servers require one-time approval. Approve it in an interactive session first.`,\n );\n }\n const mcp = await connectMcpServers(config.workspace, {\n signal: controller.signal,\n servers: mcpServersToRecord(mcpPartition.allowed),\n onElicit: options.onElicit,\n });\n connections = mcp.connections;\n const registry = createDefaultRegistry({ agents: config.settings.agents.mode !== 'off' });\n if (mcp.tools.length > 0) registry.registerAll(mcp.tools);\n\n const result = await runHeadless(config, registry, {\n prompt,\n inputFormat: 'text',\n outputFormat: 'text',\n // Progress lines are for a person watching `book -p` in a terminal. An\n // SDK host owns its stderr and receives every tool call as an event.\n quiet: true,\n history: bootstrap.history,\n transcript: bootstrap.transcript,\n compactBoundaries: bootstrap.compactBoundaries,\n // A resumed session's unmet `/goal` keeps being checked, and `/goal clear` can see it.\n goal: bootstrap.goal,\n mode: resolvePermissionMode(config.settings, options.permissionMode),\n maxTurns: options.maxTurns,\n persistSession,\n sessionStore,\n sessionId: bootstrap.sessionId,\n sessionCreated: bootstrap.created,\n runSource: 'sdk',\n signal: controller.signal,\n onUserQuestionRequired: options.onUserQuestionRequired,\n forwardSubagentText: options.forwardSubagentText,\n stdout: { write: () => true },\n onAgentEvent: (event) => {\n if (\n event.type !== 'system' &&\n event.type !== 'session' &&\n event.type !== 'result' &&\n event.type !== 'done' &&\n (event.type !== 'agent_text_delta' || options.forwardSubagentText === true)\n ) {\n queue.push(event);\n }\n },\n });\n queue.push({\n type: 'result',\n messages: result.messages,\n usage: result.usage,\n sessionId: bootstrap.sessionId,\n outcome: result.outcome,\n runs: result.runs,\n // `stdout` above is a discard sink, so this is the only way an SDK\n // caller sees a slash command the host performed on its behalf.\n commandResults: result.commandResults,\n answer: result.answer,\n });\n } catch (error) {\n if (!controller.signal.aborted) {\n queue.push({\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n });\n }\n } finally {\n await disconnectMcpServers(connections);\n queue.push({ type: 'done' });\n queue.close();\n }\n })();\n\n try {\n while (true) {\n const event = await queue.next();\n if (!event) break;\n yield event;\n }\n } finally {\n controller.abort(new Error('SDK event consumer stopped'));\n options.signal?.removeEventListener('abort', abortFromCaller);\n try {\n await running;\n } finally {\n // The run has ended, SessionEnd hooks included, whether it resolved or rejected: a\n // query that stopped before it recorded its prompt leaves no empty session behind\n // (#444). A rejection still propagates.\n discardUntouchedSession(sessionStore, bootstrap);\n }\n }\n}\n\nexport { loadConfig, type LoadConfigOptions };\nexport type { ToolDiscoverySettings } from './settings.js';\nexport { AgentManager };\nexport { createDefaultRegistry, createRegistry } from './tools/registry.js';\nexport { createToolSurface } from './tools/catalog.js';\nexport { toolFailure, toolSuccess } from './tools/result.js';\nexport {\n applySkillOverrides,\n buildSkillListing,\n discoverSkills,\n explicitSkillMentions,\n generateSkillListing,\n loadSkillBody,\n skillRoots,\n} from './skills.js';\nexport type {\n DiscoverSkillsOptions,\n LoadedSkillBody,\n ShadowedSkill,\n Skill,\n SkillIssue,\n SkillListingResult,\n SkillResource,\n SkillRoot,\n SkillRootKind,\n SkillSource,\n} from './skills.js';\nexport {\n SkillRegistry,\n SkillRegistryError,\n type SkillActivationFrame,\n type SkillActivationFrameSummary,\n type SkillActivationReason,\n type SkillLifecycleEvent,\n type SkillLifecycleEventType,\n type SkillRegistrySnapshot,\n} from './skill-registry.js';\nexport {\n DEFAULT_SKILL_EVALUATION_THRESHOLDS,\n DEFAULT_SKILL_EVALUATION_FIXTURES,\n SKILL_EVALUATION_CATEGORIES,\n evaluateSkillActivation,\n observeSkillEvaluation,\n renderSkillEvaluationReport,\n runSkillActivationEvaluation,\n writeSkillEvaluationReport,\n} from './skill-evaluation.js';\nexport type {\n SkillEvaluationCategory,\n SkillEvaluationFixture,\n SkillEvaluationObservation,\n SkillEvaluationOutcome,\n SkillEvaluationPromptFixture,\n SkillEvaluationReport,\n SkillEvaluationThresholds,\n} from './skill-evaluation.js';\nexport { SessionRuntime } from './session/runtime.js';\nexport { buildSkillReport } from './skill-report.js';\nexport function createAgentManager(config: AgentConfig): AgentManager {\n return new AgentManager(config, createDefaultRegistry({ agents: true }).getDefinitions());\n}\nexport { runPairedEvaluation, evaluateSuccess } from './agents/evaluation.js';\nexport { createAgentSessionSnapshot, reduceAgentSessionSnapshot } from './session/agent-events.js';\nexport type {\n AgentEvent,\n AgentSessionSnapshot,\n AgentSessionStatus,\n} from './session/agent-events.js';\nexport type {\n EvaluationFixture,\n EvaluationMetric,\n EvaluationRunResult,\n} from './agents/evaluation.js';\nexport type {\n AgentPlanRecord,\n AgentApplyResult,\n AgentRecord,\n AgentSummary,\n AgentCompletion,\n AgentCompletionNotification,\n AgentProfile,\n AgentActivity,\n AgentRuntimeEvent,\n AgentRunMetrics,\n AgentSnapshot,\n AgentSpawnRequest,\n EvidenceItem,\n} from './agents/types.js';\nexport type {\n AgentTerminalOutcome,\n AgentTerminalReason,\n AgentTerminalStatus,\n} from './types/terminal.js';\nexport type {\n AgentModelIdentity,\n AgentModelIdentityStatus,\n AgentRunAmbientSnapshot,\n AgentRunAccounting,\n AgentRunContext,\n AgentRunResult,\n AgentRunSource,\n} from './types/runs.js';\nexport type {\n JsonSchemaObject,\n ToolCatalogMetadata,\n ToolCategory,\n ToolDefinition,\n ToolDiscoveryContext,\n ToolEffect,\n ToolPolicy,\n ToolResult,\n ToolResultArtifacts,\n ToolResultError,\n ToolResultPresentation,\n ToolResultStatus,\n ToolSearchMatch,\n UserQuestion,\n UserQuestionOption,\n UserQuestionRequest,\n UserQuestionResponse,\n UserQuestionSource,\n UserQuestionHandler,\n ElicitationField,\n ElicitationRequest,\n ElicitationResponse,\n ElicitationValue,\n ElicitationHandler,\n} from './types/tools.js';\n","import { createHash } from 'node:crypto';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { SkillLifecycleEvent } from './skill-registry.js';\n\nexport const SKILL_EVALUATION_CATEGORIES = [\n 'direct',\n 'indirect',\n 'negative',\n 'ambiguous',\n 'conflicting',\n 'disabled',\n 'invalid',\n 'missing-body',\n 'missing-resource',\n] as const;\n\nexport type SkillEvaluationCategory = (typeof SKILL_EVALUATION_CATEGORIES)[number];\n\nexport interface SkillEvaluationFixture {\n id: string;\n category: SkillEvaluationCategory;\n promptHash: string;\n expectedSkills: string[];\n expectedBlockedCodes?: string[];\n}\n\nexport interface SkillEvaluationPromptFixture {\n id: string;\n category: SkillEvaluationCategory;\n prompt: string;\n expectedSkills: string[];\n expectedBlockedCodes?: string[];\n}\n\nexport interface SkillEvaluationOutcome {\n promptChars?: number;\n promptTokens?: number;\n bodyTokens?: number;\n taskCompleted?: boolean;\n userCorrections?: number;\n skillToolFailures?: number;\n exposure?: 'eager' | 'deferred';\n activationTurns?: number;\n}\n\nexport interface SkillEvaluationObservation extends SkillEvaluationFixture {\n activatedSkills: string[];\n blockedCodes: string[];\n promptChars: number;\n promptTokens: number;\n bodyBytes: number;\n bodyTokens: number;\n falseActivationBytes: number;\n activationLatencyMs: number[];\n consentRequests: number;\n unnecessaryPermissionPrompts: number;\n taskCompleted?: boolean;\n userCorrections: number;\n skillToolFailures: number;\n blockingMismatch: boolean;\n exposure?: 'eager' | 'deferred';\n activationTurns?: number;\n}\n\nexport interface SkillEvaluationThresholds {\n minimumPrecision: number;\n minimumRecall: number;\n maximumFalseActivations: number;\n maximumUnnecessaryPermissionPrompts: number;\n maximumSkillToolFailures: number;\n}\n\nexport interface SkillEvaluationExecution {\n evidenceKind: 'offline-observation';\n providerRunEligibility: 'not-applicable';\n controls: {\n evaluationDate: string;\n randomSeed: string;\n runtimeRevision: string;\n fixtureRevision: string;\n fixtureRevisionStatus: 'captured' | 'incomplete';\n };\n}\n\nexport interface SkillEvaluationReport {\n generatedAt: string;\n fixtureCount: number;\n categoryCounts: Record<SkillEvaluationCategory, number>;\n truePositives: number;\n falsePositives: number;\n falseNegatives: number;\n precision: number;\n recall: number;\n falseActivationBytes: number;\n promptChars: { total: number; median: number };\n promptTokens: { total: number; median: number };\n bodyBytes: { total: number; median: number };\n bodyTokens: { total: number; median: number };\n activationLatencyMs: { median: number; p95: number };\n consentRequests: number;\n unnecessaryPermissionPrompts: number;\n taskCompletionRate?: number;\n userCorrections: number;\n skillToolFailures: number;\n blockingMismatches: number;\n exposure: Record<\n 'eager' | 'deferred',\n { samples: number; activationRate: number; medianActivationTurns: number }\n >;\n thresholds: SkillEvaluationThresholds;\n rolloutReady: boolean;\n reasons: string[];\n observations: SkillEvaluationObservation[];\n evaluation?: SkillEvaluationExecution;\n}\n\nexport const DEFAULT_SKILL_EVALUATION_THRESHOLDS: SkillEvaluationThresholds = {\n minimumPrecision: 0.95,\n minimumRecall: 0.8,\n maximumFalseActivations: 0,\n maximumUnnecessaryPermissionPrompts: 0,\n maximumSkillToolFailures: 0,\n};\n\nexport const DEFAULT_SKILL_EVALUATION_FIXTURES: readonly SkillEvaluationPromptFixture[] = [\n {\n id: 'direct-review',\n category: 'direct',\n prompt: '$review inspect the current change',\n expectedSkills: ['review'],\n },\n {\n id: 'indirect-review',\n category: 'indirect',\n prompt: 'Inspect this diff for correctness regressions and missing tests',\n expectedSkills: ['review'],\n },\n {\n id: 'negative-general-question',\n category: 'negative',\n prompt: 'Explain what this function returns',\n expectedSkills: [],\n },\n {\n id: 'ambiguous-review-word',\n category: 'ambiguous',\n prompt: 'Review the available deployment choices with me',\n expectedSkills: [],\n },\n {\n id: 'conflicting-tool-ceilings',\n category: 'conflicting',\n prompt: '$read-review $write-review inspect the change',\n expectedSkills: ['read-review'],\n expectedBlockedCodes: ['skill_tool_intersection_empty'],\n },\n {\n id: 'disabled-skill',\n category: 'disabled',\n prompt: '$disabled-skill run the workflow',\n expectedSkills: [],\n expectedBlockedCodes: ['skill_disabled'],\n },\n {\n id: 'invalid-skill',\n category: 'invalid',\n prompt: '$invalid-skill run the workflow',\n expectedSkills: [],\n expectedBlockedCodes: ['skill_invalid'],\n },\n {\n id: 'missing-body',\n category: 'missing-body',\n prompt: '$missing-body run the workflow',\n expectedSkills: [],\n expectedBlockedCodes: ['skill_load_failed'],\n },\n {\n id: 'missing-resource',\n category: 'missing-resource',\n prompt: '$missing-resource load references/checklist.md',\n expectedSkills: ['missing-resource'],\n expectedBlockedCodes: ['skill_resource_unreadable'],\n },\n];\n\nfunction numberDetail(event: SkillLifecycleEvent, key: string): number {\n const value = event.details?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction median(values: readonly number[]): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((left, right) => left - right);\n return sorted[Math.floor(sorted.length / 2)] ?? 0;\n}\n\nfunction percentile(values: readonly number[], fraction: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((left, right) => left - right);\n const index = Math.min(sorted.length - 1, Math.ceil(sorted.length * fraction) - 1);\n return sorted[index] ?? 0;\n}\n\n/** Convert bounded lifecycle evidence into one prompt-free evaluation observation. */\nexport function observeSkillEvaluation(\n fixture: SkillEvaluationFixture,\n events: readonly SkillLifecycleEvent[],\n outcome: SkillEvaluationOutcome = {},\n): SkillEvaluationObservation {\n const applied = events.filter(\n (event) => event.type === 'skill_activation_applied' && event.skill,\n );\n const activatedSkills = [...new Set(applied.map((event) => event.skill!))];\n const expected = new Set(fixture.expectedSkills);\n const falseActivations = applied.filter((event) => event.skill && !expected.has(event.skill));\n const consentEvents = events.filter((event) => event.type === 'skill_consent_requested');\n const blockedCodes = events\n .filter(\n (event) =>\n event.type === 'skill_activation_blocked' || event.type === 'skill_resource_blocked',\n )\n .map((event) => event.details?.code)\n .filter((code): code is string => typeof code === 'string');\n const expectedBlockedCodes = fixture.expectedBlockedCodes ?? [];\n const promptChars = outcome.promptChars ?? 0;\n const bodyBytes = applied.reduce(\n (total, event) => total + numberDetail(event, 'bodyByteSize'),\n 0,\n );\n return {\n ...fixture,\n expectedSkills: [...fixture.expectedSkills],\n activatedSkills,\n expectedBlockedCodes: [...expectedBlockedCodes],\n blockedCodes,\n promptChars,\n promptTokens: outcome.promptTokens ?? Math.ceil(promptChars / 4),\n bodyBytes,\n bodyTokens: outcome.bodyTokens ?? Math.ceil(bodyBytes / 4),\n falseActivationBytes: falseActivations.reduce(\n (total, event) => total + numberDetail(event, 'bodyByteSize'),\n 0,\n ),\n activationLatencyMs: applied.map((event) => numberDetail(event, 'activationLatencyMs')),\n consentRequests: consentEvents.length,\n unnecessaryPermissionPrompts: consentEvents.filter(\n (event) => !event.skill || !expected.has(event.skill),\n ).length,\n taskCompleted: outcome.taskCompleted,\n userCorrections: outcome.userCorrections ?? 0,\n skillToolFailures: outcome.skillToolFailures ?? 0,\n blockingMismatch:\n expectedBlockedCodes.some((code) => !blockedCodes.includes(code)) ||\n blockedCodes.some((code) => !expectedBlockedCodes.includes(code)),\n exposure: outcome.exposure,\n activationTurns: outcome.activationTurns,\n };\n}\n\nexport function evaluateSkillActivation(\n observations: readonly SkillEvaluationObservation[],\n thresholds: SkillEvaluationThresholds = DEFAULT_SKILL_EVALUATION_THRESHOLDS,\n): SkillEvaluationReport {\n const categoryCounts = Object.fromEntries(\n SKILL_EVALUATION_CATEGORIES.map((category) => [\n category,\n observations.filter((observation) => observation.category === category).length,\n ]),\n ) as Record<SkillEvaluationCategory, number>;\n let truePositives = 0;\n let falsePositives = 0;\n let falseNegatives = 0;\n for (const observation of observations) {\n const expected = new Set(observation.expectedSkills);\n const activated = new Set(observation.activatedSkills);\n truePositives += [...activated].filter((skill) => expected.has(skill)).length;\n falsePositives += [...activated].filter((skill) => !expected.has(skill)).length;\n falseNegatives += [...expected].filter((skill) => !activated.has(skill)).length;\n }\n const precision =\n truePositives + falsePositives === 0 ? 1 : truePositives / (truePositives + falsePositives);\n const recall =\n truePositives + falseNegatives === 0 ? 1 : truePositives / (truePositives + falseNegatives);\n const completed = observations.filter(\n (observation): observation is SkillEvaluationObservation & { taskCompleted: boolean } =>\n observation.taskCompleted !== undefined,\n );\n const exposure = Object.fromEntries(\n (['eager', 'deferred'] as const).map((mode) => {\n const samples = observations.filter((observation) => observation.exposure === mode);\n return [\n mode,\n {\n samples: samples.length,\n activationRate:\n samples.length === 0\n ? 0\n : samples.filter((observation) => observation.activatedSkills.length > 0).length /\n samples.length,\n medianActivationTurns: median(\n samples.map((observation) => observation.activationTurns ?? 0),\n ),\n },\n ];\n }),\n ) as SkillEvaluationReport['exposure'];\n const reasons: string[] = [];\n const missingCategories = SKILL_EVALUATION_CATEGORIES.filter(\n (category) => categoryCounts[category] === 0,\n );\n if (missingCategories.length)\n reasons.push(`Missing fixture categories: ${missingCategories.join(', ')}.`);\n if (precision < thresholds.minimumPrecision) {\n reasons.push(\n `Activation precision ${precision.toFixed(3)} is below ${thresholds.minimumPrecision}.`,\n );\n }\n if (recall < thresholds.minimumRecall) {\n reasons.push(`Activation recall ${recall.toFixed(3)} is below ${thresholds.minimumRecall}.`);\n }\n if (falsePositives > thresholds.maximumFalseActivations) {\n reasons.push(\n `False activations ${falsePositives} exceed ${thresholds.maximumFalseActivations}.`,\n );\n }\n const unnecessaryPermissionPrompts = observations.reduce(\n (total, observation) => total + observation.unnecessaryPermissionPrompts,\n 0,\n );\n if (unnecessaryPermissionPrompts > thresholds.maximumUnnecessaryPermissionPrompts) {\n reasons.push(\n `Unnecessary permission prompts ${unnecessaryPermissionPrompts} exceed ${thresholds.maximumUnnecessaryPermissionPrompts}.`,\n );\n }\n const skillToolFailures = observations.reduce(\n (total, observation) => total + observation.skillToolFailures,\n 0,\n );\n if (skillToolFailures > thresholds.maximumSkillToolFailures) {\n reasons.push(\n `Skill-caused tool failures ${skillToolFailures} exceed ${thresholds.maximumSkillToolFailures}.`,\n );\n }\n const blockingMismatches = observations.filter(\n (observation) => observation.blockingMismatch,\n ).length;\n if (blockingMismatches > 0) {\n reasons.push(`${blockingMismatches} fixture(s) had unexpected or missing block outcomes.`);\n }\n const latencies = observations.flatMap((observation) => observation.activationLatencyMs);\n return {\n generatedAt: new Date().toISOString(),\n fixtureCount: observations.length,\n categoryCounts,\n truePositives,\n falsePositives,\n falseNegatives,\n precision,\n recall,\n falseActivationBytes: observations.reduce(\n (total, observation) => total + observation.falseActivationBytes,\n 0,\n ),\n promptChars: {\n total: observations.reduce((total, observation) => total + observation.promptChars, 0),\n median: median(observations.map((observation) => observation.promptChars)),\n },\n promptTokens: {\n total: observations.reduce((total, observation) => total + observation.promptTokens, 0),\n median: median(observations.map((observation) => observation.promptTokens)),\n },\n bodyBytes: {\n total: observations.reduce((total, observation) => total + observation.bodyBytes, 0),\n median: median(observations.map((observation) => observation.bodyBytes)),\n },\n bodyTokens: {\n total: observations.reduce((total, observation) => total + observation.bodyTokens, 0),\n median: median(observations.map((observation) => observation.bodyTokens)),\n },\n activationLatencyMs: { median: median(latencies), p95: percentile(latencies, 0.95) },\n consentRequests: observations.reduce(\n (total, observation) => total + observation.consentRequests,\n 0,\n ),\n unnecessaryPermissionPrompts,\n taskCompletionRate:\n completed.length === 0\n ? undefined\n : completed.filter((observation) => observation.taskCompleted).length / completed.length,\n userCorrections: observations.reduce(\n (total, observation) => total + observation.userCorrections,\n 0,\n ),\n skillToolFailures,\n blockingMismatches,\n exposure,\n thresholds: { ...thresholds },\n rolloutReady: reasons.length === 0,\n reasons,\n observations: observations.map((observation) => ({\n ...observation,\n expectedSkills: [...observation.expectedSkills],\n expectedBlockedCodes: observation.expectedBlockedCodes\n ? [...observation.expectedBlockedCodes]\n : undefined,\n activatedSkills: [...observation.activatedSkills],\n blockedCodes: [...observation.blockedCodes],\n activationLatencyMs: [...observation.activationLatencyMs],\n })),\n };\n}\n\nexport async function runSkillActivationEvaluation(\n fixtures: readonly SkillEvaluationPromptFixture[],\n execute: (\n fixture: SkillEvaluationPromptFixture,\n ) => Promise<{ events: readonly SkillLifecycleEvent[]; outcome?: SkillEvaluationOutcome }>,\n thresholds: SkillEvaluationThresholds = DEFAULT_SKILL_EVALUATION_THRESHOLDS,\n): Promise<SkillEvaluationReport> {\n const observations: SkillEvaluationObservation[] = [];\n for (const fixture of fixtures) {\n const result = await execute(fixture);\n observations.push(\n observeSkillEvaluation(\n {\n id: fixture.id,\n category: fixture.category,\n promptHash: createHash('sha256').update(fixture.prompt).digest('hex'),\n expectedSkills: [...fixture.expectedSkills],\n expectedBlockedCodes: fixture.expectedBlockedCodes\n ? [...fixture.expectedBlockedCodes]\n : undefined,\n },\n result.events,\n result.outcome,\n ),\n );\n }\n return evaluateSkillActivation(observations, thresholds);\n}\n\nexport function renderSkillEvaluationReport(report: SkillEvaluationReport): string {\n const categories = SKILL_EVALUATION_CATEGORIES.map(\n (category) => `- ${category}: ${report.categoryCounts[category]}`,\n ).join('\\n');\n return [\n '# Skill Activation Evaluation',\n '',\n `Generated: ${report.generatedAt}`,\n `Rollout ready: ${report.rolloutReady ? 'yes' : 'no'}`,\n `Precision: ${report.precision.toFixed(3)}`,\n `Recall: ${report.recall.toFixed(3)}`,\n `False activations: ${report.falsePositives}`,\n `False-activation body bytes: ${report.falseActivationBytes}`,\n `Median prompt tokens: ${report.promptTokens.median}`,\n `Median activated body tokens: ${report.bodyTokens.median}`,\n `Median activation latency: ${report.activationLatencyMs.median} ms`,\n `Unnecessary permission prompts: ${report.unnecessaryPermissionPrompts}`,\n `Skill-caused tool failures: ${report.skillToolFailures}`,\n `Blocking mismatches: ${report.blockingMismatches}`,\n ...(report.evaluation\n ? [\n `Evidence kind: ${report.evaluation.evidenceKind}`,\n `Provider run eligibility: ${report.evaluation.providerRunEligibility}`,\n `Evaluation date: ${report.evaluation.controls.evaluationDate}`,\n `Evaluation seed: ${report.evaluation.controls.randomSeed}`,\n `Runtime revision: ${report.evaluation.controls.runtimeRevision}`,\n `Fixture revision: ${report.evaluation.controls.fixtureRevision} (${report.evaluation.controls.fixtureRevisionStatus})`,\n ]\n : []),\n '',\n '## Fixture Coverage',\n '',\n categories,\n '',\n '## Gate',\n '',\n ...(report.reasons.length\n ? report.reasons.map((reason) => `- ${reason}`)\n : ['- All thresholds passed.']),\n '',\n ].join('\\n');\n}\n\nexport function writeSkillEvaluationReport(\n report: SkillEvaluationReport,\n jsonPath: string,\n markdownPath?: string,\n): void {\n mkdirSync(dirname(jsonPath), { recursive: true });\n writeFileSync(jsonPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\n if (markdownPath) {\n mkdirSync(dirname(markdownPath), { recursive: true });\n writeFileSync(markdownPath, renderSkillEvaluationReport(report), 'utf8');\n }\n}\n","import { createHash } from 'crypto';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport type { AgentMode, AgentTopology, IssueQuality } from './types.js';\n\nexport interface EvaluationFixture {\n id: string;\n cohort: 'decomposable' | 'ambiguous' | 'sequential';\n prompt: string;\n}\n\nexport interface EvaluationRunResult {\n passed: boolean;\n validationCorrect?: boolean;\n wallTimeMs: number;\n totalTokens?: number;\n costUsd?: number;\n spawnCount?: number;\n route?: AgentTopology;\n issueQuality?: IssueQuality;\n conflicts?: number;\n interruptions?: number;\n unvalidatedApplications?: number;\n}\n\nexport interface EvaluationMetric extends Omit<EvaluationRunResult, 'route' | 'issueQuality'> {\n fixtureId: string;\n promptHash: string;\n cohort: EvaluationFixture['cohort'];\n mode: Extract<AgentMode, 'adaptive' | 'off'>;\n route?: AgentTopology;\n issueQuality?: IssueQuality;\n}\n\n/** Run each fixture with the single-agent control and adaptive treatment. */\nexport async function runPairedEvaluation(\n fixtures: EvaluationFixture[],\n execute: (\n fixture: EvaluationFixture,\n mode: Extract<AgentMode, 'adaptive' | 'off'>,\n ) => Promise<EvaluationRunResult>,\n outputPath: string,\n): Promise<EvaluationMetric[]> {\n const metrics: EvaluationMetric[] = [];\n for (const fixture of fixtures) {\n for (const mode of ['off', 'adaptive'] as const) {\n const result = await execute(fixture, mode);\n metrics.push({\n fixtureId: fixture.id,\n promptHash: createHash('sha256').update(fixture.prompt).digest('hex'),\n cohort: fixture.cohort,\n mode,\n ...result,\n });\n }\n }\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(\n outputPath,\n `${metrics.map((metric) => JSON.stringify(metric)).join('\\n')}\\n`,\n 'utf8',\n );\n return metrics;\n}\n\nexport function evaluateSuccess(metrics: EvaluationMetric[]): {\n successful: boolean;\n reasons: string[];\n} {\n const reasons: string[] = [];\n const byMode = (cohorts: EvaluationFixture['cohort'][], mode: EvaluationMetric['mode']) =>\n metrics.filter((metric) => cohorts.includes(metric.cohort) && metric.mode === mode);\n const rate = (items: EvaluationMetric[]) =>\n items.length === 0 ? 0 : items.filter((item) => item.passed).length / items.length;\n const median = (values: number[]) => {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((left, right) => left - right);\n return sorted[Math.floor(sorted.length / 2)];\n };\n\n const treatment = byMode(['decomposable', 'ambiguous'], 'adaptive');\n const control = byMode(['decomposable', 'ambiguous'], 'off');\n const passGain = rate(treatment) - rate(control);\n const treatmentWall = median(treatment.map((item) => item.wallTimeMs));\n const controlWall = median(control.map((item) => item.wallTimeMs));\n if (passGain < 0.05 && !(passGain >= 0 && treatmentWall <= controlWall * 0.8)) {\n reasons.push('Decomposable/ambiguous cohort missed the pass-rate or wall-time target.');\n }\n\n const sequentialTreatment = byMode(['sequential'], 'adaptive');\n const sequentialControl = byMode(['sequential'], 'off');\n if (rate(sequentialTreatment) < rate(sequentialControl) - 0.02) {\n reasons.push('Sequential cohort regressed by more than two pass-rate points.');\n }\n\n const adaptiveTokens = median(\n metrics.filter((item) => item.mode === 'adaptive').map((item) => item.totalTokens ?? 0),\n );\n const controlTokens = median(\n metrics.filter((item) => item.mode === 'off').map((item) => item.totalTokens ?? 0),\n );\n if (controlTokens > 0 && adaptiveTokens >= controlTokens * 3) {\n reasons.push('Median adaptive token overhead is not below 3x.');\n }\n if (metrics.some((item) => (item.unvalidatedApplications ?? 0) > 0)) {\n reasons.push('At least one unvalidated patch was applied.');\n }\n return { successful: reasons.length === 0, reasons };\n}\n"],"mappings":"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","names":["createHash","mkdirSync","writeFileSync","dirname","median"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applySettingsEnvOverrides,
|
|
3
|
+
emptyWorkspaceProviderGate,
|
|
4
|
+
formatIgnoredWorkspaceSandboxKey,
|
|
5
|
+
ignoredWorkspaceSandboxKeys,
|
|
6
|
+
isUserSettingsFile,
|
|
7
|
+
loadSettingsFile,
|
|
8
|
+
mergeSettings,
|
|
9
|
+
migrateLegacyPermissions,
|
|
10
|
+
resolveSettings,
|
|
11
|
+
resolveSettingsWithProviderGate,
|
|
12
|
+
settingsLayerPaths,
|
|
13
|
+
startupAnimationEnvNote,
|
|
14
|
+
workspaceLayerThatEnabledSandbox
|
|
15
|
+
} from "./chunk-UCFJ43OS.js";
|
|
16
|
+
import "./chunk-HOZXKOE3.js";
|
|
17
|
+
import "./chunk-4DKHLZRI.js";
|
|
18
|
+
import "./chunk-OJBMDM5H.js";
|
|
19
|
+
import "./chunk-YIL6HTJX.js";
|
|
20
|
+
import "./chunk-EEX6QNXV.js";
|
|
21
|
+
import "./chunk-MV5PQNIA.js";
|
|
22
|
+
import "./chunk-B5FC3MYZ.js";
|
|
23
|
+
import "./chunk-WV3O5PGX.js";
|
|
24
|
+
import "./chunk-HFB74CLM.js";
|
|
25
|
+
import "./chunk-REASC2QG.js";
|
|
26
|
+
import "./chunk-IDYWN37T.js";
|
|
27
|
+
import "./chunk-ZPSZZUWF.js";
|
|
28
|
+
export {
|
|
29
|
+
applySettingsEnvOverrides,
|
|
30
|
+
emptyWorkspaceProviderGate,
|
|
31
|
+
formatIgnoredWorkspaceSandboxKey,
|
|
32
|
+
ignoredWorkspaceSandboxKeys,
|
|
33
|
+
isUserSettingsFile,
|
|
34
|
+
loadSettingsFile,
|
|
35
|
+
mergeSettings,
|
|
36
|
+
migrateLegacyPermissions,
|
|
37
|
+
resolveSettings,
|
|
38
|
+
resolveSettingsWithProviderGate,
|
|
39
|
+
settingsLayerPaths,
|
|
40
|
+
startupAnimationEnvNote,
|
|
41
|
+
workspaceLayerThatEnabledSandbox
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=settings-loader-KDBH45AQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
normalizeRemovedSettings,
|
|
7
7
|
readSettingsDocumentForNotices,
|
|
8
8
|
removedAuthStoreNotice
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-HOZXKOE3.js";
|
|
10
10
|
export {
|
|
11
11
|
REMOVED_AUTH_STORE_FILENAME,
|
|
12
12
|
collectRemovedEnvNotices,
|
|
@@ -16,4 +16,4 @@ export {
|
|
|
16
16
|
readSettingsDocumentForNotices,
|
|
17
17
|
removedAuthStoreNotice
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=settings-removed-
|
|
19
|
+
//# sourceMappingURL=settings-removed-3ATWJEF3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GIT_BASH_COMMAND_VARIABLE,
|
|
3
|
+
GIT_BASH_EVAL_SCRIPT,
|
|
4
|
+
decodePowerShellCommand,
|
|
5
|
+
describeShell,
|
|
6
|
+
encodePowerShellCommand,
|
|
7
|
+
isGitBash,
|
|
8
|
+
readsSingleQuoteAsPosix,
|
|
9
|
+
receivesCommandOutOfBand,
|
|
10
|
+
resolveShell,
|
|
11
|
+
shellExecution,
|
|
12
|
+
shellPromptLine,
|
|
13
|
+
singleQuoteHint,
|
|
14
|
+
spawnCommandExecution
|
|
15
|
+
} from "./chunk-W7SLYS3M.js";
|
|
16
|
+
export {
|
|
17
|
+
GIT_BASH_COMMAND_VARIABLE,
|
|
18
|
+
GIT_BASH_EVAL_SCRIPT,
|
|
19
|
+
decodePowerShellCommand,
|
|
20
|
+
describeShell,
|
|
21
|
+
encodePowerShellCommand,
|
|
22
|
+
isGitBash,
|
|
23
|
+
readsSingleQuoteAsPosix,
|
|
24
|
+
receivesCommandOutOfBand,
|
|
25
|
+
resolveShell,
|
|
26
|
+
shellExecution,
|
|
27
|
+
shellPromptLine,
|
|
28
|
+
singleQuoteHint,
|
|
29
|
+
spawnCommandExecution
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=shell-selection-Z5WORZU4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|