@kodax-ai/kodax 0.7.97-alpha.4 → 0.7.97-alpha.6

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.
Files changed (96) hide show
  1. package/CHANGELOG.md +72 -1
  2. package/README.md +31 -4
  3. package/README_CN.md +24 -2
  4. package/dist/chunks/{agent-QPYNXWUF.js → agent-Z2YSHTJ5.js} +1 -1
  5. package/dist/chunks/argument-completer-MHCQY5C7.js +2 -0
  6. package/dist/chunks/{chunk-NGFXDSP2.js → chunk-A3YY6JUN.js} +2 -2
  7. package/dist/chunks/{chunk-4HSDJRRJ.js → chunk-DTG3ZF5R.js} +2 -2
  8. package/dist/chunks/{chunk-SLOIHXD6.js → chunk-MRZ223W7.js} +1 -1
  9. package/dist/chunks/{chunk-JRHESXS5.js → chunk-MWIDZ2GQ.js} +2 -2
  10. package/dist/chunks/{chunk-4BYTAJU4.js → chunk-NOJ3W5PC.js} +1 -1
  11. package/dist/chunks/{chunk-BBF5A5BT.js → chunk-PRQEFTX5.js} +1 -1
  12. package/dist/chunks/{chunk-D2WGP3VS.js → chunk-QFIMF7II.js} +2 -2
  13. package/dist/chunks/{chunk-62IOXGHA.js → chunk-R7YXI7AB.js} +137 -137
  14. package/dist/chunks/chunk-RLINWRJJ.js +351 -0
  15. package/dist/chunks/{chunk-4VCYZ2PV.js → chunk-RRCIJ234.js} +2 -2
  16. package/dist/chunks/{chunk-ULYEFYIV.js → chunk-SQONUELA.js} +1 -1
  17. package/dist/chunks/{chunk-KXRII4QU.js → chunk-SR67IEBP.js} +1 -1
  18. package/dist/chunks/{chunk-3XIY3OYT.js → chunk-UGNSAKIT.js} +1 -1
  19. package/dist/chunks/{chunk-62V3CQH4.js → chunk-UHC66D7T.js} +142 -142
  20. package/dist/chunks/{chunk-2E3TJ7KO.js → chunk-VT6MCIE5.js} +1 -1
  21. package/dist/chunks/{chunk-7VOTRMUH.js → chunk-WILX5FJH.js} +15 -15
  22. package/dist/chunks/{chunk-6ERRCDWZ.js → chunk-WJL25O6B.js} +1 -1
  23. package/dist/chunks/{chunk-XZ7CX74A.js → chunk-WNSCGMP4.js} +1 -1
  24. package/dist/chunks/{chunk-JNSL7ADK.js → chunk-XEBZJLCW.js} +1 -1
  25. package/dist/chunks/{chunk-ZGLYGBM2.js → chunk-XL2N3RDM.js} +1 -1
  26. package/dist/chunks/{chunk-TDDCFRPG.js → chunk-XPEKJKPG.js} +1 -1
  27. package/dist/chunks/chunk-YXRXHHFQ.js +497 -0
  28. package/dist/chunks/{client-YND6BJUV.js → client-76JHO3LB.js} +1 -1
  29. package/dist/chunks/{compaction-config-6VJ7HZOV.js → compaction-config-HTYGVGD7.js} +1 -1
  30. package/dist/chunks/{construction-bootstrap-VTZJZTQ3.js → construction-bootstrap-SW7V7RX6.js} +1 -1
  31. package/dist/chunks/{dist-HFRRCJ5U.js → dist-C627SSXJ.js} +1 -1
  32. package/dist/chunks/host-LIWMO7QQ.js +2 -0
  33. package/dist/chunks/readline-helpers-WQAT4CAF.js +2 -0
  34. package/dist/chunks/{run-manager-FCHIWXXU.js → run-manager-5O53IGLW.js} +1 -1
  35. package/dist/chunks/{tool-dispatch-I4H2QSL4.js → tool-dispatch-FH6TSX64.js} +1 -1
  36. package/dist/chunks/{utils-I5Z4U76H.js → utils-RNKK4N7M.js} +1 -1
  37. package/dist/index.d.ts +19 -19
  38. package/dist/index.js +1 -1
  39. package/dist/kodax_bootstrap.js +1 -1
  40. package/dist/kodax_cli.js +1401 -1401
  41. package/dist/kodax_resume.js +31 -31
  42. package/dist/native/win32-x64/kodax-windows-sandbox.exe +0 -0
  43. package/dist/native/win32-x64/kodax-windows-text-transaction.node +0 -0
  44. package/dist/native/win32-x64/manifest.json +2 -2
  45. package/dist/sandbox-network-broker.js +85 -85
  46. package/dist/sdk-a2a.d.ts +13 -13
  47. package/dist/sdk-a2a.js +1 -1
  48. package/dist/sdk-agent.d.ts +16 -14
  49. package/dist/sdk-agent.js +1 -1
  50. package/dist/sdk-client.d.ts +6 -6
  51. package/dist/sdk-client.js +1 -1
  52. package/dist/sdk-coding.d.ts +34 -27
  53. package/dist/sdk-coding.js +1 -1
  54. package/dist/sdk-experimental-memory.d.ts +2 -2
  55. package/dist/sdk-experimental-memory.js +1 -1
  56. package/dist/sdk-mcp.d.ts +2 -2
  57. package/dist/sdk-mcp.js +1 -1
  58. package/dist/sdk-repl.d.ts +17 -17
  59. package/dist/sdk-repl.js +1 -1
  60. package/dist/sdk-runtime.d.ts +16 -14
  61. package/dist/sdk-runtime.js +1 -1
  62. package/dist/sdk-sandbox.js +1 -1
  63. package/dist/sdk-session.d.ts +7 -7
  64. package/dist/sdk-session.js +1 -1
  65. package/dist/sdk-skills.js +1 -1
  66. package/dist/semantic-worker.js +63 -63
  67. package/dist/types-chunks/{bash-prefix-extractor.d-CLq7XgO7.d.ts → bash-prefix-extractor.d-DFH463j2.d.ts} +14 -5
  68. package/dist/types-chunks/{capsule.d-CuGifYAb.d.ts → capsule.d-CwpmHGFB.d.ts} +4 -4
  69. package/dist/types-chunks/{client-contract-cQ9frDMg.d.ts → client-contract-CRm9ZpL2.d.ts} +24 -4
  70. package/dist/types-chunks/{controller.d-35RtCNle.d.ts → controller.d-B4GyqWri.d.ts} +1 -1
  71. package/dist/types-chunks/{controller.d-0iRe3htV.d.ts → controller.d-P3H97ddz.d.ts} +12 -4
  72. package/dist/types-chunks/{history-retrieval.d-DSM17KRG.d.ts → history-retrieval.d-BzKWDjzG.d.ts} +1 -1
  73. package/dist/types-chunks/{manager.d-nZ57Ps91.d.ts → manager.d-C8OlTe2J.d.ts} +4 -1
  74. package/dist/types-chunks/{manifest.d-OTRwPHVt.d.ts → manifest.d-COreAnXG.d.ts} +1 -1
  75. package/dist/types-chunks/{oauth-login.d-6i-vidxv.d.ts → oauth-login.d-DsvsksTD.d.ts} +2 -0
  76. package/dist/types-chunks/{public-api.d-TxoZttfO.d.ts → public-api.d-BLmqDi73.d.ts} +22 -4
  77. package/dist/types-chunks/{review-inbox.d-CyVNw-vt.d.ts → review-inbox.d-BTLDdpG2.d.ts} +4 -0
  78. package/dist/types-chunks/{review-packet.d-WJNbgTeP.d.ts → review-packet.d-Crra1Q7t.d.ts} +1 -1
  79. package/dist/types-chunks/{run-manager.d-CoLEnzEm.d.ts → run-manager.d-DmS1edk4.d.ts} +5 -5
  80. package/dist/types-chunks/{runtime-client-info-gOaOHxcX.d.ts → runtime-client-info-BBBxdU8V.d.ts} +2 -2
  81. package/dist/types-chunks/{sdk-session-03IR_W0n.d.ts → sdk-session-DipY_CCd.d.ts} +2 -2
  82. package/dist/types-chunks/{trusted-repl-entry-ByD3cHZk.d.ts → trusted-repl-entry-B1cb7lAn.d.ts} +7 -7
  83. package/dist/types-chunks/{types.d-CGVqYNNH.d.ts → types.d-Jxj49rqO.d.ts} +2 -2
  84. package/dist/types-chunks/{types.d-gmpRHyNp.d.ts → types.d-NyCB6ztO.d.ts} +1 -1
  85. package/dist/types-chunks/{utils.d-CuYGalHn.d.ts → utils.d-Bt6USYa5.d.ts} +6 -6
  86. package/docs/CLIENT_CONTRACT.md +11 -2
  87. package/docs/SDK_MIGRATION.md +19 -1
  88. package/docs/SPACE_SDK_SEAMS.md +16 -2
  89. package/package.json +2 -2
  90. package/public_docs/README.md +5 -2
  91. package/public_docs/sdk/embedder-guide.md +96 -6
  92. package/dist/chunks/argument-completer-LLTQJ3AO.js +0 -2
  93. package/dist/chunks/chunk-DN4GBWSU.js +0 -351
  94. package/dist/chunks/chunk-TOHJOSAB.js +0 -497
  95. package/dist/chunks/host-Z66YR63P.js +0 -2
  96. package/dist/chunks/readline-helpers-4CJH55V7.js +0 -2
package/CHANGELOG.md CHANGED
@@ -8,11 +8,82 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  ---
10
10
 
11
+ ## [0.7.97-alpha.6] - 2026-10-15
12
+
13
+ Sixth alpha of the v0.7.97 line: shared-Host startup runs historical child
14
+ recovery once under the owner fences and projects canonical Actor metadata
15
+ during preflight, and `kodax -r`/Host/SDK Session lists order by genuine
16
+ recent message activity with an optional `lastMessageAt`. New REPL Sessions
17
+ stay Host-local drafts until their first accepted input is saved (Issue 368),
18
+ restored views preserve user image attachments, and concurrent resume
19
+ launchers recover from transient inspection conflicts while refreshing an
20
+ older Host (Issue 369). Every v0.7.96 stable and v0.7.97-alpha.1 through
21
+ alpha.5 contract is retained. npm publication remains a manual maintainer
22
+ action.
23
+
24
+ ### Fixed
25
+
26
+ - Retry transient initialization and read-only inspection failures during concurrent CLI/SDK Host refresh after releasing temporary clients. Account for slow preflight duration in contention backoff, retain the original deadline, and never replay shutdown or business requests (Issue 369).
27
+ - Avoid repeated historical process sweeps during shared-Host startup and exit. Recover under the Host/storage owner fences, retain exact local-child final cleanup, batch Windows identity observations, and read canonical Actor metadata for preflight without materializing Session transcripts.
28
+ - Order `kodax -r`, Host and SDK Session lists by genuine recent message activity. Preserve creation time, compaction/fork provenance and metadata-only writes; expose optional `lastMessageAt`, retain creation-based `before`, and continue new cursors after anchor deletion or activity changes.
29
+ - Keep new REPL Sessions as Host-local drafts until the first accepted user input is saved. Preserve draft settings and Actor CAS in memory, avoid empty history records after exit or rejected input, and persist settings on admission. CLI requires `sessionDrafts:1`; explicit durable SDK creation keeps its existing semantics.
30
+ - Save initial draft inputs and settings before low-level Runs dispatch, preserve settings after restart, and reuse canonical inputs when retrying failed promotion instead of duplicating them.
31
+ - Declare `relationship_scan.depth` as an integer range from 1 to 3 for cross-protocol tool schema compatibility, preserving numeric inputs and stream completion checks.
32
+ - Preserve user image references when restoring canonical accepted inputs into the public Session view. Resolve attachments by the original inputId, retaining item identity, order and text, including repeated identical prompts with different images.
33
+
34
+ ---
35
+
36
+ ## [0.7.97-alpha.5] - 2026-10-13
37
+
38
+ Fifth alpha of the v0.7.97 line: FEATURE_301's unified Artifact SDK and
39
+ format backends ship — the `ArtifactExecutionPort` seam grows to nine
40
+ public operations with native PDF, exact PNG/JPEG/WebP/SVG, candidate DOCX
41
+ pagination, and local HTML/SMIL evidence over one execution port serving
42
+ independent Node and shared-Host clients — and busy daemon preflights are
43
+ bounded before redundant full state scans (Issue 367). Every v0.7.96
44
+ stable and v0.7.97-alpha.1 through alpha.4 contract is retained. npm
45
+ publication remains a manual maintainer action.
46
+
47
+ ### Added
48
+
49
+ - Unified optional Artifact SDK (developed in `27d08788`): public
50
+ `prepare` and `readEvidence`, native PDF, exact PNG and JPEG/WebP/SVG evidence,
51
+ candidate DOCX pagination, local HTML loaded-view capture and SVG SMIL samples.
52
+ The same execution port serves independent Node and existing shared-Host clients.
53
+
54
+ ### Changed
55
+
56
+ - Artifact contracts use content formats, structured capabilities, file/surface
57
+ provenance, kind-matched capture locators, PNG dimensions and paginated layout.
58
+ These pre-release changes have no legacy aliases. Shared-Host image bytes use
59
+ existing attachment reads; core startup does not load optional renderers.
60
+ - SDK, Client/Space integration, migration, architecture and feature documents
61
+ distinguish source support from released packages and evidence readiness from
62
+ visual approval. See [support and limits](docs/ARTIFACT_SDK.md).
63
+
64
+ ### Fixed
65
+
66
+ - Mixed-size PDF viewport cropping, DOCX rendering without optional settings,
67
+ cross-bundle admitted fixed-argv authority and Host tool image attachment delivery.
68
+ - Daemon preflight rejects known in-flight mutations before redundant full state
69
+ scans, and reports the actual method/count using the existing shutdown fence
70
+ (Issue 367). A mutation beginning during a read also stops further scans;
71
+ busy work is never treated as safe to stop.
72
+
73
+ Validation: 16,589 tests passed, with package/bundle/native/type checks recorded
74
+ in the [regression guide](docs/test-guides/FEATURE_301_v0.7.97_TEST_GUIDE.md).
75
+ Natural-task GLM/DeepSeek smoke observed automatic image review, but full
76
+ repair/re-review/delivery has not passed all checks. Native DOCX fidelity and
77
+ model-facing schema gaps remain open; see [E2E evidence](docs/research/automatic-visual-review-e2e-2026-10-13.md).
78
+
79
+ ---
80
+
11
81
  ## [0.7.97-alpha.4] - 2026-10-12
12
82
 
13
83
  Fourth alpha of the v0.7.97 line: FEATURE_301 adds the independent
14
84
  `@kodax-ai/artifacts` package — PPTX authoring, bounded editing, and
15
- current-file visual evidence through LibreOffice/PDF rendering — with an
85
+ current-file visual evidence through lightweight rendering (optional
86
+ LibreOffice/PDF conversion) — with an
16
87
  optional managed KodaX adapter, and retires the out-of-band Sidecar
17
88
  Verifier in favor of evidence-based in-run result review with the
18
89
  `visual-review` builtin skill. Every v0.7.96 stable and
package/README.md CHANGED
@@ -775,7 +775,7 @@ physical summary call.
775
775
 
776
776
  **v0.7.97-alpha.4 release:** Adds the independent `@kodax-ai/artifacts`
777
777
  package — PPTX authoring, bounded editing, and current-file visual
778
- evidence through LibreOffice/PDF rendering — with an optional managed
778
+ evidence through lightweight rendering (optional LibreOffice/PDF conversion) — with an optional managed
779
779
  KodaX adapter (FEATURE_301), and retires the out-of-band Sidecar
780
780
  Verifier: the main agent now verifies requested requirements with actual
781
781
  tool and rendered evidence before delivery, guided by the `visual-review`
@@ -789,6 +789,33 @@ starts, upgrades, or waits. See
789
789
  Every v0.7.96 stable and v0.7.97-alpha.1/alpha.2/alpha.3 contract is
790
790
  retained.
791
791
 
792
+ **v0.7.97-alpha.6 release:** Streamlines shared-Host startup — historical
793
+ child recovery runs once under the owner fences and preflight projects
794
+ canonical Actor metadata without loading transcripts — and orders `kodax -r`,
795
+ Host, and SDK Session lists by genuine recent message activity with an
796
+ optional `lastMessageAt`. New REPL Sessions stay Host-local drafts until the
797
+ first accepted input is saved (Issue 368, the CLI requires `sessionDrafts:1`),
798
+ restored views preserve user image attachments, and concurrent resume
799
+ launchers recover from transient inspection conflicts while refreshing an
800
+ older Host without replaying shutdown or business requests (Issue 369). See
801
+ the [v0.7.97-alpha.6 release notes](docs/release.md#v0797-alpha6-release-preparation).
802
+ Every v0.7.96 stable and v0.7.97-alpha.1 through alpha.5 contract is
803
+ retained.
804
+
805
+ **v0.7.97-alpha.5 release:** Ships FEATURE_301's unified Artifact SDK and
806
+ format backends — nine SDK operations (`prepare`, `readEvidence`,
807
+ capabilities/diagnostics), native PDF, exact PNG/JPEG/WebP/SVG, candidate
808
+ DOCX pagination and local HTML/SMIL capture through the same
809
+ Node/shared-Host contract — plus a bounded busy daemon preflight (Issue
810
+ 367) that stops redundant scans when a mutation begins mid-read. Rendering
811
+ works headlessly; automatic review needs available tools and an
812
+ image-capable provider, without a slash command. Native DOCX fidelity and
813
+ full natural-task repair/re-review/delivery remain unverified. See
814
+ [SDK support, setup and migration](docs/ARTIFACT_SDK.md) and the
815
+ [v0.7.97-alpha.5 release notes](docs/release.md#v0797-alpha5-release-preparation).
816
+ Every v0.7.96 stable and v0.7.97-alpha.1 through alpha.4 contract is
817
+ retained.
818
+
792
819
  **v0.7.97-alpha.3 release:** Lets trusted Main bound Product Workflows.
793
820
  `authorizeExecution` may return a `workflowHostPolicy` (`maxAgents`,
794
821
  `tokenBudget`) without registering credential or hostTools leases, and the
@@ -1358,7 +1385,7 @@ kodax --repo-intelligence full --repo-intelligence-trace
1358
1385
 
1359
1386
  ## Architecture
1360
1387
 
1361
- KodaX uses a **monorepo architecture** with npm workspaces. Four core packages ship in `@kodax-ai/kodax` with 13 SDK subpath exports (`/agent`, `/llm`, `/coding`, `/media`, `/repl`, `/skills`, `/mcp`, `/session`, `/client`, `/runtime`, `/sandbox`, `/a2a`, `/experimental-memory`; ADR-024 + ADR-032 + ADR-038, with ADR-036 consolidation). The independent optional `@kodax-ai/artifacts` package provides PPTX authoring, bounded editing and current-file visual evidence without adding renderers to the core bundle. Its optional KodaX bridge uses managed permissions, sandbox and cancellation. [Setup and checks](docs/test-guides/FEATURE_301_v0.7.97_TEST_GUIDE.md).
1388
+ KodaX uses a **monorepo architecture** with npm workspaces. Four core packages ship in `@kodax-ai/kodax` with 13 SDK subpath exports (`/agent`, `/llm`, `/coding`, `/media`, `/repl`, `/skills`, `/mcp`, `/session`, `/client`, `/runtime`, `/sandbox`, `/a2a`, `/experimental-memory`; ADR-024 + ADR-032 + ADR-038, with ADR-036 consolidation). The independent optional `@kodax-ai/artifacts` package adds PPTX authoring/limited edits, PDF/image/SVG evidence, candidate DOCX preview, local HTML/SMIL capture, preparation and binary evidence reading. Core startup does not load renderers; the KodaX bridge uses managed permissions, sandbox and cancellation. [SDK support and limits](docs/ARTIFACT_SDK.md).
1362
1389
 
1363
1390
  ```
1364
1391
  KodaX/
@@ -1784,7 +1811,7 @@ kodax --session my-project "Summarize it"
1784
1811
  kodax --session my-project "How should I fix the first issue?"
1785
1812
 
1786
1813
  # Session management
1787
- kodax -r # Search, page, and select a non-empty session
1814
+ kodax -r # Search and page sessions, most recent conversation first
1788
1815
  kodax -r <session-id> # Resume a known session directly
1789
1816
  kodax -r "Review runtime" # Resume a unique exact title; duplicates open the picker
1790
1817
  kodax --session list # List up to 50 non-empty sessions
@@ -2047,7 +2074,7 @@ This development tree exposes 13 SDK subpaths plus the root. Shared product
2047
2074
  applications use `@kodax-ai/kodax/client`; independent libraries and trusted Host
2048
2075
  APIs remain available through the other subpaths. See the [Client contract](docs/CLIENT_CONTRACT.md)
2049
2076
  and [SDK migration guide](docs/SDK_MIGRATION.md). This documentation was checked
2050
- against package version `0.7.97-alpha.4`; npm publication is separate from
2077
+ against package version `0.7.97-alpha.6`; npm publication is separate from
2051
2078
  the current development-tree contract.
2052
2079
 
2053
2080
  ```bash
package/README_CN.md CHANGED
@@ -304,7 +304,7 @@ SDK 系统代码契约更新,但没有放宽 shell/sandbox 的 fail-closed 边
304
304
  `data_changed` 时通过权威 delta 合并恢复;后台持久化失败会显示为诊断,不再静默丢失。
305
305
 
306
306
  **v0.7.97-alpha.4 发布**:新增独立的 `@kodax-ai/artifacts` 包——PPTX 创作、
307
- 有界编辑与当前文件视觉证据(LibreOffice/PDF 渲染),并带可选的受管 KodaX
307
+ 有界编辑与当前文件视觉证据(轻量渲染,可选 LibreOffice/PDF 转换),并带可选的受管 KodaX
308
308
  适配器(FEATURE_301);同时退役旁路 Sidecar Verifier:主 Agent 在交付前用
309
309
  真实工具与渲染证据核验每条需求,由内置 `visual-review` 技能覆盖静态、分页、
310
310
  交互与时间性表面,允许只读子评审者在同一 Run 内参与,未核验范围如实报告。
@@ -314,6 +314,26 @@ SDK 系统代码契约更新,但没有放宽 shell/sandbox 的 fail-closed 边
314
314
  [v0.7.97-alpha.4 发布清单](docs/release.md#v0797-alpha4-release-preparation)。
315
315
  所有 v0.7.96 稳定与 v0.7.97-alpha.1/alpha.2/alpha.3 契约全部保留。
316
316
 
317
+ **v0.7.97-alpha.6 发布**:精简共享 Host 启动——历史子进程恢复在 owner fence
318
+ 下只运行一次,预检投影规范 Actor 元数据而不加载 transcript;`kodax -r`、Host
319
+ 与 SDK 的 Session 列表按真实最近消息活动排序并暴露可选 `lastMessageAt`。
320
+ 新 REPL Session 在首个被接受输入保存前保持 Host 本地草稿(Issue 368,CLI 要求
321
+ `sessionDrafts:1`);恢复视图保留用户图片附件;并发 resume 启动器在刷新旧 Host
322
+ 时从瞬时检查冲突中恢复,不重放停机或业务请求(Issue 369)。
323
+ 详见 [v0.7.97-alpha.6 发布清单](docs/release.md#v0797-alpha6-release-preparation)。
324
+ 所有 v0.7.96 稳定与 v0.7.97-alpha.1 至 alpha.5 契约全部保留。
325
+
326
+ **v0.7.97-alpha.5 发布**:交付 FEATURE_301 统一 Artifact SDK 与格式后端——
327
+ 九项 SDK 操作(`prepare`、`readEvidence`、能力/诊断)、原生 PDF、精确
328
+ PNG/JPEG/WebP/SVG、DOCX 候选分页及本地 HTML/SMIL 捕获,独立 Node 与共享
329
+ Host 使用同一契约;同时为繁忙 daemon 预检加上边界(Issue 367),读取途中
330
+ 出现变更即停止冗余扫描。文件渲染可无界面运行;自动审查需要可用取证工具及
331
+ 支持图片输入的模型,不要求 slash。DOCX 原生保真和自然任务的完整
332
+ 修复/复查/交付仍未全部验证。
333
+ 详见 [SDK 支持、接入与迁移](docs/ARTIFACT_SDK.md) 与
334
+ [v0.7.97-alpha.5 发布清单](docs/release.md#v0797-alpha5-release-preparation)。
335
+ 所有 v0.7.96 稳定与 v0.7.97-alpha.1 至 alpha.4 契约全部保留。
336
+
317
337
  **v0.7.97-alpha.3 发布**:让可信 Main 为产品 Workflow 设定上限。
318
338
  `authorizeExecution` 可以只返回 `workflowHostPolicy`(`maxAgents`、
319
339
  `tokenBudget`),无需注册 credential 或 hostTools lease;宿主能力升级为
@@ -1255,7 +1275,7 @@ KodaX 是基于 npm workspaces 的 TypeScript monorepo,**4 个核心 workspace
1255
1275
 
1256
1276
  KodaX 有两层结构,SDK 用户需要分开理解:
1257
1277
 
1258
- - **源码层**:4 个核心 workspace 包,另有独立可选 `@kodax-ai/artifacts`:PPTX 创作、限定编辑、当前文件渲染及四类视觉证据契约。它不增加核心 bundle 的渲染依赖;KodaX 桥接沿用受管权限、沙箱和取消。[启用与验证](docs/test-guides/FEATURE_301_v0.7.97_TEST_GUIDE.md)。
1278
+ - **源码层**:4 个核心 workspace 包,另有独立可选 `@kodax-ai/artifacts`:PPTX 创作/限定编辑,PDF/图片/SVG 取证、DOCX 轻量预览、本地网页与 SMIL 捕获,公共准备和真实图片读取。核心启动不加载渲染依赖;桥接沿用受管权限、沙箱和取消。[SDK 支持与限制](docs/ARTIFACT_SDK.md)。
1259
1279
  - **当前源码打包导出**(不表示已发布到 npm):单个 bundled 包 `@kodax-ai/kodax`,对外暴露 13 个 SDK subpath(SDK 消费者 `import` 时看到的接口)。subpath 分两种角色:
1260
1280
  - **完整包 subpath**(`/agent`、`/llm`、`/coding`、`/repl`)—— 每个 1:1 对应一个源码包,暴露完整公开 API。
1261
1281
  - **集成与窄子集 subpath**(`/media`、`/skills`、`/mcp`、`/session`、`/client`、`/runtime`、`/sandbox`、`/a2a`、`/experimental-memory`)—— 聚焦能力或宿主集成边界;`/experimental-memory` 明确为 opt-in 不稳定接口。
@@ -1393,6 +1413,8 @@ stdin 并立即回到原 shell。历史回放保留每条持久 event 的原始
1393
1413
  使用 session-root Actor queue scope,避免一个 session/child 的待处理输入被另一个
1394
1414
  REPL 显示、唤醒或消费。
1395
1415
 
1416
+ 当前源码中,`kodax -r` 按最近真实对话消息排序并显示对应时间,旧记录缺少可靠消息时间时回退创建时间。SDK 的 `lastMessageAt`、Host 列表与选择器共用规则;标题、设置、Actor 保存和压缩不刷新对话时间。共享 Host 在取得所有权后统一恢复历史进程,连接客户端不重复清扫;加载提示继续使用统一启动进度契约。
1417
+
1396
1418
  **外部 Agent SDK plane(FEATURE_258,v0.7.67)**:`/agent` 导出协议中立的 executor、registration、policy、credential broker、artifact policy、catalog 和 durable task 契约;`/runtime` 通过 `admin.agentRegistrations`、`agents`、`agentTasks` 向 embedded 与 daemon client 提供同一组 DTO API。Executor factory 是宿主函数,只能装入 inline owner,或在创建新的 in-process daemon owner 时装入;不能通过既有 daemon 连接或 Runtime Worker 边界注入。Plane 关闭后是终态:未完成的 wait 和后续所有服务调用都会拒绝;受限 Workflow 脚本会完整校验并传递 `phase` 与外部 `target`。完整所有权、注册、preflight、启动/等待/继续/取消/对账和安全边界见 [SDK Embedder Guide §18](public_docs/sdk/embedder-guide.md#18-external-agent-executor-plane-feature_258-v0767)。
1397
1419
 
1398
1420
  **成本受控 Workflow SDK(FEATURE_259,v0.7.67)**:SDK 调用方用 run-scoped `modelTiers` 与 `workflow.maxConcurrency` 配置路由和并发,workflow 作者只表达 `fast` / `balanced` / `deep` 语义意图。terminal workflow event 回显 tier/source/fallback/usage/duration,持久化 `run.json.efficiencyReport` 给出 token coverage、role/tier 启动数、packet-read 拓扑、review wave 和 quality gate 结果。完整配置与遥测读取方式见 [SDK Embedder Guide §20](public_docs/sdk/embedder-guide.md#20-cost-disciplined-workflow-routing-and-telemetry-feature_259-v0767)。
@@ -1,2 +1,2 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{Aa as e,Ba as f,Ra as g,Ta as h,mb as i,nb as j,wb as k,za as d}from"./chunk-NGFXDSP2.js";import{a as c}from"./chunk-ULYEFYIV.js";import"./chunk-V26LAWJY.js";import"./chunk-7VOTRMUH.js";import"./chunk-62IOXGHA.js";import"./chunk-6ERRCDWZ.js";import"./chunk-3XIY3OYT.js";import{Rb as a,Sb as b}from"./chunk-62V3CQH4.js";import"./chunk-YVBBU6K5.js";import"./chunk-2AM3FRQ7.js";import"./chunk-ONUPGMER.js";export{e as bucketProviderPayloadSize,g as buildAutoRepoIntelligenceContext,f as checkPromiseSignal,b as cleanupIncompleteToolCalls,h as describeTransientProviderRetry,c as emitResilienceDebug,d as estimateProviderPayloadBytes,k as runKodaX,j as saveRequiredSessionSnapshot,i as saveSessionSnapshot,a as validateAndFixToolHistory};
2
+ import{Aa as e,Ba as f,Ra as g,Ta as h,mb as i,nb as j,wb as k,za as d}from"./chunk-A3YY6JUN.js";import{a as c}from"./chunk-SQONUELA.js";import"./chunk-V26LAWJY.js";import"./chunk-WILX5FJH.js";import"./chunk-R7YXI7AB.js";import"./chunk-WJL25O6B.js";import"./chunk-UGNSAKIT.js";import{Tb as a,Ub as b}from"./chunk-UHC66D7T.js";import"./chunk-YVBBU6K5.js";import"./chunk-2AM3FRQ7.js";import"./chunk-ONUPGMER.js";export{e as bucketProviderPayloadSize,g as buildAutoRepoIntelligenceContext,f as checkPromiseSignal,b as cleanupIncompleteToolCalls,h as describeTransientProviderRetry,c as emitResilienceDebug,d as estimateProviderPayloadBytes,k as runKodaX,j as saveRequiredSessionSnapshot,i as saveSessionSnapshot,a as validateAndFixToolHistory};
@@ -0,0 +1,2 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{$a as a,ab as b}from"./chunk-QFIMF7II.js";import"./chunk-ZQYWDI4O.js";import"./chunk-MWIDZ2GQ.js";import"./chunk-VT6MCIE5.js";import"./chunk-RRCIJ234.js";import"./chunk-A3YY6JUN.js";import"./chunk-SQONUELA.js";import"./chunk-NOJ3W5PC.js";import"./chunk-V26LAWJY.js";import"./chunk-DTG3ZF5R.js";import"./chunk-WILX5FJH.js";import"./chunk-R7YXI7AB.js";import"./chunk-WJL25O6B.js";import"./chunk-UGNSAKIT.js";import"./chunk-UHC66D7T.js";import"./chunk-YVBBU6K5.js";import"./chunk-2AM3FRQ7.js";import"./chunk-ONUPGMER.js";export{a as ArgumentCompleter,b as createArgumentCompleter};
@@ -1,5 +1,5 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{A as Hn,D as Bn,G as Wa,H as za,a as G,b as Ma,c as Oa,d as Na,e as tr,f as Ct,g as K,h as Da,i as nr,j as La,k as or,l as rr,m as $a,n as et,o as tt,p as Fa,q as It,r as ir,s as Ua,t as ja,u as Ha,v as Ba,x as Ka}from"./chunk-ULYEFYIV.js";import{a as qa}from"./chunk-V26LAWJY.js";import{e as Ea,k as _a,m as Aa,n as Pa,q as Ga,r as Xa,s as Va,t as Ya,z as Qa}from"./chunk-7VOTRMUH.js";import{Ad as Ta,Ca as ta,Ea as na,Ha as Ln,Ja as oa,Nb as ua,T as Xs,Ta as ra,Td as ba,U as Vo,Ud as jn,V as Vs,W as Ys,Wd as wa,X as Yo,Xb as Un,Y as Qs,Z as Js,Za as ia,_b as ma,a as ne,ab as sa,ba as Zs,bc as fa,ca as ea,eb as $n,ee as ka,fb as Fn,ge as Ra,ib as aa,ja as Dn,kc as pa,lb as ca,lc as ga,mb as da,me as er,nb as la,ne as Sa,oe as Ca,pc as ha,pe as Ia,q as Nn,qc as Qo,rc as ya,rd as xa,u as Bs,vd as Jo,w as qs,wd as Zo,x as Ks,xd as va,yd as U,zd as en}from"./chunk-62IOXGHA.js";import{f as Ws,g as zs,h as Gs}from"./chunk-6ERRCDWZ.js";import{$f as $s,Ad as gs,Ae as Rs,Af as Es,Bd as hs,Bf as _s,Ca as os,Cd as ys,Cf as As,Da as Uo,Dd as xs,Ed as qo,Ef as Ps,Ff as Ms,Gd as vs,Gf as Os,Hf as Ns,Kf as Ds,La as wt,Lf as Zt,Mf as Mn,Pd as kt,Rb as Ze,Sa as Yt,Sb as Qt,Ta as In,Vb as cs,Wa as En,_f as Ls,bc as ds,bd as ls,be as Pn,bg as Fs,ce as Rt,dg as Go,ee as St,ef as Wo,eg as Xo,f as $e,fd as Jt,g as zt,ge as Ts,he as bs,j as Zi,jg as Us,k as D,l as Gt,md as _n,mf as zo,na as es,nd as An,o as _e,q as ge,qf as Ss,r as Xt,s as Vt,sc as Bo,sd as us,t as Je,td as ms,ud as fs,ug as js,v as _,va as ts,vg as Hs,wa as ns,wf as Cs,x as Cn,xd as ps,xe as Ko,xf as Is,xg as On,ye as ws,ze as ks}from"./chunk-62V3CQH4.js";import{F as Ho,b as rs,d as is,e as ss,j as as,l as jo}from"./chunk-YVBBU6K5.js";import{$a as Xi,Aa as bt,Ab as Qi,B as Oo,Ba as No,Bb as $o,Ca as zi,Cb as Fo,Da as Do,Eb as Ji,Sa as Gi,U as Le,V as ji,Z as Hi,f as Fi,ga as Bi,ia as Sn,ib as Vi,ja as qi,m as vt,ma as Tt,mb as Wt,s as Qe,t as Rn,u as Bt,v as qt,va as Ki,vb as Lo,x as Ui,ya as Kt,za as Wi,zb as Yi}from"./chunk-2AM3FRQ7.js";import{a as i}from"./chunk-ONUPGMER.js";import{randomUUID as jl}from"node:crypto";var vu={plan:"Read-only planning. Do not perform ordinary file mutations.","accept-edits":"Text edits use host write roots. External operations require explicit host authorization.",auto:"Auto[LLM] reviews operations requiring host authorization. An allow applies only to that exact operation and target; it is not a directory-wide grant.","full-access":"Ordinary local text targets may be outside the workspace. Shell runs on the host without sandbox or approval prompts."};function qn(e,t){let n=t?.resolveShellPermissionMode?.();return n===void 0?e:`${e}
2
+ import{A as Hn,D as Bn,G as Wa,H as za,a as G,b as Ma,c as Oa,d as Na,e as tr,f as Ct,g as K,h as Da,i as nr,j as La,k as or,l as rr,m as $a,n as et,o as tt,p as Fa,q as It,r as ir,s as Ua,t as ja,u as Ha,v as Ba,x as Ka}from"./chunk-SQONUELA.js";import{a as qa}from"./chunk-V26LAWJY.js";import{e as Ea,k as _a,m as Aa,n as Pa,q as Ga,r as Xa,s as Va,t as Ya,z as Qa}from"./chunk-WILX5FJH.js";import{Ad as Ta,Ca as ta,Ea as na,Ha as Ln,Ja as oa,Nb as ua,T as Xs,Ta as ra,Td as ba,U as Vo,Ud as jn,V as Vs,W as Ys,Wd as wa,X as Yo,Xb as Un,Y as Qs,Z as Js,Za as ia,_b as ma,a as ne,ab as sa,ba as Zs,bc as fa,ca as ea,eb as $n,ee as ka,fb as Fn,ge as Ra,ib as aa,ja as Dn,kc as pa,lb as ca,lc as ga,mb as da,me as er,nb as la,ne as Sa,oe as Ca,pc as ha,pe as Ia,q as Nn,qc as Qo,rc as ya,rd as xa,u as Bs,vd as Jo,w as qs,wd as Zo,x as Ks,xd as va,yd as U,zd as en}from"./chunk-R7YXI7AB.js";import{f as Ws,g as zs,h as Gs}from"./chunk-WJL25O6B.js";import{Ae as ws,Be as ks,Ca as os,Cd as gs,Ce as Rs,Cf as Es,Da as Uo,Dd as hs,Df as _s,Ed as ys,Ef as As,Fd as xs,Gd as qo,Gf as Ps,Hf as Ms,Id as vs,If as Os,Jf as Ns,La as wt,Mf as Ds,Nf as Zt,Of as Mn,Rd as kt,Sa as Yt,Ta as In,Tb as Ze,Ub as Qt,Wa as En,Xb as cs,ag as Ls,bg as $s,dc as ds,dd as ls,de as Pn,dg as Fs,ee as Rt,f as $e,fg as Go,g as zt,ge as St,gf as Wo,gg as Xo,hd as Jt,ie as Ts,j as Zi,je as bs,k as D,l as Gt,lg as Us,na as es,o as _e,od as _n,of as zo,pd as An,q as ge,r as Xt,s as Vt,sf as Ss,t as Je,uc as Bo,ud as us,v as _,va as ts,vd as ms,wa as ns,wd as fs,wg as js,x as Cn,xg as Hs,yf as Cs,zd as ps,ze as Ko,zf as Is,zg as On}from"./chunk-UHC66D7T.js";import{F as Ho,b as rs,d as is,e as ss,j as as,l as jo}from"./chunk-YVBBU6K5.js";import{$a as Xi,Aa as bt,Ab as Qi,B as Oo,Ba as No,Bb as $o,Ca as zi,Cb as Fo,Da as Do,Eb as Ji,Sa as Gi,U as Le,V as ji,Z as Hi,f as Fi,ga as Bi,ia as Sn,ib as Vi,ja as qi,m as vt,ma as Tt,mb as Wt,s as Qe,t as Rn,u as Bt,v as qt,va as Ki,vb as Lo,x as Ui,ya as Kt,za as Wi,zb as Yi}from"./chunk-2AM3FRQ7.js";import{a as i}from"./chunk-ONUPGMER.js";import{randomUUID as jl}from"node:crypto";var vu={plan:"Read-only planning. Do not perform ordinary file mutations.","accept-edits":"Text edits use host write roots. External operations require explicit host authorization.",auto:"Auto[LLM] reviews operations requiring host authorization. An allow applies only to that exact operation and target; it is not a directory-wide grant.","full-access":"Ordinary local text targets may be outside the workspace. Shell runs on the host without sandbox or approval prompts."};function qn(e,t){let n=t?.resolveShellPermissionMode?.();return n===void 0?e:`${e}
3
3
 
4
4
  ## Effective permissions (host authority)
5
5
  Current permission mode: ${n}
@@ -384,7 +384,7 @@ Keep every section concise.`;async function yl(e){let t=e.tokensBefore-e.tokensA
384
384
  `):void 0,lt=Dt.title||bo.slice(0,50)+(bo.length>50?"...":""),si=Dt.errorMetadata,Jl=Dt.loadedExtensionState,Zl=Dt.loadedExtensionRecords,eu=ne(e.context),wo={current:e.context?.managedProtocolEmission?.enabled?er(void 0,void 0):void 0},A=Qa({options:e,sessionId:w,runtime:a??void 0,managedProtocolPayloadRef:wo}),ai=new Map;A.writtenFiles=ai,A.actorControl!==void 0&&(A.actorTurnRef={actorPath:A.actorControl.callerPath,turnId:Z.current.turnId}),await Un(A,b);let Te=A.actorControl?A.actorQueueAgentId??is(A.contextIdentitySessionId??w,A.actorControl.callerPath):void 0;Te!==void 0&&A.actorControl?.callerPath==="/root"&&(u=ss(Te));let ci=i(async g=>{let R=g.map(H=>{let pe=Ac(H.inputArtifacts);return Ho(pe??[],{provider:f.currentProviderName,model:f.currentModelOverride}),{queued:H,inputArtifacts:pe}}),C=cu(g[0]?.id);ti.current={text:g.map(H=>H.content).join(`
385
385
  `),turnId:C},A.actorControl!==void 0&&(A.actorTurnRef={actorPath:A.actorControl.callerPath,turnId:C});let X=new Date().toISOString(),S=R.map(({queued:H,inputArtifacts:pe})=>({role:"user",content:ot(H.content,pe),...H.inputId!==void 0?{inputId:H.inputId}:{},turnId:C,timestamp:X})),N=b.length;b.push(...S);try{let H=bt(S);H&&await H,e.session?.persistedByHost===!1&&await Yr(e,w,{messages:b,title:lt,gitRoot:e.context?.gitRoot??void 0,runtimeSessionState:L})}catch(H){throw b.splice(N,S.length),H}return S},"appendInterruptPrompts"),Ke=i(async g=>{let R=e.context?.interruptInput;if(!R)return!1;let C=rs(),X={agentId:Te,maxPriority:"user",mode:"prompt",predicate:as(C.getSnapshot(),Te)},S=R.consumePendingInputs&&Te===void 0?[]:C.peek(X),N=i((re,F)=>{if(re.length===0)return;let $t={};re.forEach((le,We)=>{let mt=Ds(F[We]);mt!==void 0&&($t[le.id]=mt)}),h.onMidTurnUserMessages?.(re.map(le=>le.content),{queuedMessageIds:re.map(le=>le.id),queuedMessageEntryIds:$t})},"notify");if(S.length>0){let re=await ci(S);C.dequeue(X),N(S,re)}let H=[],pe=!g||A.actorControl&&A.actorControl.callerPath!=="/root"?[]:await R.consumePendingInputs?.(async re=>{H=await ci(re)})??[];return N(pe,H),S.length>0||pe.length>0},"consumeRuntimeInterruptInput"),O=K(b,e.context?.contextTokenSnapshot),ko=pa(a),tu=ga(ko),di=[...I?.activeTools??wa().map(g=>g.name),...ko.map(g=>g.name)],nu=e.context?.skillScriptRunner?di:di.filter(g=>g!=="run_skill_script"),fn=Xa(Ga(nu,e.context?.excludeTools),e.context?.toolVisibilityPolicy,tu),ou=fn.includes(Xs),ru=fn.includes(Ys),iu=e.session?.storage,su=ea({activeTools:fn,sessionId:w,currentAgentId:de,sessionScope:e.session?.scope,storage:iu}),L=Sl({loadedExtensionState:Jl,loadedExtensionRecords:Zl,activeTools:Zs(Yo(Vo(fn,!1),!1),su),modelSelection:{provider:f.currentProviderName,model:f.currentModelOverride},thinkingLevel:f.runtimeThinkingLevel}),pn=new Set,li=i(g=>{let R=Z.current;pn.has(R.turnId)||(pn.add(R.turnId),rr(h,R,g))},"emitLiveTurnCompletedOnce"),au=i(g=>{let R=Z.current;pn.has(R.turnId)||(pn.add(R.turnId),$a(h,R,g))},"emitLiveTurnFailedOnce"),cu=i(g=>(li("completed"),Z.current=nr({sessionId:w,deliveryKind:"queued",promptId:g,contextId:qe.contextId,contextKind:qe.contextKind,parentContextId:qe.parentContextId,agentId:qe.agentId,ownsContextRevision:qe.ownsContextRevision}),or(h,Z.current),Z.current.turnId),"startQueuedLiveTurn"),fe,Pe,ui=[],mi=i(async g=>{let R=er(g.managedProtocolPayload,wo.current),C=go(L,{includeUnchanged:!1}),X=Fo(f.costTracker),S={...g,...f.usageComplete&&X.callCount>0?{usage:{inputTokens:X.totalInputTokens,outputTokens:X.totalOutputTokens,totalTokens:X.totalInputTokens+X.totalOutputTokens,...X.totalCacheReadTokens>0?{cachedReadTokens:X.totalCacheReadTokens}:{},...X.totalCacheWriteTokens>0?{cachedWriteTokens:X.totalCacheWriteTokens}:{}}}:{},writtenFiles:[...ai.values()],...R?{managedProtocolPayload:R}:{},...C?{runtimeSessionSnapshot:C}:{}};if(await an(e,async()=>{if(fe!==void 0&&await gh(fe,S,w,ui),e.context?.completeLearnedSkillOutcomes!==void 0){let N=Er(S.artifactLedger??[]);try{await e.context.completeLearnedSkillOutcomes({sessionId:w,outcome:wd(S.success,N),evidenceRefs:N.length>0?N.map(H=>H.ref):[`host:run-terminal:${w}`]})}catch(H){G("[learning:skill-outcome:error]",{error:H instanceof Error?H.message:String(H)})}}try{await mn?.release()}catch(N){G("[learning:skill-binding-release:error]",{error:N instanceof Error?N.message:String(N)})}}),ye!==void 0){let N=ye;To=To.then(()=>Cr(e,Re,N,"",Date.now()+15e3,ni).then(()=>{})).catch(H=>{G("[memory:review-inbox:drain-error]",{error:H instanceof Error?H.message:String(H)})})}return S},"finalizeManagedProtocolResult"),Se=i(async g=>{let R=await mi(g);try{ir(h)}catch{_({source:"coding:completion-observer",level:"warn",message:"Completion observer failed after result finalization."})}return li(R.interrupted?"interrupted":"completed"),R},"finalizeCompletedProtocolResult");e.sessionControl?._attach({setProvider:i(g=>{L.modelSelection.provider=g},"setProvider"),setModel:i(g=>{L.modelSelection.model=g,e.model=g,e.modelOverride=g},"setModel"),setReasoning:i((g,R)=>{L.thinkingLevel=R===void 0?oh(g):R.effort??Le(Zn({...e,...R,reasoningMode:g}))},"setReasoning")});let fi=a?.bindController?.(Ll(L));l=typeof fi=="function"?fi:void 0;let du=$n(e.context?.repoIntelligenceMode),lu=Fn(e.context?.repoIntelligenceMode),uu=e.context?.repoRoutingSignals?Promise.resolve(e.context.repoRoutingSignals):du!=="off"&&(e.context?.executionCwd||e.context?.gitRoot)?da({executionCwd:eu,gitRoot:e.context?.gitRoot??void 0},{mode:lu}).catch(()=>null):Promise.resolve(null),[,gn]=await Promise.all([a?.hydrateSession?.(w),uu]);cn(h,e,"routing",gn,gn?.activeModuleId?`active_module=${gn.activeModuleId}`:void 0);let ut=await Xc({...e,provider:f.currentProviderName,modelOverride:f.currentModelOverride},t,W,{recentMessages:b.slice(0,-1),sessionErrorMetadata:si,repoSignals:gn??void 0}),Lt=await lo({...e,provider:f.currentProviderName,modelOverride:f.currentModelOverride,effort:f.runtimeThinkingLevel??e.effort},f.runtimeThinkingLevel?{...ut,effort:f.runtimeThinkingLevel}:ut,b.length===1),hn=0,yn=[];if(ye!==void 0&&Nt!==void 0){let g=ye,R=Nt;fe=await an(e,()=>Gs({controlPlane:g,initialMemoryPack:R,sourcePolicy:Ed,...e.memoryRecallRunner!==void 0?{recallRunner:e.memoryRecallRunner}:{},persistOutcomeDigest:i(async C=>{if(C.visibility==="prompt_safe"&&e.session?.storage!==void 0&&vo!==void 0){ni=(await bs(Re,C,{expectedBranchEpoch:vo,persistOwner:i(async S=>so(e,w,C,{jobId:S.jobId}),"persistOwner")})).entry.jobId;return}await so(e,w,C)},"persistOutcomeDigest"),...e.session?.storage===void 0&&e.memoryReviewer!==void 0?{reviewEpisode:i(async(C,X)=>{if(ye===void 0)return;let S=await ye.reviewEpisode(C,X);X.aborted||(h.onMemoryReviewReceipt?.({sessionId:w,reviewKey:C.reviewKey,proposalIds:S.proposalIds,completedAt:new Date().toISOString()}),S.appliedProposalIds.length>0&&h.onMemoryNotice?.({sessionId:w,episodeId:C.id,summaries:S.decisions.filter(N=>N.proposalId!==void 0&&S.appliedProposalIds.includes(N.proposalId)).map(N=>S.plan.actions[N.actionIndex]?.summary).filter(N=>N!==void 0).slice(0,3),proposalIds:S.appliedProposalIds}))},"reviewEpisode")}:{},onTrace:i(C=>{if(C.type==="memory.decision"){Sd(C.receipt),G("[memory:decision]",{receiptId:C.receipt.id,policyVersion:C.receipt.policyVersion,candidateRefs:C.receipt.candidateRefs,selectedRefs:C.receipt.selectedRefs,injectedRefs:C.receipt.injectedRefs});return}G(`[memory:${C.type}]`,{key:C.key,detail:C.detail??null})},"onTrace")}).startSession({identity:Re,objective:t,episodeId:e.context?.learnedSkillBindingId??Z.current.turnId})),ou&&fe!==void 0&&(L.activeTools=Vo(L.activeTools,!0),A.memoryRecall=Vs(fe,()=>Pe===void 0?void 0:{decisionRevision:Pe.revision,...Pe.actionSignature!==void 0?{actionSignature:Pe.actionSignature}:{},throughSequence:Pe.throughSequence})),ru&&fe!==void 0&&(L.activeTools=Yo(L.activeTools,!0),A.memoryManagementIntent=Js({getCurrentUserTurn:i(()=>ti.current,"getCurrentUserTurn"),controlPlane:ye,getPresentedTargets:i(()=>Qs(b),"getPresentedTargets"),onHandledOperation:i(C=>ui.push(C),"onHandledOperation")}))}let pi=0,be=e.context?.goalRuntime,gi=i(async g=>{if(!be||g+1>=v||e.abortSignal?.aborted)return!1;await be.refresh?.();let R=be.lifecycleCtx.getGoal();return!R||R.status!=="active"||be.lifecycleCtx.hasPendingUserInput?.()?!1:(b.push({role:"user",content:be.lifecycleCtx.buildContinuationPrompt(R),_synthetic:!0,timestamp:new Date().toISOString()}),$(g)&&e.context?.interruptInput?.reopenInputWindow(),!0)},"appendGoalContinuation"),Ce,Me=i((g,R)=>(O=Ba(h,{iter:g,maxIter:v,messages:b,currentSnapshot:O,snapshotOverride:R}),O),"emitIterationEnd"),we=i(()=>ut.decision,"currentRoutingDecision"),hi=i(async g=>{e.context?.interruptInput?.closeInputWindow();let R=g instanceof Error?g:new Error(String(g)),C=ns(R);C&&(b=[...C]);let X=await Al({error:R,...Ce===void 0?{}:{safeErrorMessage:Ce.message},messages:b,errorMetadata:si,options:e,sessionId:w,title:lt,runtimeSessionState:L}),S=X.cleanedMessages,N=X.updatedErrorMetadata;if(O=X.contextTokenSnapshot,R instanceof _e||R instanceof Rn)throw R;return R.name==="AbortError"?(await Qr({events:h,emitActiveExtensionEvent:U}),Se({success:!0,lastText:f.lastText,messages:S,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,interrupted:!0,errorMetadata:N})):(Ce??=_a(R),Object.isExtensible(R)&&Object.defineProperty(R,"executionFailure",{value:Ce,enumerable:!1}),au(ph(R,Ce)),await Pl({error:R,events:h,emitActiveExtensionEvent:U}),mi({success:!1,lastText:f.lastText,messages:S,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,errorMetadata:N,...Ce===void 0?{}:{failure:Ce}}))},"finalizeCaughtError");Fa(h,{provider:W.name,sessionId:w}),await U("session:start",{provider:W.name,sessionId:w}),or(h,Z.current),h.getCostReport&&(h.getCostReport.current=()=>Ji(Fo(f.costTracker)));for(let g=0;g<v;g++){let R=Date.now();try{e.context?.interruptInput&&g+1>=y&&e.context.interruptInput.closeInputWindow();let C=Zc(L,e,te);f.currentProviderName=C.providerName,f.currentModelOverride=C.modelOverride,f.runtimeThinkingLevel=C.thinkingLevel;let X=C.provider,S=C.contextWindow,N,H=await jd({options:e,providerName:f.currentProviderName,modelOverride:f.currentModelOverride,thinkingLevel:f.runtimeThinkingLevel,reasoningPlan:ut,messages:b}),pe=H.effectiveReasoningPlan;Lt=H.currentExecution,await U("turn:start",{sessionId:w,iteration:g+1,maxIter:v}),Ha(h,g,v);let re=await Ml({provider:f.currentProviderName,model:f.currentModelOverride,reasoningMode:pe.effort,systemPrompt:Lt.systemPrompt});if(re.blockedReason)throw new Error(re.blockedReason);f.currentProviderName=re.provider,f.currentModelOverride=re.model,L.modelSelection.provider=f.currentProviderName,L.modelSelection.model=f.currentModelOverride,f.runtimeThinkingLevel=re.reasoningMode,L.thinkingLevel=f.runtimeThinkingLevel;let F=Wt(f.currentProviderName);o(F.getCapabilityProfile().transport==="native-api");let $t=bt(b);$t&&await $t,S=On(te,F,f.currentModelOverride);let le=f.runtimeThinkingLevel??pe.effort,We=f.currentModelOverride??F.getModel(),mt=Yt(f.currentProviderName,We,e.context?.configHome),yi=F.getReasoningProfile(We)?.effortStrategy;if(!(yi==="openai-chat-effort"||yi==="openai-responses-effort")&&le!==void 0&&mt.length>0){let k=Lo({provider:f.currentProviderName,model:We,desiredEffort:le}).effort;k!==void 0&&mt.includes(k)&&(le=Lo({provider:f.currentProviderName,model:We,desiredEffort:le,rejectedEfforts:mt}).effort??"none")}let ft={...Lt.providerReasoning,enabled:le!=="none",effort:le},{effectiveSystemPrompt:So}=Bd({providerName:f.currentProviderName,model:f.currentModelOverride,provider:F,prompt:t,effectiveOptions:Lt.effectiveOptions,reasoningMode:ji(le)??"auto",taskType:pe.decision.primaryTask,executionMode:pe.decision.recommendedMode,baseSystemPrompt:re.systemPrompt}),ae=qn(So,e.context);Ho(Lt.effectiveOptions.context?.inputArtifacts??[],{provider:f.currentProviderName,model:f.currentModelOverride}),Ar(F,f.currentProviderName),await U("provider:selected",{provider:f.currentProviderName,model:f.currentModelOverride});let pt=new uo,xi=pt.tracker,{resilienceCfg:gt,recoveryCoordinator:Co}=Gd(f.currentProviderName,F,xi,e.timeouts),Io=gt.requestTimeoutMs,mu=gt.streamIdleTimeoutMs,z=b,P,ue=0,vi=ya(A),Ti=Ya(L.activeTools,e.context?.repoIntelligenceMode,e.context?.managedProtocolEmission?.enabled===!0,a?.hasCapabilityProvider?.("mcp")??!!a,e.context?.toolConstructionMode,vi,e.selfManual?.productName,e.context?.agentExecutorPlane!==void 0,ko),xn=A.workflowHost?Ti:Ti.filter(k=>k.name!=="run_workflow"),ht=Z.current,Oe={contextId:ht.contextId,contextKind:ht.contextKind,...ht.parentContextId!==void 0?{parentContextId:ht.parentContextId}:{},...ht.agentId!==void 0?{agentId:ht.agentId}:{}},ze=Sn(e.disablePromptCache)?void 0:dl({logicalSessionId:ct,...de!==void 0?{agentId:de}:{}}),bi=ln({sessionId:w,turnId:Z.current.turnId,...Oe,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),profile:"report_only",contextWindow:S,systemPrompt:ae,toolDefinitions:xn,messages:z}),Ge=ul(bi),fu={...bi,profile:Ge},wi=pl({tools:xn,budget:fu,profile:Ge,bridgeAvailable:ml(xn),nativeDeferredAvailable:!1,unlockedDeferredTools:vi}),Ne=fl(xn,wi),Ft=F.getEffectiveMaxOutputTokens(f.currentModelOverride),Eo=Ft+(fe===void 0?0:Ws),pu=ln({sessionId:w,turnId:Z.current.turnId,...Oe,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),profile:Ge,contextWindow:S,systemPrompt:ae,toolDefinitions:Ne,messages:z}),ki=Math.max(Ct(b,O),pu.usedTokens),Ri,gu=js({messages:b,compactionConfig:te,contextWindow:S,currentTokens:ki,reservedResponseTokens:Eo,onPolicy:i(k=>{Ri={triggerPercent:k.config.triggerPercent,absoluteTriggerTokens:k.absoluteTriggerTokens,triggerTokens:k.triggerTokens,physicalCapacityTokens:k.physicalCapacityTokens,reservedResponseTokens:Ft,reservedMemoryTokens:Eo-Ft}},"onPolicy")}),Si={executionContext:A,messages:b,needsCompact:gu,compactConsecutiveFailures:f.compactConsecutiveFailures,compactionConfig:te,provider:F,model:f.currentModelOverride,...Oe,contextWindow:S,systemPrompt:ae,toolDefinitions:Ne,reasoning:ft,currentTokens:ki,reservedResponseTokens:Eo,events:h,compactionAntiThrash:f.compactAntiThrash,emitCompactionDiagnostics:e.context?.contextDiagnostics===!0,disablePromptCache:e.disablePromptCache,promptCacheKey:ze},yt=await Gr(Si);if(b=yt.messages,z=b,f.compactConsecutiveFailures=yt.nextCompactConsecutiveFailures,f.compactAntiThrash=yt.nextCompactionAntiThrash,yt.contextTokenSnapshot!==void 0&&(O=yt.contextTokenSnapshot),fe!==void 0){let k=bd({objective:t,decisionIntent:ut.decision.primaryTask,actionSignature:`task:${ut.decision.primaryTask}`,todoStore:A.todoStore,observationSequence:hn});Pe=k;let M=[...yn,...yt.didCompactMessages?["context_compacted"]:[]].filter((Q,ie,jt)=>jt.indexOf(Q)===ie);yn=[];try{let Q=M.length>0?await fe.intervene({decisionRevision:k.revision,objective:t,decisionContext:k.text,decisionIntent:k.decisionIntent,actionSignature:k.actionSignature,throughSequence:k.throughSequence,triggers:M,currentCandidates:k.currentCandidates,...e.abortSignal===void 0?{}:{signal:e.abortSignal}}):g>0?fe.recall({decisionRevision:k.revision,objective:t,decisionContext:k.text,decisionIntent:k.decisionIntent,actionSignature:k.actionSignature,throughSequence:k.throughSequence}):void 0;Q!==void 0&&(N=rh(Q))}catch(Q){G("[memory:intervention:error]",{error:Q instanceof Error?Q.message:String(Q)})}}ih(e.abortSignal);let Ci={...ln({sessionId:w,turnId:Z.current.turnId,...Oe,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),profile:Ge,contextWindow:S,systemPrompt:ae,toolDefinitions:Ne,messages:z,...N?.content?{pendingInput:N.content}:{},reservedResponseTokens:Ft}),profile:Ge},Ut={...tr(z),currentTokens:Math.max(Ct(z,O),Ci.usedTokens-Ci.tokenBreakdown.reservedResponse)};e.context?.contextDiagnostics===!0&&(h.onContextBudgetSnapshot!==void 0||h.onToolExposurePlanned!==void 0)&&h.onToolExposurePlanned?.({...wi,...Oe});let Ii=i((k,M=Ft)=>{if(h.onContextBudgetSnapshot!==void 0)try{h.onContextBudgetSnapshot({compactionBudget:Ri,...ln({sessionId:w,turnId:Z.current.turnId,...Oe,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),profile:Ge,contextWindow:S,systemPrompt:ae,toolDefinitions:Ne,messages:k,...N?.content?{pendingInput:N.content}:{},reservedResponseTokens:M}),profile:Ge})}catch(Q){G("[context-diagnostics:budget-callback-error]",{error:Q instanceof Error?Q.message:String(Q)})}},"emitContextBudgetSnapshot"),Ei=Z.current.turnId,_o=`output_${jl()}`,_i="append",Ie,Y=await rt(z,A,S,p),Xe=br(F,{...f.currentModelOverride!==void 0?{model:f.currentModelOverride}:{},contextWindow:S,currentTokens:Ct(Y,O)}),Ai=!1,Ao=!1;for(;;){Y=sr(Y,r),(ri!==void 0||ii)&&(Y=pc(Y,fc([ri,ii].filter(xe=>!!xe).join(`
386
386
 
387
- `),{turnId:Z.current.turnId}))),ae=qn(So,e.context),ue+=1,Ut=K(Y,Ut);let k=pt.beginAttempt(f.currentProviderName,f.currentModelOverride??F.getModel(),Y,ue,!1);Ie=k,h.onOutputSegmentStart?.({responseId:Ei,outputId:_o,providerRequestId:k,mode:_i}),_i="replace";let M=Hd({hardTimeoutMs:Io,idleTimeoutMs:mu,streamMaxDurationMs:F.getStreamMaxDurationMs?.(f.currentModelOverride)??0,callerAbortSignal:e.abortSignal}),Q=M.retryTimeoutController,ie=M.retrySignal,jt=M.resetIdleTimer,Ht=oo(Y,ae);G("[resilience:request]",{provider:f.currentProviderName,attempt:ue,fallbackActive:!1,payloadBytes:Ht,payloadBucket:ro(Ht),lastToolErrorCode:L.lastToolErrorCode,lastToolResultBytes:L.lastToolResultBytes});try{let xe=qd({configHome:e.context?.configHome,events:Ul(h,k),boundaryTracker:xi,streamTimers:M,emitActiveExtensionEvent:U,providerName:f.currentProviderName}),j=i(B=>{f.costTracker=Qi(f.costTracker,{provider:B.provider,waitMs:B.waitMs,reason:B.reason,source:B.source}),xe.onRetryAfter?.(B)},"wrappedRetryAfter");Ii(Y,Xe);let ce=fo({events:h,enabled:e.context?.contextDiagnostics===!0,provider:F,providerName:f.currentProviderName,...Oe,model:f.currentModelOverride??F.getModel(),reasoning:ft,disablePromptCache:e.disablePromptCache,system:ae,tools:Ne,messages:Y,...N!==void 0?{ephemeralSuffix:N}:{},...ze!==void 0?{promptCacheKey:ze}:{},attempt:ue});P=await vt(F.name,"primary",ie,B=>F.stream(Y,Ne,ae,ft,{...xe,rejectedReasoningEfforts:Yt(f.currentProviderName,We,e.context?.configHome),...Ao?{singleAttempt:!0}:{},promptCacheKey:ze,onRetryAfter:j,modelOverride:f.currentModelOverride,maxOutputTokensOverride:Xe,ephemeralSuffix:N,signal:B},B),Ie),po(h,ce,P.usage),b=z;break}catch(xe){let j=xe instanceof Error?xe:new Error(String(xe));if(Ao){let se=Et(j);throw Ce=Fl({error:j,errorClass:se.errorClass,requestPhase:se.failureStage,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),startedAt:pt.snapshot().startedAt}),j}if(j instanceof Rn&&!Ai&&!e.abortSignal?.aborted){Ai=!0,j.requestInputReliefTokens=Math.max(0,D(z)-D(Y));let se=Ma(z,j,S,O);S=se.capacityWindow;let Ee=await Gr({...Si,messages:z,currentTokens:se.currentTokens,contextWindow:S,needsCompact:!0}),De=D(z);if(z=Ee.messages,b=z,D(Ee.messages)>=De)throw j;O=Ee.contextTokenSnapshot??K(z,se),Ut=Ee.contextTokenSnapshot??se,f.compactConsecutiveFailures=Ee.nextCompactConsecutiveFailures,f.compactAntiThrash=Ee.nextCompactionAntiThrash,Y=await rt(z,A,S,p),Xe=br(F,{model:f.currentModelOverride,maxOutputTokens:Xe,contextWindow:S,currentTokens:Ct(Y,Ut)});continue}if(j instanceof Rn||(j=await Xd(j,Q,e.abortSignal),j.name==="AbortError"&&e.abortSignal?.aborted))throw j;let ce=pt.inferFailureStage(),{decision:B}=Vd({error:j,failureStage:ce,attempt:ue,events:h,resilienceCfg:gt,recoveryCoordinator:Co});if(B.shouldUseNonStreaming){let se=oo(Y,ae);G("[resilience:fallback]",{provider:f.currentProviderName,attempt:ue,payloadBytes:se,payloadBucket:ro(se)}),Ii(Y,Xe),ae=qn(So,e.context);let Ee=fo({events:h,enabled:e.context?.contextDiagnostics===!0,provider:F,providerName:f.currentProviderName,...Oe,model:f.currentModelOverride??F.getModel(),reasoning:ft,disablePromptCache:e.disablePromptCache,system:ae,tools:Ne,messages:Y,...N!==void 0?{ephemeralSuffix:N}:{},...ze!==void 0?{promptCacheKey:ze}:{},attempt:ue,transport:"complete"}),De=await Yd({events:h,streamProvider:F,providerMessages:Y,activeToolDefinitions:Ne,effectiveSystemPrompt:ae,effectiveProviderReasoning:ft,callerAbortSignal:e.abortSignal,promptCacheKey:ze,modelOverride:f.currentModelOverride,maxOutputTokensOverride:Xe,ephemeralSuffix:N,hardTimeoutMs:Io,boundarySession:pt,emitActiveExtensionEvent:U,providerName:f.currentProviderName,attempt:ue,responseId:Ei,outputId:_o,clearStreamTimers:M.clearAll,configHome:e.context?.configHome});if(De.ok){P=De.result,Ie=De.providerRequestId,po(h,Ee,P.usage),b=z;break}j=De.error}if(B.action==="sanitize_thinking_and_retry"){let se=Co.executeRecovery(z,B);Xn(B.action,se),z=se.messages,Y=await rt(z,A,S,p),M.clearAll(),ue-=1,await dr(B.delayMs,e.abortSignal);continue}if(B.action==="manual_continue"||ue>=gt.maxRetries){M.clearAll();let se=f.usageComplete;if(await tc({state:r,error:j,messages:Y,provider:F,system:ae,model:f.currentModelOverride,reasoning:ft,maxOutputTokens:Xe,attempt:ue,maxAttempts:gt.maxRetries,timeoutMs:Io,signal:e.abortSignal,hasPendingInputs:i(()=>e.context?.interruptInput?.hasPendingInputs?.()===!0||tt(h,Te),"hasPendingInputs"),onStart:i(()=>{f.usageComplete=!1,h.onProviderRecovery?.({stage:B.failureStage,errorClass:B.reasonCode,attempt:ue,maxAttempts:gt.maxRetries,delayMs:0,recoveryAction:"text_diagnosis",ladderStep:4,fallbackUsed:!1})},"onStart"),onUsage:i(kn=>{f.usageComplete=se,f.costTracker=$o(f.costTracker,{provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),inputTokens:kn.inputTokens,outputTokens:kn.outputTokens,cacheReadTokens:kn.cachedReadTokens,cacheWriteTokens:kn.cachedWriteTokens})},"onUsage")})){ue+=1,Ao=!0;continue}b=z;let De=pt.snapshot();throw Ce=Fl({error:j,errorClass:B.reasonCode,requestPhase:B.failureStage,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),startedAt:De.startedAt,...B.serverRetryAfterMs===void 0?{}:{serverRetryAfterMs:B.serverRetryAfterMs}}),j}let xt=Co.executeRecovery(z,B);Xn(B.action,xt),z=xt.messages,Y=await rt(z,A,S,p),M.clearAll(),await dr(B.delayMs,e.abortSignal);continue}finally{M.clearAll()}}if(It(h,Ie?{providerRequestId:Ie}:void 0),await U("stream:end",void 0),P.usage?f.costTracker=$o(f.costTracker,{provider:f.currentProviderName,model:f.currentModelOverride??"unknown",inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheReadTokens:P.usage.cachedReadTokens,cacheWriteTokens:P.usage.cachedWriteTokens}):f.usageComplete=!1,f.lastText=P.textBlocks.map(k=>k.text).join(" "),be&&P.usage&&be.lifecycleCtx.getPermissionMode?.()!=="plan"){await be.refresh?.();let k=be.lifecycleCtx.getGoal();if(k?.status==="active"){let M=fa(k,P.usage,ma(R,Date.now()));M.nextState!==k&&await be.lifecycleCtx.persistEvent(M.nextState,M.budgetLimited?"budget_limited":"updated")}}let Pi=tr(b,P.usage),vn=Pi.source==="api"?Pi:K(b,Ut),Mi=Va(L.activeTools,e.context?.repoIntelligenceMode,a?.hasCapabilityProvider?.("mcp")??!!a,e.context?.toolConstructionMode,e.context?.agentExecutorPlane!==void 0);P={...P,toolBlocks:Nl(P.toolBlocks,Mi)};let hu=P.toolBlocks.filter(k=>et(k.name)),[Tn,Nh]=sn(f.lastText),Ve=Tn==="COMPLETE"||Tn==="BLOCKED"||Tn==="DECIDE"?Tn:void 0;if((P.toolBlocks.length===0||Ve==="COMPLETE"||g+1>=v)&&e.context?.interruptInput?.closeInputWindow(),Ve&&Ve!=="COMPLETE"){await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0,signal:Ve});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=K(b,vn),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:Ve});continue}}let yu=Hr([...P.thinkingBlocks,...P.textBlocks,...Ve==="COMPLETE"?[]:hu]);b.push({role:"assistant",content:yu,outputId:_o,turnId:Z.current.turnId,timestamp:new Date().toISOString()});let Oi=Na(b,P.usage),oe=Oi.source==="api"?Oi:K(b,vn);if(O=oe,Ve==="COMPLETE"){await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0,signal:"COMPLETE"});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=K(b,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:"COMPLETE"});continue}if(Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:"COMPLETE"}),await gi(g))continue;return await U("complete",{success:!0,signal:"COMPLETE"}),Se({success:!0,lastText:f.lastText,signal:"COMPLETE",messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1})}let bn=wl({result:P,messages:b,maxTokensRetryCount:f.maxTokensRetryCount,completedTurnTokenSnapshot:oe,events:Ie?Ul(h,Ie):h});if(f.maxTokensRetryCount=bn.nextMaxTokensRetryCount,bn.outcome==="continue"){let k=await Ke(g+1<y);(k?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=k?K(b,bn.nextContextTokenSnapshot):bn.nextContextTokenSnapshot;continue}let wn=kl({result:P,lastText:f.lastText,messages:b,continueAttempted:f.managedProtocolContinueAttempted,options:e,emittedManagedProtocolPayload:wo.current,completedTurnTokenSnapshot:oe});if(f.managedProtocolContinueAttempted=wn.nextContinueAttempted,wn.outcome==="continue"){let k=await Ke(g+1<y);(k?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=k?K(b,wn.nextContextTokenSnapshot):wn.nextContextTokenSnapshot;continue}let Ni=Tt(P.stopReason);if(Ni==="refused"?h.onOutputNotice?.({code:"model_refused"},Ie?{providerRequestId:Ie}:void 0):Ni==="unknown"&&typeof P.stopReason=="string"&&_({source:"coding:stop-reason",level:"warn",message:"Provider returned an unknown stop reason.",detail:{rawStopReason:P.stopReason,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),hasToolBlocks:P.toolBlocks.length>0,hasTextBlocks:P.textBlocks.length>0}}),P.toolBlocks.length===0){await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),await Un(A,b),O=K(b,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0});continue}if(tt(h,Te))return Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),Se({success:!0,lastText:f.lastText,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1});if(Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),await gi(g))continue;await U("complete",{success:!0,signal:void 0});{let ie=await ho({options:e,sessionId:w,messages:b,title:lt,runtimeSessionState:L,lastText:f.lastText});return Se({success:!0,lastText:f.lastText,signal:ie.finalSignal,signalReason:ie.finalReason,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1})}}let Po=await Qd({toolBlocks:P.toolBlocks,events:h,emitActiveExtensionEvent:U,messages:b,incompleteRetryCount:pi,preAssistantTokenSnapshot:vn,completedTurnTokenSnapshot:oe});if(pi=Po.nextIncompleteRetryCount,O=Po.nextContextTokenSnapshot,Po.outcome!=="no_incomplete")continue;let Ye=[],Di=[],Li=await Jd({toolBlocks:P.toolBlocks,abortSignal:e.abortSignal,events:h,emitActiveExtensionEvent:U});if(Li!==null)Ye.push(...Li);else{let k=Ct(b,O),M=ka({contextWindow:S,currentTokens:k,reservedResponseTokens:F.getEffectiveMaxOutputTokens(f.currentModelOverride)}),Q=A.toolResultCapacityTokens,ie=A.recordToolResultArtifact,jt=new Map;A.maximumInputTokens=k+M.aggregateInlineTokens,A.toolResultCapacityTokens=M.aggregateInlineTokens,A.recordToolResultArtifact=(j,ce)=>{jt.set(j,ce),ie?.(j,ce)};let Ht;try{Ht=await Wa({toolBlocks:P.toolBlocks,events:h,ctx:A,runtimeSessionState:L,activeToolNames:Mi,abortSignal:e.abortSignal,...E.length>0&&q!==void 0?{toolGuardrails:E,guardrailContext:{agent:q,...e.abortSignal!==void 0?{abortSignal:e.abortSignal}:{},messages:b.slice(0,-1),permissionIntent:e.context?.permissionIntent},getAfterGuardrailContext:i(()=>({agent:q,...e.abortSignal!==void 0?{abortSignal:e.abortSignal}:{},messages:[...b],permissionIntent:e.context?.permissionIntent}),"getAfterGuardrailContext"),onToolCallsPrepared:i(j=>{j.some((ce,B)=>{let xt=P.toolBlocks[B];return xt===void 0||ce.name!==xt.name||ce.input!==xt.input})&&(P={...P,toolBlocks:[...j]},sh(b,P),oe=K(b,vn),O=oe)},"onToolCallsPrepared")}:{}})}finally{Q===void 0?delete A.toolResultCapacityTokens:A.toolResultCapacityTokens=Q,ie===void 0?delete A.recordToolResultArtifact:A.recordToolResultArtifact=ie}let xe=await za({toolBlocks:P.toolBlocks,resultMap:Ht,events:h,emitActiveExtensionEvent:U,ctx:A,runtimeSessionState:L,toolResultBudget:M,toolResultArtifactPaths:jt});if(Ye=xe.toolResults,Di=xe.editRecoveryMessages,fe!==void 0){let j=Id({toolBlocks:P.toolBlocks,toolResults:Ye,startSequence:hn,observedAt:new Date().toISOString(),...Pe?.actionSignature!==void 0?{decisionActionSignature:Pe.actionSignature}:{}});for(let ce of j)fe.observe(ce);hn=j.at(-1)?.sequence??hn;for(let ce of j){if(ce.metadata?.failed!==!0)continue;let B=ce.metadata.verification===!0?"verification_failure":"tool_failure";yn.includes(B)||yn.push(B)}}}let xu=Zd(Ye);if(Ye.length===0){e.context?.interruptInput?.closeInputWindow(),await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=K(b,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0});continue}if(tt(h,Te))return Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),Se({success:!0,lastText:f.lastText,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1});Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),await U("complete",{success:!0,signal:void 0});{let ie=await ho({options:e,sessionId:w,messages:b,title:lt,runtimeSessionState:L,lastText:f.lastText});return Se({success:!0,lastText:f.lastText,signal:ie.finalSignal,signalReason:ie.finalReason,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1})}}if(xu){e.context?.interruptInput?.closeInputWindow();let k=await el({events:h,emitActiveExtensionEvent:U,messages:b,toolResults:Ye,completedTurnTokenSnapshot:oe,sessionId:w,queueAgentId:Te,iter:g,emitIterationEnd:Me});return O=k.contextTokenSnapshot,Se({success:!0,lastText:Br,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,interrupted:!k.shouldYieldToQueuedFollowUp})}let Mo=await $l({messages:b,toolResults:Ye,editRecoveryMessages:Di,completedTurnTokenSnapshot:oe,runtimeSessionState:L,emitActiveExtensionEvent:U,sessionId:w,lastText:f.lastText,iter:g});await Un(A,b),O=Mo.contextTokenSnapshot;let $i=await Ke(g+1<y);if($i&&(T(g),O=K(b,O)),Mo.drainedQueuedMessages||$i){if($(g)&&e.context?.interruptInput?.reopenInputWindow(),Mo.drainedQueuedMessages)continue;await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!0,signal:void 0});continue}if(tt(h,Te))return Me(g+1,O),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!0,signal:void 0}),Se({success:!0,lastText:f.lastText,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1});await st(e,w,{messages:b,title:lt,gitRoot:e.context?.gitRoot??void 0,runtimeSessionState:L}),Me(g+1,O),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!0,signal:void 0})}catch(C){return hi(C)}}e.context?.interruptInput?.closeInputWindow();let Ro=await ho({options:e,sessionId:w,messages:b,title:lt,runtimeSessionState:L,lastText:f.lastText});try{await U("complete",{success:!0,signal:Ro.finalSignal||void 0})}catch(g){return hi(g)}return Se({success:!0,lastText:f.lastText,signal:Ro.finalSignal,signalReason:Ro.finalReason,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!0})}finally{await no(p),u?.(),l?.(),m(),d&&Jo(s)}}i(hh,"runSubstrateInContext");var Bl="kodax/coding/default",yh="KodaX default coding agent.\n\nThis agent is a thin declaration that routes through the built-in `runKodaX`\npipeline. Tools, extensions, reasoning, provider selection, session\npersistence, compaction and harness routing are all driven by the\n`KodaXOptions` forwarded via `Runner.run` `opts.presetOptions`.\n";function xh(e){if(typeof e=="string")return e;for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role==="user")return Uo(n)||""}return""}i(xh,"extractPrompt");function Hl(e){let t=e.trim();return t===""||t==="..."}i(Hl,"isPlaceholderOnlyAssistantText");function vh(e){if(e.role!=="user")return!1;let t=e.content;return!Array.isArray(t)||t.length===0?!1:t.every(n=>!!n&&typeof n=="object"&&"type"in n&&n.type==="tool_result")}i(vh,"isPureToolResultUserMessage");function Th(e){if(e.lastText&&!Hl(e.lastText))return e.lastText;for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(n){if(n.role==="assistant"){let o=Uo(n);return o&&!Hl(o)?o:""}if(!vh(n))return""}}return""}i(Th,"extractFinalAssistantText");var bh=i(async(e,t,n,o)=>{let r=n?.presetOptions??{},s=n?.permissionIntent===void 0?r:{...r,context:{...r.context,permissionIntent:n.permissionIntent}},a=n?.abortSignal?{...s,abortSignal:n.abortSignal}:s,c=[...e.guardrails??[],...n?.guardrails??r.guardrails??[]],d=c.length>0?{...a,guardrails:[...new Set(c)]}:a,m=xh(t),l=[],u=o?o.agentSpan.addChild("coding:runSubstrate",{kind:"generation",agentName:Bl,provider:d.provider??"unknown",model:d.model??"unknown",memoryDecisionReceipts:l}):null,p;try{p=o===void 0?await Zr(d,m,e):await Rd(l,()=>Zr(d,m,e))}catch(v){throw u&&(u.setError(v instanceof Error?v:new Error(String(v))),u.end()),v}return u&&u.end(),{output:Th(p),messages:p.messages,sessionId:p.sessionId,data:p}},"codingSubstrate"),wh=Object.freeze([Object.freeze({name:"autoReroute",enabled:!0}),Object.freeze({name:"mutationReflection",enabled:!0}),Object.freeze({name:"preAnswerJudge",enabled:!0}),Object.freeze({name:"postToolJudge",enabled:!0})]),kh=Object.freeze({default:"balanced",max:"deep",escalateOnRevise:!0});function ql(e={}){return Cn({name:Bl,instructions:yh,substrateExecutor:bh,middleware:wh,reasoning:kh,...e})}i(ql,"createDefaultCodingAgent");function Kl(e){return{...e.modelTiers!==void 0?{modelTiers:e.modelTiers}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.disablePromptCache!==void 0?{disablePromptCache:e.disablePromptCache}:{},...e.lsp!==void 0?{lsp:e.lsp}:{},...e.workflow!==void 0?{workflow:e.workflow}:{}}}i(Kl,"deriveRunScopedConfig");var Rh={read:"read",grep:"grep",glob:"glob",write:"write",edit:"edit",bash:"bash",undo:"undo",askuserquestion:"ask-user-question",askuser:"ask-user-question"};function Wl(e){let t=[],n="",o=0;for(let r of e){if(r===","&&o===0){n.trim()&&t.push(n.trim()),n="";continue}r==="("?o++:r===")"&&o>0&&o--,n+=r}return n.trim()&&t.push(n.trim()),t}i(Wl,"splitTopLevelCommaList");function Sh(e){if(!e?.trim())return{configured:!1,rules:[],invalidEntries:[]};let t=[],n=[];for(let o of Wl(e)){if(o==="*"){t.push({tool:"*"});continue}if(o.includes("(")&&!o.endsWith(")")){n.push(o);continue}let r=o.match(/^([^(]+?)(?:\((.*)\))?$/);if(!r){n.push(o);continue}let s=Rh[r[1].replace(/[^a-z]/gi,"").toLowerCase()];if(!s){n.push(o);continue}let a=r[2]?Wl(r[2]).map(c=>c.trim()).filter(Boolean):void 0;t.push({tool:s,...a?.length?{patterns:a}:{}})}return{configured:!0,rules:t,invalidEntries:n}}i(Sh,"parseAllowedTools");function zl(e,t){let n=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${n}$`,"i").test(t)}i(zl,"matchesPattern");function Gl(e,t,n){if(!e.configured)return!0;if(e.rules.length===0)return!1;let o=t.toLowerCase(),r=o==="bash"?String(n.command??"").trim():"";return e.rules.some(s=>s.tool!=="*"&&s.tool!==o?!1:!s.patterns?.length||o!=="bash"?!0:s.patterns.some(a=>zl(a,r)))}i(Gl,"isToolAllowed");function Ch(e,t){return e.matcher===void 0||zl(e.matcher,t)}i(Ch,"hookMatches");function Xl(e,t){return{command:t.command,_reason:`Frontmatter hook ${e}`,_frontmatterHook:!0,_hookEvent:e,_hookMatcher:t.matcher}}i(Xl,"hookToolInput");async function Ih(e,t,n,o,r){let s=r.context?.shellExecution??{version:1,shell:{kind:process.platform==="win32"?"cmd":"bash",profile:"none"}},a=await oa(Xl(e,t),{backups:new Map,executionCwd:o,gitRoot:r.context?.gitRoot??void 0,abortSignal:r.abortSignal,shellSandbox:r.context?.shellSandbox,resolveShellPermissionMode:r.context?.resolveShellPermissionMode,authorizeShellHostExecution:r.context?.authorizeShellHostExecution,sandbox:r.sandbox,shellExecution:{...s,environment:{...s.environment,set:{...s.environment?.set,KODAX_HOOK_EVENT:e,KODAX_HOOK_PAYLOAD:JSON.stringify(n)}}}}),c=`Command: ${t.command}
387
+ `),{turnId:Z.current.turnId}))),ae=qn(So,e.context),ue+=1,Ut=K(Y,Ut);let k=pt.beginAttempt(f.currentProviderName,f.currentModelOverride??F.getModel(),Y,ue,!1);Ie=k,h.onOutputSegmentStart?.({responseId:Ei,outputId:_o,providerRequestId:k,mode:_i}),_i="replace";let M=Hd({hardTimeoutMs:Io,idleTimeoutMs:mu,streamMaxDurationMs:F.getStreamMaxDurationMs?.(f.currentModelOverride)??0,callerAbortSignal:e.abortSignal}),Q=M.retryTimeoutController,ie=M.retrySignal,jt=M.resetIdleTimer,Ht=oo(Y,ae);G("[resilience:request]",{provider:f.currentProviderName,attempt:ue,fallbackActive:!1,payloadBytes:Ht,payloadBucket:ro(Ht),lastToolErrorCode:L.lastToolErrorCode,lastToolResultBytes:L.lastToolResultBytes});try{let xe=qd({configHome:e.context?.configHome,events:Ul(h,k),boundaryTracker:xi,streamTimers:M,emitActiveExtensionEvent:U,providerName:f.currentProviderName}),j=i(B=>{f.costTracker=Qi(f.costTracker,{provider:B.provider,waitMs:B.waitMs,reason:B.reason,source:B.source}),xe.onRetryAfter?.(B)},"wrappedRetryAfter");Ii(Y,Xe);let ce=fo({events:h,enabled:e.context?.contextDiagnostics===!0,provider:F,providerName:f.currentProviderName,...Oe,model:f.currentModelOverride??F.getModel(),reasoning:ft,disablePromptCache:e.disablePromptCache,system:ae,tools:Ne,messages:Y,...N!==void 0?{ephemeralSuffix:N}:{},...ze!==void 0?{promptCacheKey:ze}:{},attempt:ue});P=await vt(F.name,"primary",ie,B=>F.stream(Y,Ne,ae,ft,{...xe,rejectedReasoningEfforts:Yt(f.currentProviderName,We,e.context?.configHome),...Ao?{singleAttempt:!0}:{},promptCacheKey:ze,onRetryAfter:j,modelOverride:f.currentModelOverride,maxOutputTokensOverride:Xe,ephemeralSuffix:N,signal:B},B),Ie),po(h,ce,P.usage),b=z;break}catch(xe){let j=xe instanceof Error?xe:new Error(String(xe));if(Ao){let se=Et(j);throw Ce=Fl({error:j,errorClass:se.errorClass,requestPhase:se.failureStage,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),startedAt:pt.snapshot().startedAt}),j}if(j instanceof Rn&&!Ai&&!e.abortSignal?.aborted){Ai=!0,j.requestInputReliefTokens=Math.max(0,D(z)-D(Y));let se=Ma(z,j,S,O);S=se.capacityWindow;let Ee=await Gr({...Si,messages:z,currentTokens:se.currentTokens,contextWindow:S,needsCompact:!0}),De=D(z);if(z=Ee.messages,b=z,D(Ee.messages)>=De)throw j;O=Ee.contextTokenSnapshot??K(z,se),Ut=Ee.contextTokenSnapshot??se,f.compactConsecutiveFailures=Ee.nextCompactConsecutiveFailures,f.compactAntiThrash=Ee.nextCompactionAntiThrash,Y=await rt(z,A,S,p),Xe=br(F,{model:f.currentModelOverride,maxOutputTokens:Xe,contextWindow:S,currentTokens:Ct(Y,Ut)});continue}if(j instanceof Rn||(j=await Xd(j,Q,e.abortSignal),j.name==="AbortError"&&e.abortSignal?.aborted))throw j;let ce=pt.inferFailureStage(),{decision:B}=Vd({error:j,failureStage:ce,attempt:ue,events:h,resilienceCfg:gt,recoveryCoordinator:Co});if(B.shouldUseNonStreaming){let se=oo(Y,ae);G("[resilience:fallback]",{provider:f.currentProviderName,attempt:ue,payloadBytes:se,payloadBucket:ro(se)}),Ii(Y,Xe),ae=qn(So,e.context);let Ee=fo({events:h,enabled:e.context?.contextDiagnostics===!0,provider:F,providerName:f.currentProviderName,...Oe,model:f.currentModelOverride??F.getModel(),reasoning:ft,disablePromptCache:e.disablePromptCache,system:ae,tools:Ne,messages:Y,...N!==void 0?{ephemeralSuffix:N}:{},...ze!==void 0?{promptCacheKey:ze}:{},attempt:ue,transport:"complete"}),De=await Yd({events:h,streamProvider:F,providerMessages:Y,activeToolDefinitions:Ne,effectiveSystemPrompt:ae,effectiveProviderReasoning:ft,callerAbortSignal:e.abortSignal,promptCacheKey:ze,modelOverride:f.currentModelOverride,maxOutputTokensOverride:Xe,ephemeralSuffix:N,hardTimeoutMs:Io,boundarySession:pt,emitActiveExtensionEvent:U,providerName:f.currentProviderName,attempt:ue,responseId:Ei,outputId:_o,clearStreamTimers:M.clearAll,configHome:e.context?.configHome});if(De.ok){P=De.result,Ie=De.providerRequestId,po(h,Ee,P.usage),b=z;break}j=De.error}if(B.action==="sanitize_thinking_and_retry"){let se=Co.executeRecovery(z,B);Xn(B.action,se),z=se.messages,Y=await rt(z,A,S,p),M.clearAll(),ue-=1,await dr(B.delayMs,e.abortSignal);continue}if(B.action==="manual_continue"||ue>=gt.maxRetries){M.clearAll();let se=f.usageComplete;if(await tc({state:r,error:j,messages:Y,provider:F,system:ae,model:f.currentModelOverride,reasoning:ft,maxOutputTokens:Xe,attempt:ue,maxAttempts:gt.maxRetries,timeoutMs:Io,signal:e.abortSignal,hasPendingInputs:i(()=>e.context?.interruptInput?.hasPendingInputs?.()===!0||tt(h,Te),"hasPendingInputs"),onStart:i(()=>{f.usageComplete=!1,h.onProviderRecovery?.({stage:B.failureStage,errorClass:B.reasonCode,attempt:ue,maxAttempts:gt.maxRetries,delayMs:0,recoveryAction:"text_diagnosis",ladderStep:4,fallbackUsed:!1})},"onStart"),onUsage:i(kn=>{f.usageComplete=se,f.costTracker=$o(f.costTracker,{provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),inputTokens:kn.inputTokens,outputTokens:kn.outputTokens,cacheReadTokens:kn.cachedReadTokens,cacheWriteTokens:kn.cachedWriteTokens})},"onUsage")})){ue+=1,Ao=!0;continue}b=z;let De=pt.snapshot();throw Ce=Fl({error:j,errorClass:B.reasonCode,requestPhase:B.failureStage,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),startedAt:De.startedAt,...B.serverRetryAfterMs===void 0?{}:{serverRetryAfterMs:B.serverRetryAfterMs}}),j}let xt=Co.executeRecovery(z,B);Xn(B.action,xt),z=xt.messages,Y=await rt(z,A,S,p),M.clearAll(),await dr(B.delayMs,e.abortSignal);continue}finally{M.clearAll()}}if(It(h,Ie?{providerRequestId:Ie}:void 0),await U("stream:end",void 0),P.usage?f.costTracker=$o(f.costTracker,{provider:f.currentProviderName,model:f.currentModelOverride??"unknown",inputTokens:P.usage.inputTokens,outputTokens:P.usage.outputTokens,cacheReadTokens:P.usage.cachedReadTokens,cacheWriteTokens:P.usage.cachedWriteTokens}):f.usageComplete=!1,f.lastText=P.textBlocks.map(k=>k.text).join(" "),be&&P.usage&&be.lifecycleCtx.getPermissionMode?.()!=="plan"){await be.refresh?.();let k=be.lifecycleCtx.getGoal();if(k?.status==="active"){let M=fa(k,P.usage,ma(R,Date.now()));M.nextState!==k&&await be.lifecycleCtx.persistEvent(M.nextState,M.budgetLimited?"budget_limited":"updated")}}let Pi=tr(b,P.usage),vn=Pi.source==="api"?Pi:K(b,Ut),Mi=Va(L.activeTools,e.context?.repoIntelligenceMode,a?.hasCapabilityProvider?.("mcp")??!!a,e.context?.toolConstructionMode,e.context?.agentExecutorPlane!==void 0);P={...P,toolBlocks:Nl(P.toolBlocks,Mi)};let hu=P.toolBlocks.filter(k=>et(k.name)),[Tn,Nh]=sn(f.lastText),Ve=Tn==="COMPLETE"||Tn==="BLOCKED"||Tn==="DECIDE"?Tn:void 0;if((P.toolBlocks.length===0||Ve==="COMPLETE"||g+1>=v)&&e.context?.interruptInput?.closeInputWindow(),Ve&&Ve!=="COMPLETE"){await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0,signal:Ve});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=K(b,vn),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:Ve});continue}}let yu=Hr([...P.thinkingBlocks,...P.textBlocks,...Ve==="COMPLETE"?[]:hu]);b.push({role:"assistant",content:yu,outputId:_o,turnId:Z.current.turnId,timestamp:new Date().toISOString()});let Oi=Na(b,P.usage),oe=Oi.source==="api"?Oi:K(b,vn);if(O=oe,Ve==="COMPLETE"){await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0,signal:"COMPLETE"});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=K(b,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:"COMPLETE"});continue}if(Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:"COMPLETE"}),await gi(g))continue;return await U("complete",{success:!0,signal:"COMPLETE"}),Se({success:!0,lastText:f.lastText,signal:"COMPLETE",messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1})}let bn=wl({result:P,messages:b,maxTokensRetryCount:f.maxTokensRetryCount,completedTurnTokenSnapshot:oe,events:Ie?Ul(h,Ie):h});if(f.maxTokensRetryCount=bn.nextMaxTokensRetryCount,bn.outcome==="continue"){let k=await Ke(g+1<y);(k?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=k?K(b,bn.nextContextTokenSnapshot):bn.nextContextTokenSnapshot;continue}let wn=kl({result:P,lastText:f.lastText,messages:b,continueAttempted:f.managedProtocolContinueAttempted,options:e,emittedManagedProtocolPayload:wo.current,completedTurnTokenSnapshot:oe});if(f.managedProtocolContinueAttempted=wn.nextContinueAttempted,wn.outcome==="continue"){let k=await Ke(g+1<y);(k?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=k?K(b,wn.nextContextTokenSnapshot):wn.nextContextTokenSnapshot;continue}let Ni=Tt(P.stopReason);if(Ni==="refused"?h.onOutputNotice?.({code:"model_refused"},Ie?{providerRequestId:Ie}:void 0):Ni==="unknown"&&typeof P.stopReason=="string"&&_({source:"coding:stop-reason",level:"warn",message:"Provider returned an unknown stop reason.",detail:{rawStopReason:P.stopReason,provider:f.currentProviderName,model:f.currentModelOverride??F.getModel(),hasToolBlocks:P.toolBlocks.length>0,hasTextBlocks:P.textBlocks.length>0}}),P.toolBlocks.length===0){await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),await Un(A,b),O=K(b,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0});continue}if(tt(h,Te))return Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),Se({success:!0,lastText:f.lastText,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1});if(Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),await gi(g))continue;await U("complete",{success:!0,signal:void 0});{let ie=await ho({options:e,sessionId:w,messages:b,title:lt,runtimeSessionState:L,lastText:f.lastText});return Se({success:!0,lastText:f.lastText,signal:ie.finalSignal,signalReason:ie.finalReason,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1})}}let Po=await Qd({toolBlocks:P.toolBlocks,events:h,emitActiveExtensionEvent:U,messages:b,incompleteRetryCount:pi,preAssistantTokenSnapshot:vn,completedTurnTokenSnapshot:oe});if(pi=Po.nextIncompleteRetryCount,O=Po.nextContextTokenSnapshot,Po.outcome!=="no_incomplete")continue;let Ye=[],Di=[],Li=await Jd({toolBlocks:P.toolBlocks,abortSignal:e.abortSignal,events:h,emitActiveExtensionEvent:U});if(Li!==null)Ye.push(...Li);else{let k=Ct(b,O),M=ka({contextWindow:S,currentTokens:k,reservedResponseTokens:F.getEffectiveMaxOutputTokens(f.currentModelOverride)}),Q=A.toolResultCapacityTokens,ie=A.recordToolResultArtifact,jt=new Map;A.maximumInputTokens=k+M.aggregateInlineTokens,A.toolResultCapacityTokens=M.aggregateInlineTokens,A.recordToolResultArtifact=(j,ce)=>{jt.set(j,ce),ie?.(j,ce)};let Ht;try{Ht=await Wa({toolBlocks:P.toolBlocks,events:h,ctx:A,runtimeSessionState:L,activeToolNames:Mi,abortSignal:e.abortSignal,...E.length>0&&q!==void 0?{toolGuardrails:E,guardrailContext:{agent:q,...e.abortSignal!==void 0?{abortSignal:e.abortSignal}:{},messages:b.slice(0,-1),permissionIntent:e.context?.permissionIntent},getAfterGuardrailContext:i(()=>({agent:q,...e.abortSignal!==void 0?{abortSignal:e.abortSignal}:{},messages:[...b],permissionIntent:e.context?.permissionIntent}),"getAfterGuardrailContext"),onToolCallsPrepared:i(j=>{j.some((ce,B)=>{let xt=P.toolBlocks[B];return xt===void 0||ce.name!==xt.name||ce.input!==xt.input})&&(P={...P,toolBlocks:[...j]},sh(b,P),oe=K(b,vn),O=oe)},"onToolCallsPrepared")}:{}})}finally{Q===void 0?delete A.toolResultCapacityTokens:A.toolResultCapacityTokens=Q,ie===void 0?delete A.recordToolResultArtifact:A.recordToolResultArtifact=ie}let xe=await za({toolBlocks:P.toolBlocks,resultMap:Ht,events:h,emitActiveExtensionEvent:U,ctx:A,runtimeSessionState:L,toolResultBudget:M,toolResultArtifactPaths:jt});if(Ye=xe.toolResults,Di=xe.editRecoveryMessages,fe!==void 0){let j=Id({toolBlocks:P.toolBlocks,toolResults:Ye,startSequence:hn,observedAt:new Date().toISOString(),...Pe?.actionSignature!==void 0?{decisionActionSignature:Pe.actionSignature}:{}});for(let ce of j)fe.observe(ce);hn=j.at(-1)?.sequence??hn;for(let ce of j){if(ce.metadata?.failed!==!0)continue;let B=ce.metadata.verification===!0?"verification_failure":"tool_failure";yn.includes(B)||yn.push(B)}}}let xu=Zd(Ye);if(Ye.length===0){e.context?.interruptInput?.closeInputWindow(),await Mt(w,f.lastText,L,{hadToolCalls:!1,success:!0});let k=Pt(b,L),M=await Ke(g+1<y);if(k||M){(M?T(g):g+1<v)&&$(g)&&e.context?.interruptInput?.reopenInputWindow(),O=K(b,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0});continue}if(tt(h,Te))return Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),Se({success:!0,lastText:f.lastText,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1});Me(g+1,oe),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!1,signal:void 0}),await U("complete",{success:!0,signal:void 0});{let ie=await ho({options:e,sessionId:w,messages:b,title:lt,runtimeSessionState:L,lastText:f.lastText});return Se({success:!0,lastText:f.lastText,signal:ie.finalSignal,signalReason:ie.finalReason,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1})}}if(xu){e.context?.interruptInput?.closeInputWindow();let k=await el({events:h,emitActiveExtensionEvent:U,messages:b,toolResults:Ye,completedTurnTokenSnapshot:oe,sessionId:w,queueAgentId:Te,iter:g,emitIterationEnd:Me});return O=k.contextTokenSnapshot,Se({success:!0,lastText:Br,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,interrupted:!k.shouldYieldToQueuedFollowUp})}let Mo=await $l({messages:b,toolResults:Ye,editRecoveryMessages:Di,completedTurnTokenSnapshot:oe,runtimeSessionState:L,emitActiveExtensionEvent:U,sessionId:w,lastText:f.lastText,iter:g});await Un(A,b),O=Mo.contextTokenSnapshot;let $i=await Ke(g+1<y);if($i&&(T(g),O=K(b,O)),Mo.drainedQueuedMessages||$i){if($(g)&&e.context?.interruptInput?.reopenInputWindow(),Mo.drainedQueuedMessages)continue;await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!0,signal:void 0});continue}if(tt(h,Te))return Me(g+1,O),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!0,signal:void 0}),Se({success:!0,lastText:f.lastText,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!1});await st(e,w,{messages:b,title:lt,gitRoot:e.context?.gitRoot??void 0,runtimeSessionState:L}),Me(g+1,O),await U("turn:end",{sessionId:w,iteration:g+1,lastText:f.lastText,hadToolCalls:!0,signal:void 0})}catch(C){return hi(C)}}e.context?.interruptInput?.closeInputWindow();let Ro=await ho({options:e,sessionId:w,messages:b,title:lt,runtimeSessionState:L,lastText:f.lastText});try{await U("complete",{success:!0,signal:Ro.finalSignal||void 0})}catch(g){return hi(g)}return Se({success:!0,lastText:f.lastText,signal:Ro.finalSignal,signalReason:Ro.finalReason,messages:b,sessionId:w,routingDecision:we(),contextTokenSnapshot:O,limitReached:!0})}finally{await no(p),u?.(),l?.(),m(),d&&Jo(s)}}i(hh,"runSubstrateInContext");var Bl="kodax/coding/default",yh="KodaX default coding agent.\n\nThis agent is a thin declaration that routes through the built-in `runKodaX`\npipeline. Tools, extensions, reasoning, provider selection, session\npersistence, compaction and harness routing are all driven by the\n`KodaXOptions` forwarded via `Runner.run` `opts.presetOptions`.\n";function xh(e){if(typeof e=="string")return e;for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role==="user")return Uo(n)||""}return""}i(xh,"extractPrompt");function Hl(e){let t=e.trim();return t===""||t==="..."}i(Hl,"isPlaceholderOnlyAssistantText");function vh(e){if(e.role!=="user")return!1;let t=e.content;return!Array.isArray(t)||t.length===0?!1:t.every(n=>!!n&&typeof n=="object"&&"type"in n&&n.type==="tool_result")}i(vh,"isPureToolResultUserMessage");function Th(e){if(e.lastText&&!Hl(e.lastText))return e.lastText;for(let t=e.messages.length-1;t>=0;t--){let n=e.messages[t];if(n){if(n.role==="assistant"){let o=Uo(n);return o&&!Hl(o)?o:""}if(!vh(n))return""}}return""}i(Th,"extractFinalAssistantText");var bh=i(async(e,t,n,o)=>{let r=n?.presetOptions??{},s=n?.permissionIntent===void 0?r:{...r,context:{...r.context,permissionIntent:n.permissionIntent}},a=n?.abortSignal?{...s,abortSignal:n.abortSignal}:s,c=[...e.guardrails??[],...n?.guardrails??r.guardrails??[]],d=c.length>0?{...a,guardrails:[...new Set(c)]}:a,m=xh(t),l=[],u=o?o.agentSpan.addChild("coding:runSubstrate",{kind:"generation",agentName:Bl,provider:d.provider??"unknown",model:d.model??"unknown",memoryDecisionReceipts:l}):null,p;try{p=o===void 0?await Zr(d,m,e):await Rd(l,()=>Zr(d,m,e))}catch(v){throw u&&(u.setError(v instanceof Error?v:new Error(String(v))),u.end()),v}return u&&u.end(),{output:Th(p),messages:p.messages,sessionId:p.sessionId,data:p}},"codingSubstrate"),wh=Object.freeze([Object.freeze({name:"autoReroute",enabled:!0}),Object.freeze({name:"mutationReflection",enabled:!0}),Object.freeze({name:"preAnswerJudge",enabled:!0}),Object.freeze({name:"postToolJudge",enabled:!0})]),kh=Object.freeze({default:"balanced",max:"deep",escalateOnRevise:!0});function ql(e={}){return Cn({name:Bl,instructions:yh,substrateExecutor:bh,middleware:wh,reasoning:kh,...e})}i(ql,"createDefaultCodingAgent");function Kl(e){return{...e.modelTiers!==void 0?{modelTiers:e.modelTiers}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.disablePromptCache!==void 0?{disablePromptCache:e.disablePromptCache}:{},...e.lsp!==void 0?{lsp:e.lsp}:{},...e.workflow!==void 0?{workflow:e.workflow}:{}}}i(Kl,"deriveRunScopedConfig");var Rh={read:"read",grep:"grep",glob:"glob",write:"write",edit:"edit",bash:"bash",undo:"undo",askuserquestion:"ask-user-question",askuser:"ask-user-question"};function Wl(e){let t=[],n="",o=0;for(let r of e){if(r===","&&o===0){n.trim()&&t.push(n.trim()),n="";continue}r==="("?o++:r===")"&&o>0&&o--,n+=r}return n.trim()&&t.push(n.trim()),t}i(Wl,"splitTopLevelCommaList");function Sh(e){if(!e?.trim())return{configured:!1,rules:[],invalidEntries:[]};let t=[],n=[];for(let o of Wl(e)){if(o==="*"){t.push({tool:"*"});continue}if(o.includes("(")&&!o.endsWith(")")){n.push(o);continue}let r=o.match(/^([^(]+?)(?:\((.*)\))?$/);if(!r){n.push(o);continue}let s=Rh[r[1].replace(/[^a-z]/gi,"").toLowerCase()];if(!s){n.push(o);continue}let a=r[2]?Wl(r[2]).map(c=>c.trim()).filter(Boolean):void 0;t.push({tool:s,...a?.length?{patterns:a}:{}})}return{configured:!0,rules:t,invalidEntries:n}}i(Sh,"parseAllowedTools");function zl(e,t){let n=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${n}$`,"i").test(t)}i(zl,"matchesPattern");function Gl(e,t,n){if(!e.configured)return!0;if(e.rules.length===0)return!1;let o=t.toLowerCase(),r=o==="bash"?String(n.command??"").trim():"";return e.rules.some(s=>s.tool!=="*"&&s.tool!==o?!1:!s.patterns?.length||o!=="bash"?!0:s.patterns.some(a=>zl(a,r)))}i(Gl,"isToolAllowed");function Ch(e,t){return e.matcher===void 0||zl(e.matcher,t)}i(Ch,"hookMatches");function Xl(e,t){return{command:t.command,_reason:`Frontmatter hook ${e}`,_frontmatterHook:!0,_hookEvent:e,_hookMatcher:t.matcher}}i(Xl,"hookToolInput");async function Ih(e,t,n,o,r){let s=r.context?.shellExecution??{version:1,shell:{kind:process.platform==="win32"?"cmd":"bash",profile:"none"}},a=await oa(Xl(e,t),{configHome:r.context?.configHome,backups:new Map,executionCwd:o,gitRoot:r.context?.gitRoot??void 0,abortSignal:r.abortSignal,shellSandbox:r.context?.shellSandbox,resolveShellPermissionMode:r.context?.resolveShellPermissionMode,authorizeShellHostExecution:r.context?.authorizeShellHostExecution,sandbox:r.sandbox,shellExecution:{...s,environment:{...s.environment,set:{...s.environment?.set,KODAX_HOOK_EVENT:e,KODAX_HOOK_PAYLOAD:JSON.stringify(n)}}}}),c=`Command: ${t.command}
388
388
  Exit: 0
389
389
  `;if(!a.startsWith(c))throw new Error(a);let d=a.slice(c.length),m=d.indexOf(`
390
390
  [stderr]
@@ -1,5 +1,5 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{o as ye,p as Ye,u as Ze,v as Qe,w as et,z as tt}from"./chunk-7VOTRMUH.js";import{Ob as ze,Pb as Ge,Sb as Je,Tb as Xe}from"./chunk-62IOXGHA.js";import{Bg as Ue,Cg as Ve,Eg as Z,Ig as we,Og as ge,Pg as B,Qg as he,Rg as Be,Wa as oe,Yg as He,Zg as Ke,_g as Le,v as pe,yg as ie}from"./chunk-62V3CQH4.js";import{fa as je}from"./chunk-2AM3FRQ7.js";import{a as i}from"./chunk-ONUPGMER.js";import{basename as xr,dirname as Sr}from"node:path";import{execFile as tn}from"node:child_process";import ae from"node:path";import{promisify as nn}from"node:util";var rn=nn(tn),on=1e4,ct=2,nt=new Set(["write","edit","multi_edit","insert_after_anchor"]),rt=new Set(["read"]);function an(e,t){if(t.includes("*"))return e;if(e.includes("*"))return t;let n=new Set(t);return e.filter(o=>n.has(o))}i(an,"intersectWorkflowToolCeilings");var sn=/^\s*(?:let me|i will|i'll|i am going to)\b[\s\S]{0,120}\b(?:start|create|implement|write|build|plan)\b|^\s*(?:我将|让我|接下来)[\s\S]{0,80}(?:开始|创建|编写|实现|制定)/i;function cn(e){if(e?.timeoutMs!==void 0){if(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0)throw new Error("workflow wait timeoutMs must be a positive number");return Math.floor(e.timeoutMs)}}i(cn,"normalizeWaitTimeoutMs");function ke(e){return e?.requiresMutation===!0||(e?.requiredChangedPaths?.length??0)>0}i(ke,"hasVerificationWork");function H(e){return e.replace(/\\/g,"/").replace(/^\.\//,"").trim()}i(H,"normalizeWorkspacePath");function ve(e,t){let n=t.gitRoot?ae.resolve(t.gitRoot):void 0,o=ae.isAbsolute(e)&&n?ae.relative(n,ae.resolve(e)):e;return H(o)}i(ve,"normalizeRequiredPath");function dn(e){let t=(e.readOnly??!1)===!1?{enforcement:"warn",requiresMutation:!0,rejectPreparatoryFinalText:!0}:void 0;if(e.verification!==void 0){let n={...t??{},...e.verification,enforcement:e.verification.enforcement??"hard"},o=e.verification.requiredChangedPaths;return{verification:{...n,...o!==void 0&&o.length>0&&n.requiresMutation===void 0?{requiresMutation:!0}:{}}}}return{verification:t}}i(dn,"resolveVerificationForInput");function un(e,t){if(t===!0&&e.readOnly===!1)throw new Error(`workflow manifest readOnly=true cannot spawn write-capable child "${e.name}"; set the workflow manifest readOnly=false or use child readOnly:true`);let n=e.readOnly??t??!1;return e.readOnly===n?e:{...e,readOnly:n}}i(un,"resolveSpawnAgentInput");function dt(e){let t=e.trim();return t.length>0&&sn.test(t)}i(dt,"isPreparatoryOnlyText");function ln(e,t){let n=e.trim(),o=t?.trim();return o&&(n.length===0||dt(n))?o:e}i(ln,"selectWorkflowFinalText");async function se(e,t){return await oe({cwd:t}),(await rn("git",[...e],{cwd:t,timeout:on,windowsHide:!0,maxBuffer:4*1024*1024})).stdout.toString()}i(se,"runGit");async function fn(e){let t=e.gitRoot??e.executionCwd??process.cwd(),n=(await se(["rev-parse","--show-toplevel"],t)).trim(),o=await Promise.all([se(["diff","--name-only","--"],n),se(["diff","--cached","--name-only","--"],n),se(["ls-files","--others","--exclude-standard"],n)]);return[...new Set(o.flatMap(a=>a.split(/\r?\n/)).map(H).filter(a=>a.length>0))]}i(fn,"listGitChangedFiles");async function xe(e,t){try{return{paths:(await t(e)).map(H).filter(o=>o.length>0)}}catch(n){return{paths:[],error:n instanceof Error?n.message:String(n)}}}i(xe,"captureChangedPaths");function mn(){return{toolNameById:new Map,toolPathById:new Map,succeededToolCalls:[],succeededPaths:[],readPathById:new Map,succeededReadPaths:[]}}i(mn,"createMutationRecorder");function ot(e){if(e)for(let t of["path","file_path","target_path"]){let n=e[t];if(typeof n=="string"&&n.trim().length>0)return H(n)}}i(ot,"readMutationPath");function pn(e,t){return{...e??{},onToolUseStart:i((n,o)=>{if(nt.has(n.name)){t.toolNameById.set(n.id,n.name);let a=ot(n.input);a!==void 0&&t.toolPathById.set(n.id,a)}if(rt.has(n.name)){let a=ot(n.input);a!==void 0&&t.readPathById.set(n.id,a)}e?.onToolUseStart?.(n,o)},"onToolUseStart"),onToolResult:i((n,o)=>{let a=t.toolNameById.get(n.id)??n.name;if(nt.has(a)&&!n.content.trimStart().startsWith("[Tool Error]")){t.succeededToolCalls.push(a);let r=t.toolPathById.get(n.id);r!==void 0&&t.succeededPaths.push(r)}if(rt.has(a)&&!n.content.trimStart().startsWith("[Tool Error]")){let r=t.readPathById.get(n.id);r!==void 0&&t.succeededReadPaths.push(r)}e?.onToolResult?.(n,o)},"onToolResult")}}i(pn,"wrapEventsForMutationRecording");function ce(e){return[...new Set(e.filter(t=>t.trim().length>0))]}i(ce,"uniqueItems");function it(e){let t=e.verification;if(!t)return;let n=[],o=new Set(e.before.paths.map(H)),a=ce(e.after.paths.map(H)),r=a.filter(m=>!o.has(m)),s=ce(e.mutationRecorder.succeededToolCalls),d=e.acceptToolMutationEvidence?s:[],g=e.acceptToolMutationEvidence?ce(e.mutationRecorder.succeededPaths.map(H)):[],h=r.length>0||d.length>0,y=t.enforcement??"hard",p=(t.requiredChangedPaths??[]).map(m=>ve(m,e.ctx)),b=ce(e.mutationRecorder.succeededReadPaths.map(m=>ve(m,e.ctx))),k=(t.requiredReadPaths??[]).map(m=>ve(m,e.ctx));t.requiresMutation===!0&&(e.before.error!==void 0||e.after.error!==void 0?n.push(`workspace mutation verification could not read changed files: ${e.after.error??e.before.error}`):h||n.push(e.acceptToolMutationEvidence||s.length===0?"expected file mutations, but no new workspace changes or successful write tools were observed":"write tools ran in an isolated worktree, but no main workspace changes were present after cleanup")),e.term.limitReached===!0&&!h&&n.push("workflow child reached its iteration limit before satisfying the task");for(let m of p)!a.includes(m)&&!g.includes(m)&&n.push(`required changed path was not present in workspace changes: ${m}`);for(let m of k)b.includes(m)||n.push(`required review evidence was not read: ${m}`);let F=t.minFinalTextChars;return F!==void 0&&!h&&e.term.finalText.trim().length<F&&n.push(`finalText was shorter than the required ${F} characters`),t.rejectPreparatoryFinalText===!0&&!h&&dt(e.term.finalText)&&n.push("finalText looks preparatory instead of terminal"),{ok:n.length===0,enforcement:y,reasons:n,changedPaths:a,mutationToolCalls:s,mutationEvidence:h,...b.length>0?{readPaths:b}:{}}}i(it,"evaluateVerification");function Se(e,t){if(t.ok)return e;let o=[t.enforcement==="warn"?"[Workflow task completed without verification]":"[Workflow task verification failed]",...t.reasons.map(a=>`- ${a}`)].join(`
2
+ import{o as ye,p as Ye,u as Ze,v as Qe,w as et,z as tt}from"./chunk-WILX5FJH.js";import{Ob as ze,Pb as Ge,Sb as Je,Tb as Xe}from"./chunk-R7YXI7AB.js";import{$g as Ke,Ag as ie,Dg as Ue,Eg as Ve,Gg as Z,Kg as we,Qg as ge,Rg as B,Sg as he,Tg as Be,Wa as oe,_g as He,ah as Le,v as pe}from"./chunk-UHC66D7T.js";import{fa as je}from"./chunk-2AM3FRQ7.js";import{a as i}from"./chunk-ONUPGMER.js";import{basename as xr,dirname as Sr}from"node:path";import{execFile as tn}from"node:child_process";import ae from"node:path";import{promisify as nn}from"node:util";var rn=nn(tn),on=1e4,ct=2,nt=new Set(["write","edit","multi_edit","insert_after_anchor"]),rt=new Set(["read"]);function an(e,t){if(t.includes("*"))return e;if(e.includes("*"))return t;let n=new Set(t);return e.filter(o=>n.has(o))}i(an,"intersectWorkflowToolCeilings");var sn=/^\s*(?:let me|i will|i'll|i am going to)\b[\s\S]{0,120}\b(?:start|create|implement|write|build|plan)\b|^\s*(?:我将|让我|接下来)[\s\S]{0,80}(?:开始|创建|编写|实现|制定)/i;function cn(e){if(e?.timeoutMs!==void 0){if(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0)throw new Error("workflow wait timeoutMs must be a positive number");return Math.floor(e.timeoutMs)}}i(cn,"normalizeWaitTimeoutMs");function ke(e){return e?.requiresMutation===!0||(e?.requiredChangedPaths?.length??0)>0}i(ke,"hasVerificationWork");function H(e){return e.replace(/\\/g,"/").replace(/^\.\//,"").trim()}i(H,"normalizeWorkspacePath");function ve(e,t){let n=t.gitRoot?ae.resolve(t.gitRoot):void 0,o=ae.isAbsolute(e)&&n?ae.relative(n,ae.resolve(e)):e;return H(o)}i(ve,"normalizeRequiredPath");function dn(e){let t=(e.readOnly??!1)===!1?{enforcement:"warn",requiresMutation:!0,rejectPreparatoryFinalText:!0}:void 0;if(e.verification!==void 0){let n={...t??{},...e.verification,enforcement:e.verification.enforcement??"hard"},o=e.verification.requiredChangedPaths;return{verification:{...n,...o!==void 0&&o.length>0&&n.requiresMutation===void 0?{requiresMutation:!0}:{}}}}return{verification:t}}i(dn,"resolveVerificationForInput");function un(e,t){if(t===!0&&e.readOnly===!1)throw new Error(`workflow manifest readOnly=true cannot spawn write-capable child "${e.name}"; set the workflow manifest readOnly=false or use child readOnly:true`);let n=e.readOnly??t??!1;return e.readOnly===n?e:{...e,readOnly:n}}i(un,"resolveSpawnAgentInput");function dt(e){let t=e.trim();return t.length>0&&sn.test(t)}i(dt,"isPreparatoryOnlyText");function ln(e,t){let n=e.trim(),o=t?.trim();return o&&(n.length===0||dt(n))?o:e}i(ln,"selectWorkflowFinalText");async function se(e,t){return await oe({cwd:t}),(await rn("git",[...e],{cwd:t,timeout:on,windowsHide:!0,maxBuffer:4*1024*1024})).stdout.toString()}i(se,"runGit");async function fn(e){let t=e.gitRoot??e.executionCwd??process.cwd(),n=(await se(["rev-parse","--show-toplevel"],t)).trim(),o=await Promise.all([se(["diff","--name-only","--"],n),se(["diff","--cached","--name-only","--"],n),se(["ls-files","--others","--exclude-standard"],n)]);return[...new Set(o.flatMap(a=>a.split(/\r?\n/)).map(H).filter(a=>a.length>0))]}i(fn,"listGitChangedFiles");async function xe(e,t){try{return{paths:(await t(e)).map(H).filter(o=>o.length>0)}}catch(n){return{paths:[],error:n instanceof Error?n.message:String(n)}}}i(xe,"captureChangedPaths");function mn(){return{toolNameById:new Map,toolPathById:new Map,succeededToolCalls:[],succeededPaths:[],readPathById:new Map,succeededReadPaths:[]}}i(mn,"createMutationRecorder");function ot(e){if(e)for(let t of["path","file_path","target_path"]){let n=e[t];if(typeof n=="string"&&n.trim().length>0)return H(n)}}i(ot,"readMutationPath");function pn(e,t){return{...e??{},onToolUseStart:i((n,o)=>{if(nt.has(n.name)){t.toolNameById.set(n.id,n.name);let a=ot(n.input);a!==void 0&&t.toolPathById.set(n.id,a)}if(rt.has(n.name)){let a=ot(n.input);a!==void 0&&t.readPathById.set(n.id,a)}e?.onToolUseStart?.(n,o)},"onToolUseStart"),onToolResult:i((n,o)=>{let a=t.toolNameById.get(n.id)??n.name;if(nt.has(a)&&!n.content.trimStart().startsWith("[Tool Error]")){t.succeededToolCalls.push(a);let r=t.toolPathById.get(n.id);r!==void 0&&t.succeededPaths.push(r)}if(rt.has(a)&&!n.content.trimStart().startsWith("[Tool Error]")){let r=t.readPathById.get(n.id);r!==void 0&&t.succeededReadPaths.push(r)}e?.onToolResult?.(n,o)},"onToolResult")}}i(pn,"wrapEventsForMutationRecording");function ce(e){return[...new Set(e.filter(t=>t.trim().length>0))]}i(ce,"uniqueItems");function it(e){let t=e.verification;if(!t)return;let n=[],o=new Set(e.before.paths.map(H)),a=ce(e.after.paths.map(H)),r=a.filter(m=>!o.has(m)),s=ce(e.mutationRecorder.succeededToolCalls),d=e.acceptToolMutationEvidence?s:[],g=e.acceptToolMutationEvidence?ce(e.mutationRecorder.succeededPaths.map(H)):[],h=r.length>0||d.length>0,y=t.enforcement??"hard",p=(t.requiredChangedPaths??[]).map(m=>ve(m,e.ctx)),b=ce(e.mutationRecorder.succeededReadPaths.map(m=>ve(m,e.ctx))),k=(t.requiredReadPaths??[]).map(m=>ve(m,e.ctx));t.requiresMutation===!0&&(e.before.error!==void 0||e.after.error!==void 0?n.push(`workspace mutation verification could not read changed files: ${e.after.error??e.before.error}`):h||n.push(e.acceptToolMutationEvidence||s.length===0?"expected file mutations, but no new workspace changes or successful write tools were observed":"write tools ran in an isolated worktree, but no main workspace changes were present after cleanup")),e.term.limitReached===!0&&!h&&n.push("workflow child reached its iteration limit before satisfying the task");for(let m of p)!a.includes(m)&&!g.includes(m)&&n.push(`required changed path was not present in workspace changes: ${m}`);for(let m of k)b.includes(m)||n.push(`required review evidence was not read: ${m}`);let F=t.minFinalTextChars;return F!==void 0&&!h&&e.term.finalText.trim().length<F&&n.push(`finalText was shorter than the required ${F} characters`),t.rejectPreparatoryFinalText===!0&&!h&&dt(e.term.finalText)&&n.push("finalText looks preparatory instead of terminal"),{ok:n.length===0,enforcement:y,reasons:n,changedPaths:a,mutationToolCalls:s,mutationEvidence:h,...b.length>0?{readPaths:b}:{}}}i(it,"evaluateVerification");function Se(e,t){if(t.ok)return e;let o=[t.enforcement==="warn"?"[Workflow task completed without verification]":"[Workflow task verification failed]",...t.reasons.map(a=>`- ${a}`)].join(`
3
3
  `);return e.trim().length>0?`${e}
4
4
 
5
5
  ${o}`:o}i(Se,"appendVerificationFailure");function at(){return{ok:!1,enforcement:"warn",reasons:["workflow child reached its iteration limit before satisfying the task"],mutationEvidence:!1}}i(at,"limitReachedWarningVerification");function wn(e){return e.entry.bundle.readOnly!==!0&&e.entry.repairAttempts<ct&&e.term.status==="completed"&&e.verification!==void 0&&e.verification.ok!==!0&&e.verification.enforcement!=="warn"}i(wn,"shouldRepairVerificationFailure");function gn(e){let t=e.verification.reasons.map(o=>`- ${o}`).join(`
@@ -13,7 +13,7 @@ ${s.text}`),rubric:t.rubric??Sn}))).text,findings:o,degraded:a}}i(An,"runParalle
13
13
  `).trim().replace(/[\t\n\f\r ]+/g," ")}i(j,"normalizeText");function mt(e){return j(e).replace(/\\/g,"/")}i(mt,"normalizeLocation");function de(e){return[...new Set(e.map(j).filter(Boolean))].sort((t,n)=>t<n?-1:t>n?1:0)}i(de,"uniqueSorted");function Wn(e,t,n){return En("sha256").update(`${e}\0${mt(t)}\0${j(n)}`,"utf8").digest("hex")}i(Wn,"findingId");function pt(e,t,n){if(!t&&n.specVerdict!=="not-verifiable")throw new Error('review result must use specVerdict "not-verifiable" when requirements are absent');return{specVerdict:n.specVerdict,qualityVerdict:n.qualityVerdict,findings:n.findings.map(o=>{let a=mt(o.location),r=j(o.claim),s=j(o.evidence);return{findingId:Wn(e,a,r),severity:o.severity,location:a,claim:r,evidence:s,...o.suggestedFix?{suggestedFix:j(o.suggestedFix)}:{}}}).sort((o,a)=>o.findingId<a.findingId?-1:o.findingId>a.findingId?1:0),unverifiedRequirements:de(n.unverifiedRequirements)}}i(pt,"normalizeScopedReviewResult");var ft={low:0,medium:1,high:2,critical:3};function Fn(e){return e.reduce((t,n)=>ft[n]>ft[t]?n:t,"low")}i(Fn,"maxSeverity");function wt(e){if(e.length===0)throw new Error("at least one primary review result is required");let t=new Map;for(let a of e)for(let r of a.findings)t.set(r.findingId,[...t.get(r.findingId)??[],r]);let n=[...t.entries()].map(([a,r])=>({findingId:a,severity:Fn(r.map(s=>s.severity)),location:r[0].location,claim:r[0].claim,evidence:de(r.map(s=>s.evidence)),suggestedFixes:de(r.flatMap(s=>s.suggestedFix?[s.suggestedFix]:[]))})).sort((a,r)=>a.findingId<r.findingId?-1:a.findingId>r.findingId?1:0);return{specVerdict:e.some(a=>a.specVerdict==="issues")?"issues":e.some(a=>a.specVerdict==="not-verifiable")?"not-verifiable":"compliant",qualityVerdict:e.some(a=>a.qualityVerdict==="needs-fixes")?"needs-fixes":"approved",findings:n,unverifiedRequirements:de(e.flatMap(a=>a.unverifiedRequirements))}}i(wt,"mergeScopedReviewResults");function gt(e,t){let n=new Set(e.findings.map(s=>s.findingId)),o=new Set;for(let s of t.findings){if(!n.has(s.findingId)||o.has(s.findingId))throw new Error("verifier must return every input findingId exactly once");o.add(s.findingId)}if(o.size!==n.size)throw new Error("verifier must return every input findingId exactly once");let a=new Map(t.findings.map(s=>[s.findingId,s])),r=e.findings.flatMap(s=>{let d=a.get(s.findingId);if(d.disposition==="refuted")return[];let g=d.severityReason?.trim(),h=d.effectiveSeverity!==void 0&&!!g;return[{...s,disposition:d.disposition,severity:h?d.effectiveSeverity:s.severity,verificationEvidence:j(d.evidence),...g?{severityReason:j(g)}:{}}]});return{specVerdict:e.specVerdict,qualityVerdict:e.qualityVerdict,unverifiedRequirements:e.unverifiedRequirements,actionable:r,audit:t,unqualifiedApprovalAllowed:r.length===0&&e.unverifiedRequirements.length===0&&e.specVerdict==="compliant"&&e.qualityVerdict==="approved"}}i(gt,"applyFindingVerification");var On={type:"object",additionalProperties:!1,required:["summary"],properties:{summary:{type:"string"}}};function yt(e){return[e.packetPath,...e.evidenceChunks.map(t=>t.path)]}i(yt,"evidencePaths");function qn(e){let t=ye(e,be);if(t.length>0)throw new Error(`primary reviewer structured result is invalid: ${t.join("; ")}`);return e}i(qn,"rawReview");function Cn(e){let t=ye(e,Te);if(t.length>0)throw new Error(`finding verifier structured result is invalid: ${t.join("; ")}`);return e}i(Cn,"rawVerification");function Ie(e,t){if(e===null||e.status!=="completed")throw new Error(`${t} did not complete; no verdict was accepted`);if(e.verification!==void 0&&!e.verification.ok)throw new Error(`${t} did not read every required packet path; no verdict was accepted`);return e}i(Ie,"resultOrThrow");function $n(e,t,n){return["Review one immutable KodaX packet as an independent third-party reviewer.",`Packet manifest: ${e.packetPath}`,...e.evidenceChunks.map(o=>`Evidence chunk: ${o.path}`),`This packet has binding requirements: ${e.requirementsPresent?"yes":"no"}.`,t?"This is the additional high-risk primary. Actively seek a disagreement with the first reader; do not assume it was correct.":"Own both specification and implementation-quality verdicts for this scope.",n.lean?"Also identify unnecessary additions, but never remove validation, security, data-loss protection, accessibility, or requested behavior.":"",n.reviewFocus?`Additional user focus: ${n.reviewFocus}`:"","Read the manifest and every listed chunk with the read tool before deciding.","Begin with the required JSON result. No preamble or process narration.","The findings array contains only actionable defects, never approval evidence or positive observations.","When the scope is compliant and approved with no actionable defect, findings must be empty.","If a named requirement cannot be proven compliant or violated from surfaced evidence, use specVerdict not-verifiable, list it in unverifiedRequirements, and emit no finding for that uncertainty; absence of evidence is not proof of a defect.","If requirements are absent, specVerdict must be not-verifiable."].filter(Boolean).join(`
14
14
  `)}i($n,"buildScopedReviewPrimaryPrompt");function _n(e,t){return["Independently attempt to refute every candidate finding in this batch.",`Packet manifest: ${e.packetPath}`,...e.evidenceChunks.map(n=>`Evidence chunk: ${n.path}`),`Canonical candidates: ${JSON.stringify(t.findings)}`,"Read the packet evidence. You may run one focused check after naming the concrete doubt.","Return every findingId exactly once. A severity change requires severityReason.","Begin with the required JSON result; no preamble."].join(`
15
15
  `)}i(_n,"buildScopedReviewVerificationPrompt");function Nn(e){return["Synthesize the structured review results below without rereading packet bodies.","Lead with confirmed findings, keep unresolved findings visibly unresolved, omit refuted findings from the actionable list, and never silently downgrade severity.","Cite locations and state explicitly when no actionable issue was confirmed.",JSON.stringify(e)].join(`
16
- `)}i(Nn,"buildScopedReviewFinalPrompt");async function ht(e,t,n,o){let a=Ie(await e.runAgent({name:`${n?"high-risk-":""}primary-${t.partitionKey}`,phase:"primary-review",prompt:$n(t,n,o),scopeSummary:`${t.partitionKey}: ${t.scopePaths.join(", ")}`,constraints:["read every required packet path","return both verdicts","cite evidence at each finding"],readOnly:!0,modelHint:n?"deep":"balanced",verification:{enforcement:"hard",requiredReadPaths:yt(t)},outputSchema:be,terseResult:!0}),"primary reviewer");return e.log({message:`primary read accepted for ${t.partitionKey}`,data:{kind:"review_packet_read",role:"primary",contentHash:t.contentHash}}),qn(a.structured)}i(ht,"runPrimary");async function Dn(e,t,n){if(n.findings.length===0)return{specVerdict:n.specVerdict,qualityVerdict:n.qualityVerdict,unverifiedRequirements:n.unverifiedRequirements,actionable:[],audit:{findings:[]},unqualifiedApprovalAllowed:n.unverifiedRequirements.length===0&&n.specVerdict==="compliant"&&n.qualityVerdict==="approved"};let o=Ie(await e.runAgent({name:`verify-${t.partitionKey}`,phase:"verifier",prompt:_n(t,n),scopeSummary:`verify ${n.findings.length} candidate finding(s) in ${t.partitionKey}`,constraints:["fresh context","attempt refutation","one disposition per findingId"],readOnly:!0,modelHint:"deep",verification:{enforcement:"hard",requiredReadPaths:yt(t)},outputSchema:Te,terseResult:!0}),"finding verifier");return e.log({message:`verification read accepted for ${t.partitionKey}`,data:{kind:"review_packet_read",role:"verification",contentHash:t.contentHash,reason:"candidate findings"}}),gt(n,Cn(o.structured))}i(Dn,"verifyFindings");async function jn(e,t,n){let o=[await ht(e,t,!1,n)];t.riskFlags.includes("routing-high")&&o.push(await ht(e,t,!0,n));let a=o.map(d=>pt(t.contentHash,t.requirementsPresent,d)),r=wt(a),s=await Dn(e,t,r);return e.log({message:`quality gate completed for ${t.partitionKey}`,data:{kind:"review_quality_gate",contentHash:t.contentHash,actionableFindings:s.actionable.length,unresolvedFindings:s.actionable.filter(d=>d.disposition==="unresolved").length,unqualifiedApprovalAllowed:s.unqualifiedApprovalAllowed}}),{contentHash:t.contentHash,result:s}}i(jn,"reviewPacket");async function Un(e,t){if(!Array.isArray(t.packets)||t.packets.length===0)throw new Error("scoped-review requires at least one review packet");let n=await e.parallel(t.packets.map(d=>()=>jn(e,d,t)),{concurrency:4});if(n.some(d=>d===null))throw new Error("one or more scope packets failed review; no final verdict was accepted");let o=n.filter(d=>d!==null);await e.artifact("scoped-review-audit",o);let a=Ie(await e.runAgent({name:"final-review-synthesis",phase:"final-synthesis",prompt:Nn(o),scopeSummary:`cross-scope synthesis for ${o.length} packet(s)`,constraints:["preserve severity","preserve unresolved uncertainty","do not invent evidence"],readOnly:!0,modelHint:"deep",outputSchema:On,terseResult:!0}),"final synthesis"),r=a.structured;return{summary:typeof r?.summary=="string"?r.summary:a.finalText,packetResults:o}}i(Un,"runScopedReview");var kt={meta:{name:"scoped-review",description:"Review immutable scope packets once, verify only candidate findings, then synthesize.",readOnly:!0,phases:["primary-review","verifier","final-synthesis"],maxAgents:64,maxConcurrency:4},run:Un};function vt(e){return{meta:e.meta,run:i((t,n)=>e.run(t,n),"run")}}i(vt,"erase");var xt=[vt(lt),vt(kt)];function St(e){return xt.find(t=>t.meta.name===e)}i(St,"getBuiltinWorkflow");function io(){return xt.map(e=>e.meta)}i(io,"listBuiltinWorkflows");import{mkdir as Pt,readdir as Vn,readFile as Q,rename as Bn,unlink as Ae,writeFile as Ee}from"node:fs/promises";import{basename as Hn,dirname as Me,join as K}from"node:path";import{pathToFileURL as Kn}from"node:url";var Mt=[".workflow.json",".ts",".mjs",".js"],ee="0.7.49";function At(){return"0.7.97-alpha.4"}i(At,"currentKodaxWorkflowVersion");function Ln(e){return e.endsWith(".workflow.json")?"capability-generated":"trusted-local"}i(Ln,"executionForPath");function zn(e){let t=Mt.find(n=>e.endsWith(n));return t?e.slice(0,-t.length):void 0}i(zn,"stripWorkflowSuffix");function We(e){let t=e.trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").slice(0,80);if(!t||t==="."||t==="..")throw new Error("workflow name must contain at least one safe filename character");return t}i(We,"safeWorkflowName");function Fe(e){return typeof e=="object"&&e!==null}i(Fe,"isRecord");function Rt(e,t){let n=e[t];if(typeof n!="string"||n.length===0)throw new Error(`workflow run.json missing ${t}`);return n}i(Rt,"readRequiredString");async function bt(e,t){if(!e)return[];let n;try{n=await Vn(e)}catch{return[]}let o=new Map;for(let a of Mt)for(let r of n){if(!r.endsWith(a))continue;let s=zn(r);if(!s||s.length===0||o.has(s))continue;let d=K(e,r);o.set(s,{name:s,path:d,source:t,execution:Ln(d)})}return[...o.values()]}i(bt,"scanDir");async function te(e){let t=await bt(e.personal,"personal"),n=await bt(e.project,"project"),o=new Map;for(let a of t)o.set(a.name,a);for(let a of n)o.set(a.name,a);return[...o.values()].sort((a,r)=>a.name.localeCompare(r.name))}i(te,"discoverSavedWorkflows");function Gn(e){return typeof e=="object"&&e!==null&&"meta"in e&&"run"in e&&typeof e.run=="function"}i(Gn,"isWorkflowModule");function Jn(e){let t=e.default;if(Gn(t))return t;let n=typeof t=="function"?t:e.run,o=e.workflow??e.meta;if(typeof n=="function"&&typeof o=="object"&&o!==null&&"name"in o)return{meta:o,run:n};throw new Error("invalid workflow module: expected a `{ meta, run }` default export, or `export const workflow = {...}` + a default run function")}i(Jn,"normalizeWorkflowModule");function Xn(e){let t=JSON.parse(e);if(!Fe(t))throw new Error("generated workflow file must be an object");if(t.format!==void 0&&t.format!=="kodax.workflow")throw new Error(`unsupported workflow capsule format: ${String(t.format)}`);if(t.format==="kodax.workflow"){let a=ge(t);return{manifest:a.manifest,source:a.source,capsule:a,legacy:!1}}let n=t.source;if(typeof n!="string"||n.trim().length===0)throw new Error("generated workflow file source must be a non-empty string");let o=Z(t.manifest);return{manifest:o,source:n,capsule:B({minKodaxVersion:ee,manifest:o,source:n}),legacy:!0}}i(Xn,"parseGeneratedWorkflowFile");async function Oe(e){let t=Xn(await Q(e,"utf8"));return t.capsule??B({minKodaxVersion:ee,manifest:t.manifest,source:t.source})}i(Oe,"loadSavedWorkflowCapsule");async function Et(e){if(e.endsWith(".workflow.json"))return he(await Oe(e));let t=await import(Kn(e).href);return Jn(t)}i(Et,"loadSavedWorkflow");function qe(e){if(e.mayUseWorktree===!0)return{environment:["git-repo","worktree-capable"]}}i(qe,"deriveRequirements");function ue(e,t){we(t,{filename:`${e.name}.workflow.js`,requireAsyncRun:!0})}i(ue,"assertGeneratedCapsuleSource");async function Yn(e){let t=We(e.name),n=Z(e.manifest);ue(n,e.source);let o=e.requires??qe(n),a=B({minKodaxVersion:e.minKodaxVersion??ee,manifest:n,source:e.source,...e.intent!==void 0?{intent:e.intent}:{},...e.inputs!==void 0?{inputs:e.inputs}:{},...o!==void 0?{requires:o}:{},...e.provenance!==void 0?{provenance:e.provenance}:{}});await Pt(e.dir,{recursive:!0});let r=K(e.dir,`${t}.workflow.json`);return await Ee(r,`${JSON.stringify(a,null,2)}
16
+ `)}i(Nn,"buildScopedReviewFinalPrompt");async function ht(e,t,n,o){let a=Ie(await e.runAgent({name:`${n?"high-risk-":""}primary-${t.partitionKey}`,phase:"primary-review",prompt:$n(t,n,o),scopeSummary:`${t.partitionKey}: ${t.scopePaths.join(", ")}`,constraints:["read every required packet path","return both verdicts","cite evidence at each finding"],readOnly:!0,modelHint:n?"deep":"balanced",verification:{enforcement:"hard",requiredReadPaths:yt(t)},outputSchema:be,terseResult:!0}),"primary reviewer");return e.log({message:`primary read accepted for ${t.partitionKey}`,data:{kind:"review_packet_read",role:"primary",contentHash:t.contentHash}}),qn(a.structured)}i(ht,"runPrimary");async function Dn(e,t,n){if(n.findings.length===0)return{specVerdict:n.specVerdict,qualityVerdict:n.qualityVerdict,unverifiedRequirements:n.unverifiedRequirements,actionable:[],audit:{findings:[]},unqualifiedApprovalAllowed:n.unverifiedRequirements.length===0&&n.specVerdict==="compliant"&&n.qualityVerdict==="approved"};let o=Ie(await e.runAgent({name:`verify-${t.partitionKey}`,phase:"verifier",prompt:_n(t,n),scopeSummary:`verify ${n.findings.length} candidate finding(s) in ${t.partitionKey}`,constraints:["fresh context","attempt refutation","one disposition per findingId"],readOnly:!0,modelHint:"deep",verification:{enforcement:"hard",requiredReadPaths:yt(t)},outputSchema:Te,terseResult:!0}),"finding verifier");return e.log({message:`verification read accepted for ${t.partitionKey}`,data:{kind:"review_packet_read",role:"verification",contentHash:t.contentHash,reason:"candidate findings"}}),gt(n,Cn(o.structured))}i(Dn,"verifyFindings");async function jn(e,t,n){let o=[await ht(e,t,!1,n)];t.riskFlags.includes("routing-high")&&o.push(await ht(e,t,!0,n));let a=o.map(d=>pt(t.contentHash,t.requirementsPresent,d)),r=wt(a),s=await Dn(e,t,r);return e.log({message:`quality gate completed for ${t.partitionKey}`,data:{kind:"review_quality_gate",contentHash:t.contentHash,actionableFindings:s.actionable.length,unresolvedFindings:s.actionable.filter(d=>d.disposition==="unresolved").length,unqualifiedApprovalAllowed:s.unqualifiedApprovalAllowed}}),{contentHash:t.contentHash,result:s}}i(jn,"reviewPacket");async function Un(e,t){if(!Array.isArray(t.packets)||t.packets.length===0)throw new Error("scoped-review requires at least one review packet");let n=await e.parallel(t.packets.map(d=>()=>jn(e,d,t)),{concurrency:4});if(n.some(d=>d===null))throw new Error("one or more scope packets failed review; no final verdict was accepted");let o=n.filter(d=>d!==null);await e.artifact("scoped-review-audit",o);let a=Ie(await e.runAgent({name:"final-review-synthesis",phase:"final-synthesis",prompt:Nn(o),scopeSummary:`cross-scope synthesis for ${o.length} packet(s)`,constraints:["preserve severity","preserve unresolved uncertainty","do not invent evidence"],readOnly:!0,modelHint:"deep",outputSchema:On,terseResult:!0}),"final synthesis"),r=a.structured;return{summary:typeof r?.summary=="string"?r.summary:a.finalText,packetResults:o}}i(Un,"runScopedReview");var kt={meta:{name:"scoped-review",description:"Review immutable scope packets once, verify only candidate findings, then synthesize.",readOnly:!0,phases:["primary-review","verifier","final-synthesis"],maxAgents:64,maxConcurrency:4},run:Un};function vt(e){return{meta:e.meta,run:i((t,n)=>e.run(t,n),"run")}}i(vt,"erase");var xt=[vt(lt),vt(kt)];function St(e){return xt.find(t=>t.meta.name===e)}i(St,"getBuiltinWorkflow");function io(){return xt.map(e=>e.meta)}i(io,"listBuiltinWorkflows");import{mkdir as Pt,readdir as Vn,readFile as Q,rename as Bn,unlink as Ae,writeFile as Ee}from"node:fs/promises";import{basename as Hn,dirname as Me,join as K}from"node:path";import{pathToFileURL as Kn}from"node:url";var Mt=[".workflow.json",".ts",".mjs",".js"],ee="0.7.49";function At(){return"0.7.97-alpha.6"}i(At,"currentKodaxWorkflowVersion");function Ln(e){return e.endsWith(".workflow.json")?"capability-generated":"trusted-local"}i(Ln,"executionForPath");function zn(e){let t=Mt.find(n=>e.endsWith(n));return t?e.slice(0,-t.length):void 0}i(zn,"stripWorkflowSuffix");function We(e){let t=e.trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[.-]+|[.-]+$/g,"").slice(0,80);if(!t||t==="."||t==="..")throw new Error("workflow name must contain at least one safe filename character");return t}i(We,"safeWorkflowName");function Fe(e){return typeof e=="object"&&e!==null}i(Fe,"isRecord");function Rt(e,t){let n=e[t];if(typeof n!="string"||n.length===0)throw new Error(`workflow run.json missing ${t}`);return n}i(Rt,"readRequiredString");async function bt(e,t){if(!e)return[];let n;try{n=await Vn(e)}catch{return[]}let o=new Map;for(let a of Mt)for(let r of n){if(!r.endsWith(a))continue;let s=zn(r);if(!s||s.length===0||o.has(s))continue;let d=K(e,r);o.set(s,{name:s,path:d,source:t,execution:Ln(d)})}return[...o.values()]}i(bt,"scanDir");async function te(e){let t=await bt(e.personal,"personal"),n=await bt(e.project,"project"),o=new Map;for(let a of t)o.set(a.name,a);for(let a of n)o.set(a.name,a);return[...o.values()].sort((a,r)=>a.name.localeCompare(r.name))}i(te,"discoverSavedWorkflows");function Gn(e){return typeof e=="object"&&e!==null&&"meta"in e&&"run"in e&&typeof e.run=="function"}i(Gn,"isWorkflowModule");function Jn(e){let t=e.default;if(Gn(t))return t;let n=typeof t=="function"?t:e.run,o=e.workflow??e.meta;if(typeof n=="function"&&typeof o=="object"&&o!==null&&"name"in o)return{meta:o,run:n};throw new Error("invalid workflow module: expected a `{ meta, run }` default export, or `export const workflow = {...}` + a default run function")}i(Jn,"normalizeWorkflowModule");function Xn(e){let t=JSON.parse(e);if(!Fe(t))throw new Error("generated workflow file must be an object");if(t.format!==void 0&&t.format!=="kodax.workflow")throw new Error(`unsupported workflow capsule format: ${String(t.format)}`);if(t.format==="kodax.workflow"){let a=ge(t);return{manifest:a.manifest,source:a.source,capsule:a,legacy:!1}}let n=t.source;if(typeof n!="string"||n.trim().length===0)throw new Error("generated workflow file source must be a non-empty string");let o=Z(t.manifest);return{manifest:o,source:n,capsule:B({minKodaxVersion:ee,manifest:o,source:n}),legacy:!0}}i(Xn,"parseGeneratedWorkflowFile");async function Oe(e){let t=Xn(await Q(e,"utf8"));return t.capsule??B({minKodaxVersion:ee,manifest:t.manifest,source:t.source})}i(Oe,"loadSavedWorkflowCapsule");async function Et(e){if(e.endsWith(".workflow.json"))return he(await Oe(e));let t=await import(Kn(e).href);return Jn(t)}i(Et,"loadSavedWorkflow");function qe(e){if(e.mayUseWorktree===!0)return{environment:["git-repo","worktree-capable"]}}i(qe,"deriveRequirements");function ue(e,t){we(t,{filename:`${e.name}.workflow.js`,requireAsyncRun:!0})}i(ue,"assertGeneratedCapsuleSource");async function Yn(e){let t=We(e.name),n=Z(e.manifest);ue(n,e.source);let o=e.requires??qe(n),a=B({minKodaxVersion:e.minKodaxVersion??ee,manifest:n,source:e.source,...e.intent!==void 0?{intent:e.intent}:{},...e.inputs!==void 0?{inputs:e.inputs}:{},...o!==void 0?{requires:o}:{},...e.provenance!==void 0?{provenance:e.provenance}:{}});await Pt(e.dir,{recursive:!0});let r=K(e.dir,`${t}.workflow.json`);return await Ee(r,`${JSON.stringify(a,null,2)}
17
17
  `,"utf8"),{name:t,path:r,source:"project",execution:"capability-generated"}}i(Yn,"saveGeneratedWorkflow");async function Tt(e,t){await Ee(e,`${JSON.stringify(t,null,2)}
18
18
  `,"utf8")}i(Tt,"writeCapsuleFile");async function Zn(e){try{return await Q(e,"utf8"),!0}catch{return!1}}i(Zn,"fileExists");async function mo(e){let t=(await te(e.dirs)).filter(d=>d.name===e.name).filter(d=>e.source===void 0||d.source===e.source);if(t.length===0)throw new Error(`saved workflow not found: ${e.name}`);if(t.length>1)throw new Error(`ambiguous saved workflow name: ${e.name}`);let n=t[0];if(!n.path.endsWith(".workflow.json"))throw new Error("only generated workflow capsules can be renamed");let o=We(e.newName),a=K(Me(n.path),`${o}.workflow.json`);if(a!==n.path&&await Zn(a))throw new Error(`saved workflow already exists: ${o}`);let r=await Oe(n.path);ue(r.manifest,r.source);let s=B({minKodaxVersion:r.minKodaxVersion,manifest:{...r.manifest,name:o},source:r.source,...r.intent!==void 0?{intent:r.intent}:{},...r.inputs!==void 0?{inputs:r.inputs}:{},...r.requires!==void 0?{requires:r.requires}:{},...r.provenance!==void 0?{provenance:r.provenance}:{}});return await Ee(a,`${JSON.stringify(s,null,2)}
19
19
  `,"utf8"),a!==n.path&&await Ae(n.path),{name:o,path:a,source:n.source,execution:"capability-generated"}}i(mo,"renameSavedWorkflow");async function po(e){let t=(await te(e.dirs)).filter(o=>o.name===e.name).filter(o=>e.source===void 0||o.source===e.source);if(t.length===0)throw new Error(`saved workflow not found: ${e.name}`);if(t.length>1)throw new Error(`ambiguous saved workflow name: ${e.name}`);let n=t[0];if(!n.path.endsWith(".workflow.json"))throw new Error("only generated workflow capsules can be deleted");return await Ae(n.path),n}i(po,"deleteSavedWorkflow");async function wo(e){let t=We(e.name),n=(await te(e.dirs)).filter(k=>k.name===t).filter(k=>e.savedSource===void 0||k.source===e.savedSource);if(n.length===0)throw new Error(`saved workflow not found: ${t}`);if(n.length>1)throw new Error(`ambiguous saved workflow name: ${t}`);let o=n[0];if(!o.path.endsWith(".workflow.json"))throw new Error("only generated workflow capsules can be replaced");let a=Z({...e.manifest,name:t});ue(a,e.source);let r=e.requires??qe(a),s=B({minKodaxVersion:e.minKodaxVersion??ee,manifest:a,source:e.source,...e.intent!==void 0?{intent:e.intent}:{},...e.inputs!==void 0?{inputs:e.inputs}:{},...r!==void 0?{requires:r}:{},...e.provenance!==void 0?{provenance:e.provenance}:{}}),d=await Oe(o.path),g=new Date().toISOString().replace(/[:.]/g,"-"),h=K(Me(o.path),".revisions",t),y=`${g}-${process.hrtime.bigint().toString(36)}`,p=K(h,`${t}-${y}.workflow.json`),b=K(Me(o.path),`.${t}.${process.pid}.${Date.now().toString(36)}.tmp`);await Pt(h,{recursive:!0}),await Tt(p,d);try{await Tt(b,s),await Bn(b,o.path)}catch(k){try{await Ae(b)}catch{}throw k}return{name:t,path:o.path,source:o.source,execution:"capability-generated",previousPath:p}}i(wo,"replaceSavedWorkflow");function Qn(e){if(!Fe(e))return;let t=e.request;if(typeof t=="string"&&t.trim().length>0)return t;let n=e.question;if(typeof n=="string"&&n.trim().length>0)return n}i(Qn,"readOptionalOriginalRequest");function Wt(e){return er(e)}i(Wt,"buildCapsuleFromRun");async function er(e){let t=JSON.parse(await Q(K(e.runDir,"run.json"),"utf8"));if(!Fe(t))throw new Error("workflow run.json must be an object");let n=Rt(t,"scriptSnapshotPath"),o=Rt(t,"manifestSnapshotPath"),a=await Q(n,"utf8"),r=Z(JSON.parse(await Q(o,"utf8")));ue(r,a);let s=typeof t.runId=="string"&&t.runId.length>0?t.runId:Hn(e.runDir),d=Qn(t.args),g=qe(r),h=Be(r,d!==void 0?{originalRequest:d}:{}),y={description:"Provide new workflow args matching the generated request shape.",..."args"in t?{examples:[t.args]}:{}};return B({minKodaxVersion:ee,manifest:r,source:a,intent:h,inputs:y,...g!==void 0?{requires:g}:{},provenance:{fromRunId:s,createdAt:new Date().toISOString(),kodaxVersion:At()}})}i(er,"readCapsuleFromRun");async function go(e){let t=await Wt(e);return{capsule:t,module:he(t)}}i(go,"loadGeneratedWorkflowFromRun");async function ho(e){let t=await Wt(e);return Yn({dir:e.targetDir,name:e.name,manifest:t.manifest,source:t.source,...t.intent!==void 0?{intent:t.intent}:{},...t.inputs!==void 0?{inputs:t.inputs}:{},...t.requires!==void 0?{requires:t.requires}:{},...t.provenance!==void 0?{provenance:t.provenance}:{},minKodaxVersion:t.minKodaxVersion})}i(ho,"saveGeneratedWorkflowFromRun");function U(e,t,n,o){e.push({severity:t,requirement:n,message:o})}i(U,"addRequirementIssue");function It(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(e.trim());if(t)return[Number(t[1]),Number(t[2]),Number(t[3])]}i(It,"parseSemver");function tr(e,t){for(let n=0;n<3;n+=1){let o=e[n]-t[n];if(o!==0)return o}return 0}i(tr,"compareSemver");function nr(e,t,n){let o=It(t),a=It(n);if(!o){U(e,"error","kodax:min-version",`workflow minKodaxVersion is not valid semver: ${t}`);return}if(!a){U(e,"warning","kodax:min-version",`cannot verify workflow minKodaxVersion ${t}; current version is unknown`);return}tr(a,o)<0&&U(e,"error","kodax:min-version",`workflow requires KodaX >= ${t}, current version is ${n}`)}i(nr,"addMinVersionIssue");function Pe(e,t,n,o){if(!n)return;if(!o){for(let r of n)U(e,"warning",`${t}:${r}`,`workflow requires ${t}:${r}, but no ${t} inventory was provided`);return}let a=new Set(o);for(let r of n)a.has(r)||U(e,"error",`${t}:${r}`,`missing required workflow ${t}: ${r}`)}i(Pe,"addMissingItems");function yo(e,t={}){let n=ge(e),o=[],a=n.requires;nr(o,n.minKodaxVersion,t.kodaxVersion??At()),a?.environment?.includes("git-repo")&&t.isGitRepo===!1&&U(o,"error","environment:git-repo","workflow requires a git repository"),a?.environment?.includes("worktree-capable")&&t.worktreeCapable===!1&&U(o,"error","environment:worktree-capable","workflow may request git worktree isolation");try{we(n.source,{filename:`${n.manifest.name}.workflow.js`,requireAsyncRun:!0})}catch(r){let s=r instanceof Error?r.message:String(r);U(o,"error","workflow:source",s)}return Pe(o,"tools",a?.tools,t.availableTools),Pe(o,"mcp",a?.mcp,t.availableMcp),Pe(o,"skills",a?.skills,t.availableSkills),{ok:!o.some(r=>r.severity==="error"),issues:o}}i(yo,"preflightWorkflowCapsule");function or(e){return{project:Ft(e,".kodax","workflows"),personal:Ft(rr(),".kodax","workflows")}}i(or,"defaultSavedWorkflowDirs");async function ir(e,t){let o=(await te(t)).find(a=>a.name===e);if(o)return Et(o.path)}i(ir,"resolveSavedByName");function Ot(e){let t=or(e);return async n=>St(n)??await ir(n,t)}i(Ot,"createNestedWorkflowResolver");import{existsSync as ar,mkdirSync as sr,readFileSync as cr,writeFileSync as qt}from"node:fs";import{join as ne}from"node:path";var Ct="results";function $t(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}i($t,"safeKey");function _t(e,t){let n=ne(e,t);if(ar(n))try{return JSON.parse(cr(n,"utf8"))}catch{return}}i(_t,"readResult");function Nt(e,t={}){let n=ne(e,Ct);sr(n,{recursive:!0});let o=t.readFrom?ne(t.readFrom,Ct):void 0;return{get:i(a=>{let r=`${$t(a)}.json`,s=_t(n,r);if(s!==void 0)return s;if(o===void 0)return;let d=_t(o,r);if(d!==void 0){try{qt(ne(n,r),JSON.stringify(d),"utf8")}catch{}return d}},"get"),set:i((a,r)=>{try{qt(ne(n,`${$t(a)}.json`),JSON.stringify(r),"utf8")}catch{}},"set")}}i(Nt,"createFsResultCache");import{mkdirSync as dr,appendFileSync as ur,writeFileSync as fe}from"node:fs";import{join as G}from"node:path";function le(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}i(le,"record");function O(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}i(O,"finiteNumber");function Dt(e){let t=new Map,n=new Set,o=[],a=[],r=new Set,s=[],d=[],g=0,h=0,y=0,p=0,b=0,k=0,F=0,m=0,T={},$=[];for(let q of e){let A=q.data??{};if(q.type==="agent_spawned"){let u=typeof A.taskId=="string"?A.taskId:void 0;u&&t.set(u,A),A.role==="primary-review"&&(k+=1);let w=typeof A.role=="string"?A.role:"agent",x=typeof A.requestedTier=="string"?A.requestedTier:"inherited",I=`${w}/${x}`;T[I]=(T[I]??0)+1;continue}if(q.type==="agent_completed"||q.type==="agent_unverified"||q.type==="agent_failed"){let u=typeof A.taskId=="string"?A.taskId:void 0;if(!u||n.has(u))continue;n.add(u);let w=le(A.usage);!w||typeof w.totalTokens!="number"?typeof t.get(u)?.externalTarget=="string"?a.push(u):o.push(u):(g+=O(w.totalTokens),h+=O(w.inputTokens),y+=O(w.cacheReadTokens??w.cachedReadTokens),p+=O(w.outputTokens));let x=le(A.digestUsage);b+=O(x?.totalTokens),h+=O(x?.inputTokens),p+=O(x?.outputTokens),y+=O(x?.cacheReadTokens??x?.cachedReadTokens),F+=O(A.iterations);continue}if(q.type==="agent_summary_updated"){let u=le(A.usage),w=A.summaryKind;if((w==="digest"||w==="digest-failed")&&u){let x=O(u.totalTokens);g+=x,b+=x,h+=O(u.inputTokens),p+=O(u.outputTokens),y+=O(u.cacheReadTokens??u.cachedReadTokens)}continue}if(q.type!=="workflow_log")continue;let f=le(A.data);if(f?.kind==="review_quality_gate"&&typeof f.contentHash=="string"){$.push({contentHash:f.contentHash,actionableFindings:O(f.actionableFindings),unresolvedFindings:O(f.unresolvedFindings),unqualifiedApprovalAllowed:f.unqualifiedApprovalAllowed===!0});continue}if(f?.kind!=="review_packet_read"||typeof f.contentHash!="string")continue;let l={contentHash:f.contentHash,...typeof f.reason=="string"?{reason:f.reason}:{}};f.role==="primary"?(r.has(f.contentHash)&&(m+=1),r.add(f.contentHash)):f.role==="verification"?s.push(l):f.role==="synthesis"&&d.push(l)}for(let q of t.keys())n.has(q)||o.push(q);let J=[...new Set(o)].sort();return{totalModelTokens:g,inputTokens:h,cacheReadTokens:y,outputTokens:p,digestTokens:b,agentStarts:t.size,childTurns:F,agentStartsByRoleTier:T,primaryReviewStarts:k,duplicatePrimaryPacketReads:m,verificationPacketReads:s,synthesisPacketReads:d,reviewWaves:k>0?1:0,fixWaves:0,rereviewWaves:0,qualityGateOutcomes:$,tokenCoverage:{ok:J.length===0,missingTaskIds:J},excludedExternalTaskIds:[...new Set(a)].sort()}}i(Dt,"buildWorkflowCostReport");function lr(e){let t=e.replace(/[^a-zA-Z0-9._-]/g,"_").slice(0,120);return t.length>0?t:"artifact"}i(lr,"safeWorkflowArtifactName");function jt(e,t={}){let n=t.now??(()=>Date.now()),o=G(e,"artifacts");dr(o,{recursive:!0});let a=G(e,"events.jsonl");return{runDir:e,onEvent:i(r=>{ur(a,`${JSON.stringify({...r,ts:n()})}