patchwarden 0.6.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.en.md +18 -18
  2. package/README.md +20 -20
  3. package/dist/agents/agentRouter.d.ts +40 -0
  4. package/dist/agents/agentRouter.js +95 -0
  5. package/dist/config.d.ts +1 -1
  6. package/dist/config.js +6 -2
  7. package/dist/controlCenter.js +15 -2
  8. package/dist/doctor.js +32 -1
  9. package/dist/goal/acceptanceEngine.d.ts +62 -0
  10. package/dist/goal/acceptanceEngine.js +103 -0
  11. package/dist/goal/acceptanceTemplate.d.ts +10 -0
  12. package/dist/goal/acceptanceTemplate.js +104 -0
  13. package/dist/goal/goalGraph.d.ts +58 -0
  14. package/dist/goal/goalGraph.js +189 -0
  15. package/dist/goal/goalProgress.d.ts +81 -0
  16. package/dist/goal/goalProgress.js +216 -0
  17. package/dist/goal/goalStatus.d.ts +60 -0
  18. package/dist/goal/goalStatus.js +137 -0
  19. package/dist/goal/goalStore.d.ts +79 -0
  20. package/dist/goal/goalStore.js +211 -0
  21. package/dist/goal/handoffExport.d.ts +34 -0
  22. package/dist/goal/handoffExport.js +183 -0
  23. package/dist/goal/subgoalSync.d.ts +40 -0
  24. package/dist/goal/subgoalSync.js +72 -0
  25. package/dist/goal/worktreeManager.d.ts +96 -0
  26. package/dist/goal/worktreeManager.js +292 -0
  27. package/dist/logging.d.ts +44 -0
  28. package/dist/logging.js +68 -0
  29. package/dist/release/releaseGate.d.ts +99 -0
  30. package/dist/release/releaseGate.js +475 -0
  31. package/dist/runner/postTaskCleanup.d.ts +13 -0
  32. package/dist/runner/postTaskCleanup.js +147 -0
  33. package/dist/runner/runTask.js +50 -10
  34. package/dist/security/discoveryTokenStore.d.ts +62 -0
  35. package/dist/security/discoveryTokenStore.js +100 -0
  36. package/dist/security/toolInvocationGuard.d.ts +35 -0
  37. package/dist/security/toolInvocationGuard.js +153 -0
  38. package/dist/smoke-test.js +18 -10
  39. package/dist/taskRuntime.d.ts +17 -0
  40. package/dist/test/unit/acceptance-engine.test.d.ts +1 -0
  41. package/dist/test/unit/acceptance-engine.test.js +228 -0
  42. package/dist/test/unit/agent-router.test.d.ts +1 -0
  43. package/dist/test/unit/agent-router.test.js +287 -0
  44. package/dist/test/unit/audit-checks.test.d.ts +1 -0
  45. package/dist/test/unit/audit-checks.test.js +350 -0
  46. package/dist/test/unit/diagnose-task.test.d.ts +1 -0
  47. package/dist/test/unit/diagnose-task.test.js +457 -0
  48. package/dist/test/unit/discovery-token-store.test.d.ts +1 -0
  49. package/dist/test/unit/discovery-token-store.test.js +139 -0
  50. package/dist/test/unit/goal-graph.test.d.ts +1 -0
  51. package/dist/test/unit/goal-graph.test.js +298 -0
  52. package/dist/test/unit/goal-progress.test.d.ts +1 -0
  53. package/dist/test/unit/goal-progress.test.js +381 -0
  54. package/dist/test/unit/goal-status.test.d.ts +1 -0
  55. package/dist/test/unit/goal-status.test.js +215 -0
  56. package/dist/test/unit/goal-store.test.d.ts +1 -0
  57. package/dist/test/unit/goal-store.test.js +253 -0
  58. package/dist/test/unit/goal-subgoal-task.test.d.ts +1 -0
  59. package/dist/test/unit/goal-subgoal-task.test.js +55 -0
  60. package/dist/test/unit/goal-tools-registry.test.d.ts +1 -0
  61. package/dist/test/unit/goal-tools-registry.test.js +190 -0
  62. package/dist/test/unit/handoff-export.test.d.ts +1 -0
  63. package/dist/test/unit/handoff-export.test.js +263 -0
  64. package/dist/test/unit/invoke-discovered-tool.test.d.ts +1 -0
  65. package/dist/test/unit/invoke-discovered-tool.test.js +167 -0
  66. package/dist/test/unit/logging.test.js +127 -5
  67. package/dist/test/unit/post-task-cleanup.test.d.ts +1 -0
  68. package/dist/test/unit/post-task-cleanup.test.js +48 -0
  69. package/dist/test/unit/reconcile-tasks.test.d.ts +1 -0
  70. package/dist/test/unit/reconcile-tasks.test.js +456 -0
  71. package/dist/test/unit/release-gate.test.d.ts +1 -0
  72. package/dist/test/unit/release-gate.test.js +242 -0
  73. package/dist/test/unit/safe-views.test.d.ts +1 -0
  74. package/dist/test/unit/safe-views.test.js +171 -0
  75. package/dist/test/unit/schema-drift-check.test.d.ts +1 -0
  76. package/dist/test/unit/schema-drift-check.test.js +175 -0
  77. package/dist/test/unit/subgoal-sync.test.d.ts +1 -0
  78. package/dist/test/unit/subgoal-sync.test.js +183 -0
  79. package/dist/test/unit/tool-invocation-guard.test.d.ts +1 -0
  80. package/dist/test/unit/tool-invocation-guard.test.js +432 -0
  81. package/dist/test/unit/tool-usage-stats.test.d.ts +1 -0
  82. package/dist/test/unit/tool-usage-stats.test.js +300 -0
  83. package/dist/test/unit/toolSearch.test.d.ts +1 -0
  84. package/dist/test/unit/toolSearch.test.js +571 -0
  85. package/dist/test/unit/worktree-manager.test.d.ts +1 -0
  86. package/dist/test/unit/worktree-manager.test.js +176 -0
  87. package/dist/tools/auditTask.d.ts +103 -1
  88. package/dist/tools/auditTask.js +461 -8
  89. package/dist/tools/cancelTask.js +1 -1
  90. package/dist/tools/checkReleaseGate.d.ts +21 -0
  91. package/dist/tools/checkReleaseGate.js +22 -0
  92. package/dist/tools/createTask.d.ts +18 -2
  93. package/dist/tools/createTask.js +29 -1
  94. package/dist/tools/diagnoseTask.d.ts +45 -0
  95. package/dist/tools/diagnoseTask.js +347 -0
  96. package/dist/tools/discardWorktree.d.ts +24 -0
  97. package/dist/tools/discardWorktree.js +27 -0
  98. package/dist/tools/discoverTools.d.ts +11 -0
  99. package/dist/tools/discoverTools.js +39 -0
  100. package/dist/tools/explainTool.d.ts +11 -0
  101. package/dist/tools/explainTool.js +21 -0
  102. package/dist/tools/getTaskSummary.js +2 -1
  103. package/dist/tools/goalSubgoalTask.d.ts +51 -0
  104. package/dist/tools/goalSubgoalTask.js +110 -0
  105. package/dist/tools/healthCheck.d.ts +1 -0
  106. package/dist/tools/healthCheck.js +5 -1
  107. package/dist/tools/invokeDiscoveredTool.d.ts +37 -0
  108. package/dist/tools/invokeDiscoveredTool.js +112 -0
  109. package/dist/tools/listTasks.d.ts +3 -1
  110. package/dist/tools/listTasks.js +14 -1
  111. package/dist/tools/mergeWorktree.d.ts +24 -0
  112. package/dist/tools/mergeWorktree.js +27 -0
  113. package/dist/tools/reconcileTasks.d.ts +41 -0
  114. package/dist/tools/reconcileTasks.js +352 -0
  115. package/dist/tools/registry.js +550 -0
  116. package/dist/tools/safeStatus.d.ts +31 -1
  117. package/dist/tools/safeStatus.js +43 -1
  118. package/dist/tools/safeViews.d.ts +256 -0
  119. package/dist/tools/safeViews.js +250 -0
  120. package/dist/tools/schemaDriftCheck.d.ts +46 -0
  121. package/dist/tools/schemaDriftCheck.js +80 -0
  122. package/dist/tools/toolCatalog.d.ts +4 -3
  123. package/dist/tools/toolCatalog.js +33 -11
  124. package/dist/tools/toolRegistry.d.ts +61 -0
  125. package/dist/tools/toolRegistry.js +724 -0
  126. package/dist/tools/toolSearch.d.ts +110 -0
  127. package/dist/tools/toolSearch.js +331 -0
  128. package/dist/tools/toolUsageStats.d.ts +41 -0
  129. package/dist/tools/toolUsageStats.js +116 -0
  130. package/dist/tools/waitForTask.js +1 -0
  131. package/dist/version.d.ts +2 -2
  132. package/dist/version.js +2 -2
  133. package/dist/watcherStatus.d.ts +29 -0
  134. package/dist/watcherStatus.js +92 -1
  135. package/package.json +3 -2
  136. package/scripts/checks/control-smoke.js +2 -2
  137. package/scripts/checks/doctor-smoke.js +1 -0
  138. package/scripts/checks/lifecycle-smoke.js +13 -9
  139. package/scripts/checks/mcp-manifest-check.js +53 -6
  140. package/scripts/checks/mcp-smoke.js +36 -9
  141. package/scripts/checks/watcher-supervisor-smoke.js +2 -2
  142. package/src/agents/agentRouter.ts +149 -0
  143. package/src/config.ts +9 -3
  144. package/src/controlCenter.ts +17 -3
  145. package/src/doctor.ts +36 -1
  146. package/src/goal/acceptanceEngine.ts +160 -0
  147. package/src/goal/acceptanceTemplate.ts +121 -0
  148. package/src/goal/goalGraph.ts +225 -0
  149. package/src/goal/goalProgress.ts +301 -0
  150. package/src/goal/goalStatus.ts +234 -0
  151. package/src/goal/goalStore.ts +306 -0
  152. package/src/goal/handoffExport.ts +211 -0
  153. package/src/goal/subgoalSync.ts +82 -0
  154. package/src/goal/worktreeManager.ts +404 -0
  155. package/src/logging.ts +91 -0
  156. package/src/release/releaseGate.ts +567 -0
  157. package/src/runner/postTaskCleanup.ts +154 -0
  158. package/src/runner/runTask.ts +49 -10
  159. package/src/security/discoveryTokenStore.ts +157 -0
  160. package/src/security/toolInvocationGuard.ts +251 -0
  161. package/src/smoke-test.ts +15 -7
  162. package/src/taskRuntime.ts +17 -0
  163. package/src/test/unit/acceptance-engine.test.ts +261 -0
  164. package/src/test/unit/agent-router.test.ts +342 -0
  165. package/src/test/unit/audit-checks.test.ts +567 -0
  166. package/src/test/unit/diagnose-task.test.ts +544 -0
  167. package/src/test/unit/discovery-token-store.test.ts +181 -0
  168. package/src/test/unit/goal-graph.test.ts +347 -0
  169. package/src/test/unit/goal-progress.test.ts +538 -0
  170. package/src/test/unit/goal-status.test.ts +270 -0
  171. package/src/test/unit/goal-store.test.ts +318 -0
  172. package/src/test/unit/goal-subgoal-task.test.ts +72 -0
  173. package/src/test/unit/goal-tools-registry.test.ts +243 -0
  174. package/src/test/unit/handoff-export.test.ts +295 -0
  175. package/src/test/unit/invoke-discovered-tool.test.ts +216 -0
  176. package/src/test/unit/logging.test.ts +177 -5
  177. package/src/test/unit/post-task-cleanup.test.ts +53 -0
  178. package/src/test/unit/reconcile-tasks.test.ts +551 -0
  179. package/src/test/unit/release-gate.test.ts +314 -0
  180. package/src/test/unit/safe-views.test.ts +184 -0
  181. package/src/test/unit/schema-drift-check.test.ts +258 -0
  182. package/src/test/unit/subgoal-sync.test.ts +236 -0
  183. package/src/test/unit/tool-invocation-guard.test.ts +542 -0
  184. package/src/test/unit/tool-usage-stats.test.ts +384 -0
  185. package/src/test/unit/toolSearch.test.ts +756 -0
  186. package/src/test/unit/worktree-manager.test.ts +247 -0
  187. package/src/tools/auditTask.ts +831 -402
  188. package/src/tools/cancelTask.ts +1 -1
  189. package/src/tools/checkReleaseGate.ts +45 -0
  190. package/src/tools/createTask.ts +64 -6
  191. package/src/tools/diagnoseTask.ts +460 -0
  192. package/src/tools/discardWorktree.ts +42 -0
  193. package/src/tools/discoverTools.ts +51 -0
  194. package/src/tools/explainTool.ts +26 -0
  195. package/src/tools/getTaskSummary.ts +2 -1
  196. package/src/tools/goalSubgoalTask.ts +170 -0
  197. package/src/tools/healthCheck.ts +4 -1
  198. package/src/tools/invokeDiscoveredTool.ts +163 -0
  199. package/src/tools/listTasks.ts +16 -2
  200. package/src/tools/mergeWorktree.ts +42 -0
  201. package/src/tools/reconcileTasks.ts +464 -0
  202. package/src/tools/registry.ts +618 -1
  203. package/src/tools/safeStatus.ts +73 -2
  204. package/src/tools/safeViews.ts +271 -0
  205. package/src/tools/schemaDriftCheck.ts +120 -0
  206. package/src/tools/toolCatalog.ts +34 -11
  207. package/src/tools/toolRegistry.ts +786 -0
  208. package/src/tools/toolSearch.ts +464 -0
  209. package/src/tools/toolUsageStats.ts +151 -0
  210. package/src/tools/waitForTask.ts +1 -0
  211. package/src/version.ts +2 -2
  212. package/src/watcherStatus.ts +97 -1
@@ -0,0 +1,80 @@
1
+ /**
2
+ * v0.9.0: Schema 漂移检测模块。
3
+ *
4
+ * 检测 registry 元数据与实际工具 schema 是否漂移,
5
+ * 并聚合为可被 doctor 自检消费的 SchemaDriftResult。
6
+ *
7
+ * 本模块只做检测和报告,不做运行时阻断。
8
+ */
9
+ import { computeSchemaDigest } from "./toolRegistry.js";
10
+ import { CHATGPT_CORE_TOOL_NAMES } from "./toolCatalog.js";
11
+ /** chatgpt_core profile 的预期工具数(来自 CHATGPT_CORE_TOOL_NAMES)。 */
12
+ const EXPECTED_CORE_COUNT = CHATGPT_CORE_TOOL_NAMES.length;
13
+ // ── 检查 1: registry schema digest 一致性 ─────────────────────────
14
+ /**
15
+ * 检查 registry 中记录的 inputSchemaDigest 与实际 toolDef 的 inputSchema digest 是否一致。
16
+ * toolDefs 中找不到的工具会被跳过(不报 drift)。
17
+ */
18
+ export function checkRegistrySchemaDigest(registry, toolDefs) {
19
+ const warnings = [];
20
+ for (const meta of registry) {
21
+ const toolDef = toolDefs.get(meta.name);
22
+ if (!toolDef)
23
+ continue; // toolDefs 中找不到该工具时跳过(不报 drift)
24
+ const actualDigest = computeSchemaDigest(toolDef.inputSchema);
25
+ if (actualDigest !== meta.inputSchemaDigest) {
26
+ warnings.push(`Schema drift for tool '${meta.name}': registry digest ${meta.inputSchemaDigest} != actual digest ${actualDigest}`);
27
+ }
28
+ }
29
+ return { ok: warnings.length === 0, warnings };
30
+ }
31
+ // ── 检查 2: chatgpt_core manifest 稳定性 ──────────────────────────
32
+ /**
33
+ * 校验 chatgpt_core profile 的工具 manifest 是否稳定。
34
+ *
35
+ * toolCatalog.ts 未导出独立的 manifest hash 计算函数(stableJson 为私有),
36
+ * 因此采用 fallback 方案:校验 CHATGPT_CORE_TOOL_NAMES 中的工具名
37
+ * 全部存在于 toolDefs 中(集合比较,不比较顺序——Map 迭代顺序取决于构造
38
+ * 方式,不一定与 chatgpt_core profile 顺序一致)。
39
+ *
40
+ * 真正的顺序稳定性由 CHATGPT_CORE_TOOL_NAMES 常量本身保证(顺序固定),
41
+ * 如果常量被修改,这里的名称集合比较也会检测到变化。
42
+ */
43
+ export function checkChatgptCoreManifestStable(toolDefs) {
44
+ const warnings = [];
45
+ const expected = [...CHATGPT_CORE_TOOL_NAMES];
46
+ // 检查 CHATGPT_CORE_TOOL_NAMES 中的每个工具是否都存在于 toolDefs
47
+ const missing = expected.filter((name) => !toolDefs.has(name));
48
+ if (missing.length > 0) {
49
+ warnings.push(`chatgpt_core manifest has missing tools: ${missing.join(", ")} (expected ${EXPECTED_CORE_COUNT}, got ${EXPECTED_CORE_COUNT - missing.length})`);
50
+ }
51
+ return { ok: warnings.length === 0, warnings };
52
+ }
53
+ // ── 检查 3: chatgpt_core profile 工具数未变 ───────────────────────
54
+ /**
55
+ * 校验 chatgpt_core profile 的工具数仍与 CHATGPT_CORE_TOOL_NAMES 一致。
56
+ * 用于检测是否有新工具被意外追加到 chatgpt_core profile。
57
+ */
58
+ export function checkNewToolsProfileAppend(registry) {
59
+ const warnings = [];
60
+ const coreCount = registry.filter((t) => t.profiles.includes("chatgpt_core")).length;
61
+ if (coreCount !== EXPECTED_CORE_COUNT) {
62
+ warnings.push(`chatgpt_core profile tool count changed: expected ${EXPECTED_CORE_COUNT}, got ${coreCount}`);
63
+ }
64
+ return { ok: warnings.length === 0, warnings };
65
+ }
66
+ // ── 聚合检查 ──────────────────────────────────────────────────────
67
+ /**
68
+ * 聚合执行所有 schema drift 检查,合并 warnings。
69
+ * ok = warnings.length === 0
70
+ */
71
+ export function runAllSchemaDriftChecks(registry, toolDefs) {
72
+ const warnings = [];
73
+ const r1 = checkRegistrySchemaDigest(registry, toolDefs);
74
+ warnings.push(...r1.warnings);
75
+ const r2 = checkChatgptCoreManifestStable(toolDefs);
76
+ warnings.push(...r2.warnings);
77
+ const r3 = checkNewToolsProfileAppend(registry);
78
+ warnings.push(...r3.warnings);
79
+ return { ok: warnings.length === 0, warnings };
80
+ }
@@ -1,4 +1,4 @@
1
- export type ToolProfile = "full" | "chatgpt_core" | "chatgpt_direct";
1
+ export type ToolProfile = "full" | "chatgpt_core" | "chatgpt_direct" | "chatgpt_search";
2
2
  export interface CatalogTool {
3
3
  name: string;
4
4
  description: string;
@@ -12,8 +12,9 @@ export interface ToolCatalogSnapshot {
12
12
  tool_names: string[];
13
13
  tool_manifest_sha256: string;
14
14
  }
15
- export declare const CHATGPT_CORE_TOOL_NAMES: readonly ["health_check", "list_agents", "list_workspace", "read_workspace_file", "save_plan", "create_task", "wait_for_task", "get_task_summary", "get_diff", "get_result", "get_result_json", "get_test_log", "get_task_status", "list_tasks", "cancel_task", "audit_task", "safe_status"];
16
- export declare const CHATGPT_DIRECT_TOOL_NAMES: readonly ["health_check", "list_workspace", "create_direct_session", "search_workspace", "read_workspace_file", "apply_patch", "run_verification", "finalize_direct_session", "audit_session", "sync_file"];
15
+ export declare const CHATGPT_CORE_TOOL_NAMES: readonly ["health_check", "list_agents", "list_workspace", "read_workspace_file", "save_plan", "create_task", "wait_for_task", "get_task_summary", "get_diff", "get_result", "get_result_json", "get_test_log", "get_task_status", "list_tasks", "cancel_task", "audit_task", "safe_status", "safe_result", "safe_audit", "safe_test_summary", "safe_diff_summary"];
16
+ export declare const CHATGPT_DIRECT_TOOL_NAMES: readonly ["health_check", "list_workspace", "create_direct_session", "search_workspace", "read_workspace_file", "apply_patch", "run_verification", "finalize_direct_session", "audit_session", "safe_direct_summary", "safe_finalize_direct_session", "safe_audit_direct_session", "sync_file"];
17
+ export declare const CHATGPT_SEARCH_TOOL_NAMES: readonly ["health_check", "discover_tools", "explain_tool", "invoke_discovered_tool", "safe_status"];
17
18
  export declare function resolveToolProfile(configProfile?: string): ToolProfile;
18
19
  export declare function selectToolsForProfile<T extends CatalogTool>(tools: T[], profile: ToolProfile, enableDirectProfile?: boolean): T[];
19
20
  export declare function buildToolCatalogSnapshot(tools: CatalogTool[], profile: ToolProfile): ToolCatalogSnapshot;
@@ -18,6 +18,10 @@ export const CHATGPT_CORE_TOOL_NAMES = [
18
18
  "cancel_task",
19
19
  "audit_task",
20
20
  "safe_status",
21
+ "safe_result",
22
+ "safe_audit",
23
+ "safe_test_summary",
24
+ "safe_diff_summary",
21
25
  ];
22
26
  export const CHATGPT_DIRECT_TOOL_NAMES = [
23
27
  "health_check",
@@ -29,13 +33,23 @@ export const CHATGPT_DIRECT_TOOL_NAMES = [
29
33
  "run_verification",
30
34
  "finalize_direct_session",
31
35
  "audit_session",
36
+ "safe_direct_summary",
37
+ "safe_finalize_direct_session",
38
+ "safe_audit_direct_session",
32
39
  "sync_file",
33
40
  ];
41
+ export const CHATGPT_SEARCH_TOOL_NAMES = [
42
+ "health_check",
43
+ "discover_tools",
44
+ "explain_tool",
45
+ "invoke_discovered_tool",
46
+ "safe_status",
47
+ ];
34
48
  let lastSnapshot = null;
35
49
  export function resolveToolProfile(configProfile) {
36
50
  const raw = (process.env.PATCHWARDEN_TOOL_PROFILE || configProfile || "full").trim();
37
- if (raw !== "full" && raw !== "chatgpt_core" && raw !== "chatgpt_direct") {
38
- throw new Error(`Invalid tool profile "${raw}". Expected "full", "chatgpt_core", or "chatgpt_direct".`);
51
+ if (raw !== "full" && raw !== "chatgpt_core" && raw !== "chatgpt_direct" && raw !== "chatgpt_search") {
52
+ throw new Error(`Invalid tool profile "${raw}". Expected "full", "chatgpt_core", "chatgpt_direct", or "chatgpt_search".`);
39
53
  }
40
54
  return raw;
41
55
  }
@@ -51,18 +65,26 @@ export function selectToolsForProfile(tools, profile, enableDirectProfile) {
51
65
  return tool;
52
66
  });
53
67
  }
54
- // chatgpt_direct
55
- if (!enableDirectProfile) {
56
- // Degraded mode: only expose health_check for diagnostics
57
- const tool = byName.get("health_check");
58
- if (!tool)
59
- throw new Error(`chatgpt_direct degraded mode requires missing tool "health_check".`);
60
- return [tool];
68
+ if (profile === "chatgpt_direct") {
69
+ if (!enableDirectProfile) {
70
+ // Degraded mode: only expose health_check for diagnostics
71
+ const tool = byName.get("health_check");
72
+ if (!tool)
73
+ throw new Error(`chatgpt_direct degraded mode requires missing tool "health_check".`);
74
+ return [tool];
75
+ }
76
+ return CHATGPT_DIRECT_TOOL_NAMES.map((name) => {
77
+ const tool = byName.get(name);
78
+ if (!tool)
79
+ throw new Error(`chatgpt_direct tool profile requires missing tool "${name}".`);
80
+ return tool;
81
+ });
61
82
  }
62
- return CHATGPT_DIRECT_TOOL_NAMES.map((name) => {
83
+ // chatgpt_search: compact profile, 5 tools all required, no degraded mode
84
+ return CHATGPT_SEARCH_TOOL_NAMES.map((name) => {
63
85
  const tool = byName.get(name);
64
86
  if (!tool)
65
- throw new Error(`chatgpt_direct tool profile requires missing tool "${name}".`);
87
+ throw new Error(`chatgpt_search tool profile requires missing tool "${name}".`);
66
88
  return tool;
67
89
  });
68
90
  }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * v0.7.1: 统一工具注册表 — SafeToolSearch 只读发现层的基础。
3
+ *
4
+ * 为每个 MCP 工具补全元数据:风险等级、模式、标签、别名、中文意图词。
5
+ * schema digest 使用稳定字段顺序的 canonical JSON → sha256 计算,
6
+ * 用于检测工具 schema 漂移、release check 校验、discover_tools 返回。
7
+ */
8
+ import type { ToolProfile } from "./toolCatalog.js";
9
+ import type { ToolDef } from "./registry.js";
10
+ export type ToolRisk = "readonly" | "workspace_read_sensitive" | "workspace_write" | "command" | "release" | "credential_sensitive";
11
+ export declare const TOOL_RISK_RANK: Record<ToolRisk, number>;
12
+ export type ToolMode = "delegate" | "direct" | "audit" | "release" | "diagnostic";
13
+ export interface PatchWardenToolMeta {
14
+ name: string;
15
+ title: string;
16
+ summary: string;
17
+ description: string;
18
+ profiles: ToolProfile[];
19
+ modes: ToolMode[];
20
+ tags: string[];
21
+ aliases: string[];
22
+ risk: ToolRisk;
23
+ requiresConfirmation: boolean;
24
+ /** sha256 of canonical-JSON(inputSchema),用于检测 schema 漂移 */
25
+ inputSchemaDigest: string;
26
+ relatedTools?: string[];
27
+ examples?: string[];
28
+ }
29
+ export declare const INTENT_TERMS: Record<string, string[]>;
30
+ interface StaticToolMeta {
31
+ title: string;
32
+ summary: string;
33
+ profiles: ToolProfile[];
34
+ modes: ToolMode[];
35
+ tags: string[];
36
+ aliases: string[];
37
+ risk: ToolRisk;
38
+ requiresConfirmation: boolean;
39
+ relatedTools?: string[];
40
+ examples?: string[];
41
+ }
42
+ /**
43
+ * 稳定 JSON 序列化:按字段名排序,避免 key 顺序导致 digest 漂移。
44
+ */
45
+ export declare function stableJsonStringify(value: unknown): string;
46
+ /**
47
+ * 计算 inputSchema 的 sha256 digest。
48
+ * 返回格式:"sha256:<hex>"
49
+ */
50
+ export declare function computeSchemaDigest(inputSchema: unknown): string;
51
+ /**
52
+ * 从 ToolDef[] 构建带元数据的完整工具注册表。
53
+ * 静态元数据来自 STATIC_TOOL_META,schema digest 动态计算。
54
+ * 未在 STATIC_TOOL_META 中注册的工具会被跳过(不报错,保持前向兼容)。
55
+ */
56
+ export declare function buildToolRegistry(tools: ToolDef[]): PatchWardenToolMeta[];
57
+ /**
58
+ * 获取单个工具的元数据(不含 schema digest,digest 需从 registry 获取)。
59
+ */
60
+ export declare function getStaticToolMeta(name: string): StaticToolMeta | undefined;
61
+ export {};