@thincoder/core 0.10.13 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/advisor/messages.mjs +4 -2
  3. package/advisor/notice.mjs +1 -1
  4. package/advisor/project-context.mjs +121 -11
  5. package/agent/completion.mjs +13 -1
  6. package/agent/digest-account.mjs +73 -46
  7. package/agent/dispatch-run.mjs +1 -1
  8. package/agent/dispatch.mjs +29 -21
  9. package/agent/family-tools.mjs +9 -5
  10. package/agent/helpers.mjs +1 -94
  11. package/agent/offload.mjs +88 -0
  12. package/agent/record-results.mjs +1 -6
  13. package/agent/run-stages.mjs +69 -48
  14. package/agent/run-start.mjs +8 -8
  15. package/agent/setup.mjs +3 -11
  16. package/agent/suspension.mjs +1 -1
  17. package/agent/turn-loop.mjs +32 -3
  18. package/agent/write-face.mjs +99 -0
  19. package/agent/write-gate.mjs +354 -5
  20. package/agent-tools/advisor.mjs +127 -11
  21. package/agent-tools/async-settle.mjs +2 -2
  22. package/agent-tools/bash-async.mjs +8 -2
  23. package/agent-tools/batch-closeout.mjs +206 -0
  24. package/agent-tools/batch-gate.mjs +287 -73
  25. package/agent-tools/batch-ledger-bind.mjs +183 -0
  26. package/agent-tools/batch-ledger-link.mjs +73 -0
  27. package/agent-tools/batch-lifecycle.mjs +113 -367
  28. package/agent-tools/batch-paths.mjs +45 -40
  29. package/agent-tools/batch-read.mjs +1 -1
  30. package/agent-tools/batch-reopen.mjs +142 -0
  31. package/agent-tools/batch-skeleton.mjs +275 -80
  32. package/agent-tools/batch.mjs +243 -50
  33. package/agent-tools/context.mjs +6 -3
  34. package/agent-tools/design-slots.mjs +24 -24
  35. package/agent-tools/design-token.mjs +96 -15
  36. package/agent-tools/doc-check.mjs +18 -2
  37. package/agent-tools/eng.mjs +1 -1
  38. package/agent-tools/escalate-async.mjs +3 -3
  39. package/agent-tools/manifest.mjs +8 -5
  40. package/agent-tools/read-history.mjs +5 -5
  41. package/agent-tools/review-facts.mjs +31 -13
  42. package/agent-tools/spawn-gates.mjs +10 -14
  43. package/agent-tools/ssh-session.mjs +120 -111
  44. package/agent-tools/ssh-transfer.mjs +210 -0
  45. package/agent-tools/ssh-transport.mjs +277 -46
  46. package/agent-tools/subagent-actions-query.mjs +1 -1
  47. package/agent-tools/subagent-actions.mjs +1 -1
  48. package/agent-tools/subagent-async.mjs +3 -2
  49. package/agent-tools/subagent-scheduler.mjs +43 -9
  50. package/agent-tools/subagent-spawn.mjs +68 -9
  51. package/agent-tools/subagent.mjs +16 -14
  52. package/client-identity.mjs +22 -6
  53. package/config-presets.mjs +5 -3
  54. package/context.mjs +34 -3
  55. package/declaration.mjs +2 -2
  56. package/doc-check/anchors.mjs +128 -28
  57. package/doc-check/index.mjs +68 -15
  58. package/doc-check/line-refs.mjs +112 -0
  59. package/doc-check/paragraph.mjs +18 -5
  60. package/explore-distill.mjs +1 -1
  61. package/i18n.mjs +1 -1
  62. package/index-discover.mjs +4 -1
  63. package/ledger-close-proof.mjs +19 -37
  64. package/ledger-cmd.mjs +71 -195
  65. package/ledger-db.mjs +29 -28
  66. package/ledger-migrate.mjs +4 -4
  67. package/ledger-read.mjs +10 -8
  68. package/ledger-surface.mjs +1 -1
  69. package/ledger-tools.mjs +6 -6
  70. package/ledger-variant-notice.mjs +1 -1
  71. package/ledger-write-ops.mjs +373 -0
  72. package/ledger.mjs +2 -2
  73. package/manifest-discovery.mjs +2 -2
  74. package/manifest-schema.mjs +4 -0
  75. package/memory/memory-tool.mjs +5 -2
  76. package/memory/schema.mjs +5 -26
  77. package/package.json +1 -1
  78. package/path-resolve.mjs +217 -0
  79. package/permission.mjs +4 -0
  80. package/prompt-overlays.mjs +5 -0
  81. package/prompts/advisor-design.md +9 -6
  82. package/prompts/advisor-round1.md +4 -3
  83. package/prompts/advisor-round2.md +6 -5
  84. package/prompts/advisor-round3.md +6 -5
  85. package/prompts/common.md +23 -10
  86. package/prompts/consult-base.md +2 -1
  87. package/prompts/discipline-engineering.md +29 -48
  88. package/prompts/discipline-normal.md +10 -5
  89. package/prompts/persona-eng-coder.md +8 -0
  90. package/prompts/persona-eng-designer.md +22 -12
  91. package/prompts/persona-engineering.md +81 -68
  92. package/prompts/persona-plan.md +2 -1
  93. package/prompts/persona-tester.md +55 -0
  94. package/provider/core.mjs +2 -2
  95. package/provider/google.mjs +15 -5
  96. package/provider/rate.mjs +11 -3
  97. package/provider/sse.mjs +15 -4
  98. package/session-identity.mjs +21 -0
  99. package/session-lifecycle.mjs +9 -4
  100. package/session-slots.mjs +9 -14
  101. package/session.mjs +5 -0
  102. package/skip-dirs.mjs +48 -0
  103. package/team-ledger.mjs +4 -4
  104. package/text-budget.mjs +4 -0
  105. package/token-window.mjs +90 -14
  106. package/tool-docs/advisor.md +2 -2
  107. package/tool-docs/apply_patch.md +2 -0
  108. package/tool-docs/bash.md +4 -0
  109. package/tool-docs/batch.md +85 -1
  110. package/tool-docs/browser.md +3 -1
  111. package/tool-docs/code_search.md +3 -1
  112. package/tool-docs/consult_start.md +6 -2
  113. package/tool-docs/consult_stop.md +3 -1
  114. package/tool-docs/delete.md +3 -0
  115. package/tool-docs/doc_check.md +43 -8
  116. package/tool-docs/doc_search.md +5 -1
  117. package/tool-docs/edit.md +22 -1
  118. package/tool-docs/execute.md +7 -1
  119. package/tool-docs/fetch.md +3 -1
  120. package/tool-docs/file_ops.md +3 -1
  121. package/tool-docs/git.md +9 -1
  122. package/tool-docs/goal.md +2 -0
  123. package/tool-docs/grep.md +1 -1
  124. package/tool-docs/hashline_edit.md +2 -0
  125. package/tool-docs/insert_after.md +3 -1
  126. package/tool-docs/ledger.md +5 -5
  127. package/tool-docs/lint.md +1 -0
  128. package/tool-docs/manifest-read.md +2 -1
  129. package/tool-docs/manifest.md +9 -2
  130. package/tool-docs/memory.md +11 -1
  131. package/tool-docs/notify_parent.md +1 -1
  132. package/tool-docs/plan.md +2 -0
  133. package/tool-docs/question.md +1 -1
  134. package/tool-docs/read_history.md +15 -3
  135. package/tool-docs/read_image.md +3 -1
  136. package/tool-docs/recent_changes.md +3 -1
  137. package/tool-docs/repo_outline.md +3 -1
  138. package/tool-docs/settings.md +10 -2
  139. package/tool-docs/skill.md +2 -0
  140. package/tool-docs/ssh.md +30 -17
  141. package/tool-docs/subagent.md +50 -13
  142. package/tool-docs/task.md +2 -0
  143. package/tool-docs/team_ledger.md +1 -1
  144. package/tool-docs/timer.md +7 -0
  145. package/tool-docs/verify.md +13 -1
  146. package/tool-docs/websearch.md +3 -1
  147. package/tool-docs/write.md +2 -0
  148. package/tools/bash.mjs +12 -2
  149. package/tools/edit-batch.mjs +40 -33
  150. package/tools/edit-diff.mjs +69 -1
  151. package/tools/execute.mjs +10 -4
  152. package/tools/file.mjs +17 -27
  153. package/tools/git.mjs +27 -1
  154. package/tools/ops.mjs +2 -1
  155. package/tools/patch.mjs +12 -3
  156. package/tools/process-doc-mark.mjs +139 -0
  157. package/tools/search.mjs +15 -6
  158. package/tools/shared.mjs +24 -1
  159. package/tools/ssh.mjs +48 -7
  160. package/tools/tree.mjs +4 -1
  161. package/tools/write-path.mjs +64 -3
  162. package/traces/trace-store.mjs +4 -3
  163. package/agent/light-round.mjs +0 -63
  164. package/agent/unbooked-pen.mjs +0 -62
@@ -0,0 +1,73 @@
1
+ /**
2
+ * agent-tools/batch-ledger-link.mjs — 账链门判据(设计单源 = `docs/core/design/ADVISOR-GUARDS.md` §2 第 7 条):
3
+ * 一本已解析成绝对路径的批档,台账里还有没有**至少一行未决行**的 `task_book` 指着它。
4
+ *
5
+ * 为什么另立本档(设计档同条「三问(新档)」):
6
+ * - `resolveBatchRows`(`thincoder-core/ledger-write-ops.mjs`)= 选行判据**单源**,直接复用(判同址、不判串等值
7
+ * ——同一批档的三种指针写法并存,串等值会漏行);「未决」= `PENDING_STATUSES`(`thincoder-core/ledger-db.mjs`)
8
+ * ——产品的未决定义已存在一处,另立词表 = 第二份词表(漂移源);
9
+ * - `ledgerBindBatch`(`thincoder-core/agent-tools/batch-ledger-bind.mjs`)是**写面绑定**(入参 = 行号 + 批档,
10
+ * 出参 = 写入结果),把读判据塞进去会让「建档绑行」与「点火读账」两件事共用一个出口;
11
+ * - 读面包装 `ledgerBatchRows` 不能直接复用:无根即抛、库不在即返回空集——本门要在同一个出口把
12
+ * 「无根 ∥ 库不在盘 ∥ 坏档 ∥ 零行」四形分开报(`reason` 三值 + `db` 读数),且**四形全落「拒」**、
13
+ * 零路径落「放行」(`if (!db) 放行` 把「账读不到」判成「账不必看」,与本档用途相反)。
14
+ *
15
+ * 台账链一律**动态 import**(`thincoder-core/ledger-db.mjs` 静态引 `node:sqlite` ⇒ 消费侧静态 import 破 W8 契约②;
16
+ * 手法同 `thincoder-core/agent-tools/batch-ledger-bind.mjs`):本档零静态仓内依赖,可被工具层静态引用。
17
+ *
18
+ * 读面零写:只读开库(`readOnly: true` ⇒ 零 DDL / 零 ALTER / 零 `markSchemaVersion`)——门读账不建库、不改库。
19
+ * 零模式位:本档不读模式位、无模式分支、无豁免分支(判据是「做没做评审」,不是「什么模式」)。
20
+ */
21
+ import { existsSync } from "node:fs"
22
+
23
+ /**
24
+ * 账链判据(**纯读**——一次根解析 → 只读开库 → 选行 → 未决过滤 → 关库;不抛业务异常)。
25
+ *
26
+ * 读序单源 = 设计档 §2 第 7 条「读序」五步:`resolveLedgerRoot(batchDocAbs, anchor)` →
27
+ * `openLedger(root, { readOnly: true, boundary: anchor })` → `resolveBatchRows(db, root, batchDocAbs)` →
28
+ * `PENDING_STATUSES` 过滤 → `db.close()`(finally)。
29
+ *
30
+ * @param {{batchDocAbs: string, anchor: string}} o `batchDocAbs` = 批档绝对路径(已由 `resolveBatchDocPath` 解析);
31
+ * `anchor` = 会话锚(`agent.cwd`——与 `openLedger` 同一枚上界:同一笔动作的判据不设两界)
32
+ * @returns {Promise<{ok: boolean, reason: string|null, root: string|null, dbFile: string|null,
33
+ * db: "open"|"not-on-disk"|"unreadable"|null, rows: number, unsettled: number}>}
34
+ * `ok` = 放行;`reason` = 三值之一(`ok` 时 null);`root` / `dbFile` / `db` / `rows` / `unsettled` = 拒文
35
+ * `Record:` 行的读数——`db` 一项决定修复路径能不能选(`not on disk` 时库里没有可改的行)
36
+ */
37
+ export async function resolveBatchLedgerLink({ batchDocAbs, anchor }) {
38
+ // 台账族导出面(`thincoder-core/ledger.mjs` = 公共面单源)+ 选行单源(`resolveBatchRows` 只从拆分件导出——
39
+ // 族面只 re-export 了它的包装 `ledgerBatchRows`,那个包装把「无根 ∥ 库不在」两种成因并成抛 / 空集)
40
+ const { ledgerDbPath, openLedger, PENDING_STATUSES, resolveLedgerRoot } = await import("../ledger.mjs")
41
+ const { resolveBatchRows } = await import("../ledger-write-ops.mjs")
42
+
43
+ const derived = resolveLedgerRoot(batchDocAbs, anchor)
44
+ const root = derived?.root ?? null
45
+ let dbFile = null
46
+ if (root) { try { dbFile = ledgerDbPath(root, anchor) } catch { dbFile = null } }
47
+ /** 拒形(四形共用一处形状——读数缺省值集中在这里,不在每个 return 各写一遍)。
48
+ * `reason` 三值 = `no-pending-row` / `no-ledger-root` / `ledger-unreadable`(同一拒发口靠 reason 分叉,
49
+ * 不另立 criterion——单源 = 设计档 §2 第 7 条「失败路径全落拒」表)。 */
50
+ const refuse = (reason, extra = {}) => ({ ok: false, reason, root, dbFile, db: null, rows: 0, unsettled: 0, ...extra })
51
+
52
+ if (!root) return refuse("no-ledger-root") // 批档不在任何已注册项目内 ∥ 会话锚外 ⇒ 零行可判
53
+
54
+ let db = null
55
+ try {
56
+ db = openLedger(root, { readOnly: true, boundary: anchor })
57
+ } catch {
58
+ return refuse("ledger-unreadable", { db: "unreadable" }) // 坏档 ∥ 目录不在 ⇒ 门内 catch(不 throw 外逸)
59
+ }
60
+ // 库不在盘(`not on disk`)∥ 非台账库(档在盘、无 items 表 ⇒ 读不成台账 ⇒ `unreadable`):
61
+ // 两形同为 `no-pending-row`(零行可判 = 这条账不存在),`db` 读数把成因分开
62
+ if (!db) return refuse("no-pending-row", { db: dbFile && existsSync(dbFile) ? "unreadable" : "not-on-disk" })
63
+
64
+ try {
65
+ const rows = resolveBatchRows(db, root, batchDocAbs)
66
+ const unsettled = rows.filter((r) => PENDING_STATUSES.includes(r.status)).length
67
+ return { ok: unsettled > 0, reason: unsettled > 0 ? null : "no-pending-row", root, dbFile, db: "open", rows: rows.length, unsettled }
68
+ } catch {
69
+ return refuse("ledger-unreadable", { db: "unreadable" }) // 选行读失败同判:读不到账 ⇒ 拒
70
+ } finally {
71
+ try { db.close() } catch { /* 已关 / 未开 */ }
72
+ }
73
+ }