@oratis/lisa 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/README.md +123 -16
  2. package/README.zh-CN.md +101 -15
  3. package/completions/_lisa +56 -0
  4. package/completions/lisa.bash +35 -1
  5. package/completions/lisa.fish +18 -1
  6. package/dist/advisor/engine.d.ts +7 -0
  7. package/dist/advisor/engine.d.ts.map +1 -1
  8. package/dist/advisor/engine.js +12 -0
  9. package/dist/advisor/engine.js.map +1 -1
  10. package/dist/agent.d.ts +14 -0
  11. package/dist/agent.d.ts.map +1 -1
  12. package/dist/agent.js +58 -7
  13. package/dist/agent.js.map +1 -1
  14. package/dist/agents/managed.d.ts +108 -0
  15. package/dist/agents/managed.d.ts.map +1 -0
  16. package/dist/agents/managed.js +241 -0
  17. package/dist/agents/managed.js.map +1 -0
  18. package/dist/agents/pty.d.ts +155 -0
  19. package/dist/agents/pty.d.ts.map +1 -0
  20. package/dist/agents/pty.js +299 -0
  21. package/dist/agents/pty.js.map +1 -0
  22. package/dist/approval.d.ts +13 -0
  23. package/dist/approval.d.ts.map +1 -1
  24. package/dist/approval.js +25 -2
  25. package/dist/approval.js.map +1 -1
  26. package/dist/autonomy/runs.d.ts +33 -0
  27. package/dist/autonomy/runs.d.ts.map +1 -0
  28. package/dist/autonomy/runs.js +106 -0
  29. package/dist/autonomy/runs.js.map +1 -0
  30. package/dist/channels/feishu.d.ts.map +1 -1
  31. package/dist/channels/feishu.js +65 -0
  32. package/dist/channels/feishu.js.map +1 -1
  33. package/dist/channels/router.d.ts +7 -0
  34. package/dist/channels/router.d.ts.map +1 -1
  35. package/dist/channels/router.js +1 -1
  36. package/dist/channels/router.js.map +1 -1
  37. package/dist/cli/agents-pty.d.ts +18 -0
  38. package/dist/cli/agents-pty.d.ts.map +1 -0
  39. package/dist/cli/agents-pty.js +182 -0
  40. package/dist/cli/agents-pty.js.map +1 -0
  41. package/dist/cli/agents.d.ts +2 -0
  42. package/dist/cli/agents.d.ts.map +1 -0
  43. package/dist/cli/agents.js +65 -0
  44. package/dist/cli/agents.js.map +1 -0
  45. package/dist/cli/consent.d.ts +2 -0
  46. package/dist/cli/consent.d.ts.map +1 -0
  47. package/dist/cli/consent.js +57 -0
  48. package/dist/cli/consent.js.map +1 -0
  49. package/dist/cli/model.d.ts +2 -0
  50. package/dist/cli/model.d.ts.map +1 -0
  51. package/dist/cli/model.js +121 -0
  52. package/dist/cli/model.js.map +1 -0
  53. package/dist/cli/sense.d.ts +2 -0
  54. package/dist/cli/sense.d.ts.map +1 -0
  55. package/dist/cli/sense.js +36 -0
  56. package/dist/cli/sense.js.map +1 -0
  57. package/dist/cli.js +117 -12
  58. package/dist/cli.js.map +1 -1
  59. package/dist/consent/blacklist.d.ts +28 -0
  60. package/dist/consent/blacklist.d.ts.map +1 -0
  61. package/dist/consent/blacklist.js +78 -0
  62. package/dist/consent/blacklist.js.map +1 -0
  63. package/dist/consent/store.d.ts +45 -0
  64. package/dist/consent/store.d.ts.map +1 -0
  65. package/dist/consent/store.js +126 -0
  66. package/dist/consent/store.js.map +1 -0
  67. package/dist/control/policy.d.ts +13 -0
  68. package/dist/control/policy.d.ts.map +1 -0
  69. package/dist/control/policy.js +57 -0
  70. package/dist/control/policy.js.map +1 -0
  71. package/dist/heartbeat/runner.d.ts.map +1 -1
  72. package/dist/heartbeat/runner.js +70 -14
  73. package/dist/heartbeat/runner.js.map +1 -1
  74. package/dist/idle/runner.d.ts.map +1 -1
  75. package/dist/idle/runner.js +87 -17
  76. package/dist/idle/runner.js.map +1 -1
  77. package/dist/integrations/aider/observer.d.ts +21 -1
  78. package/dist/integrations/aider/observer.d.ts.map +1 -1
  79. package/dist/integrations/aider/observer.js +110 -1
  80. package/dist/integrations/aider/observer.js.map +1 -1
  81. package/dist/integrations/claude-code/liveness.d.ts +10 -0
  82. package/dist/integrations/claude-code/liveness.d.ts.map +1 -0
  83. package/dist/integrations/claude-code/liveness.js +62 -0
  84. package/dist/integrations/claude-code/liveness.js.map +1 -0
  85. package/dist/integrations/claude-code/watcher.d.ts +39 -4
  86. package/dist/integrations/claude-code/watcher.d.ts.map +1 -1
  87. package/dist/integrations/claude-code/watcher.js +94 -57
  88. package/dist/integrations/claude-code/watcher.js.map +1 -1
  89. package/dist/integrations/codex/observer.d.ts +19 -6
  90. package/dist/integrations/codex/observer.d.ts.map +1 -1
  91. package/dist/integrations/codex/observer.js +228 -4
  92. package/dist/integrations/codex/observer.js.map +1 -1
  93. package/dist/integrations/dispatch-ledger.d.ts +30 -1
  94. package/dist/integrations/dispatch-ledger.d.ts.map +1 -1
  95. package/dist/integrations/dispatch-ledger.js +75 -9
  96. package/dist/integrations/dispatch-ledger.js.map +1 -1
  97. package/dist/integrations/git/branch.d.ts +11 -0
  98. package/dist/integrations/git/branch.d.ts.map +1 -0
  99. package/dist/integrations/git/branch.js +49 -0
  100. package/dist/integrations/git/branch.js.map +1 -0
  101. package/dist/integrations/git/observer.d.ts +39 -0
  102. package/dist/integrations/git/observer.d.ts.map +1 -0
  103. package/dist/integrations/git/observer.js +252 -0
  104. package/dist/integrations/git/observer.js.map +1 -0
  105. package/dist/integrations/github-pr/observer.d.ts.map +1 -1
  106. package/dist/integrations/github-pr/observer.js +7 -2
  107. package/dist/integrations/github-pr/observer.js.map +1 -1
  108. package/dist/integrations/hub.d.ts +8 -0
  109. package/dist/integrations/hub.d.ts.map +1 -1
  110. package/dist/integrations/hub.js +39 -1
  111. package/dist/integrations/hub.js.map +1 -1
  112. package/dist/integrations/managed/observer.d.ts +17 -0
  113. package/dist/integrations/managed/observer.d.ts.map +1 -0
  114. package/dist/integrations/managed/observer.js +46 -0
  115. package/dist/integrations/managed/observer.js.map +1 -0
  116. package/dist/integrations/opencode/observer.d.ts +53 -5
  117. package/dist/integrations/opencode/observer.d.ts.map +1 -1
  118. package/dist/integrations/opencode/observer.js +242 -20
  119. package/dist/integrations/opencode/observer.js.map +1 -1
  120. package/dist/integrations/pty/observer.d.ts +25 -0
  121. package/dist/integrations/pty/observer.d.ts.map +1 -0
  122. package/dist/integrations/pty/observer.js +48 -0
  123. package/dist/integrations/pty/observer.js.map +1 -0
  124. package/dist/integrations/registry.d.ts.map +1 -1
  125. package/dist/integrations/registry.js +5 -0
  126. package/dist/integrations/registry.js.map +1 -1
  127. package/dist/integrations/shell/observer.d.ts +33 -0
  128. package/dist/integrations/shell/observer.d.ts.map +1 -0
  129. package/dist/integrations/shell/observer.js +223 -0
  130. package/dist/integrations/shell/observer.js.map +1 -0
  131. package/dist/integrations/takoapi/a2a.d.ts +38 -0
  132. package/dist/integrations/takoapi/a2a.d.ts.map +1 -0
  133. package/dist/integrations/takoapi/a2a.js +70 -0
  134. package/dist/integrations/takoapi/a2a.js.map +1 -0
  135. package/dist/integrations/takoapi/ledger.d.ts +32 -0
  136. package/dist/integrations/takoapi/ledger.d.ts.map +1 -0
  137. package/dist/integrations/takoapi/ledger.js +96 -0
  138. package/dist/integrations/takoapi/ledger.js.map +1 -0
  139. package/dist/integrations/takoapi/observer.d.ts +39 -0
  140. package/dist/integrations/takoapi/observer.d.ts.map +1 -0
  141. package/dist/integrations/takoapi/observer.js +102 -0
  142. package/dist/integrations/takoapi/observer.js.map +1 -0
  143. package/dist/integrations/types.d.ts +17 -0
  144. package/dist/integrations/types.d.ts.map +1 -1
  145. package/dist/mcp/client.d.ts +5 -0
  146. package/dist/mcp/client.d.ts.map +1 -1
  147. package/dist/mcp/client.js +1 -1
  148. package/dist/mcp/client.js.map +1 -1
  149. package/dist/memory/embedding.d.ts +45 -0
  150. package/dist/memory/embedding.d.ts.map +1 -0
  151. package/dist/memory/embedding.js +139 -0
  152. package/dist/memory/embedding.js.map +1 -0
  153. package/dist/memory/search_tool.d.ts.map +1 -1
  154. package/dist/memory/search_tool.js +6 -2
  155. package/dist/memory/search_tool.js.map +1 -1
  156. package/dist/memory/vector.d.ts +14 -3
  157. package/dist/memory/vector.d.ts.map +1 -1
  158. package/dist/memory/vector.js +50 -0
  159. package/dist/memory/vector.js.map +1 -1
  160. package/dist/model/local.d.ts +43 -0
  161. package/dist/model/local.d.ts.map +1 -0
  162. package/dist/model/local.js +118 -0
  163. package/dist/model/local.js.map +1 -0
  164. package/dist/model/plan-usage.d.ts +41 -0
  165. package/dist/model/plan-usage.d.ts.map +1 -0
  166. package/dist/model/plan-usage.js +168 -0
  167. package/dist/model/plan-usage.js.map +1 -0
  168. package/dist/model/plans.d.ts +73 -0
  169. package/dist/model/plans.d.ts.map +1 -0
  170. package/dist/model/plans.js +246 -0
  171. package/dist/model/plans.js.map +1 -0
  172. package/dist/orchestrator/recent-recap.d.ts +2 -0
  173. package/dist/orchestrator/recent-recap.d.ts.map +1 -0
  174. package/dist/orchestrator/recent-recap.js +20 -0
  175. package/dist/orchestrator/recent-recap.js.map +1 -0
  176. package/dist/providers/anthropic.d.ts +1 -0
  177. package/dist/providers/anthropic.d.ts.map +1 -1
  178. package/dist/providers/anthropic.js +10 -2
  179. package/dist/providers/anthropic.js.map +1 -1
  180. package/dist/providers/fallback.d.ts +23 -0
  181. package/dist/providers/fallback.d.ts.map +1 -0
  182. package/dist/providers/fallback.js +29 -0
  183. package/dist/providers/fallback.js.map +1 -0
  184. package/dist/providers/gemini.d.ts +2 -0
  185. package/dist/providers/gemini.d.ts.map +1 -1
  186. package/dist/providers/gemini.js +24 -10
  187. package/dist/providers/gemini.js.map +1 -1
  188. package/dist/providers/openai.d.ts.map +1 -1
  189. package/dist/providers/openai.js +4 -1
  190. package/dist/providers/openai.js.map +1 -1
  191. package/dist/providers/registry.d.ts +18 -2
  192. package/dist/providers/registry.d.ts.map +1 -1
  193. package/dist/providers/registry.js +56 -9
  194. package/dist/providers/registry.js.map +1 -1
  195. package/dist/reflect.d.ts +55 -0
  196. package/dist/reflect.d.ts.map +1 -1
  197. package/dist/reflect.js +148 -54
  198. package/dist/reflect.js.map +1 -1
  199. package/dist/sense/log.d.ts +9 -0
  200. package/dist/sense/log.d.ts.map +1 -0
  201. package/dist/sense/log.js +63 -0
  202. package/dist/sense/log.js.map +1 -0
  203. package/dist/sense/screen.d.ts +43 -0
  204. package/dist/sense/screen.d.ts.map +1 -0
  205. package/dist/sense/screen.js +107 -0
  206. package/dist/sense/screen.js.map +1 -0
  207. package/dist/sense/service.d.ts +16 -0
  208. package/dist/sense/service.d.ts.map +1 -0
  209. package/dist/sense/service.js +33 -0
  210. package/dist/sense/service.js.map +1 -0
  211. package/dist/sense/types.d.ts +35 -0
  212. package/dist/sense/types.d.ts.map +1 -0
  213. package/dist/sense/types.js +11 -0
  214. package/dist/sense/types.js.map +1 -0
  215. package/dist/sense/voice.d.ts +28 -0
  216. package/dist/sense/voice.d.ts.map +1 -0
  217. package/dist/sense/voice.js +64 -0
  218. package/dist/sense/voice.js.map +1 -0
  219. package/dist/soul/git.d.ts.map +1 -1
  220. package/dist/soul/git.js +35 -16
  221. package/dist/soul/git.js.map +1 -1
  222. package/dist/soul/store.d.ts +22 -0
  223. package/dist/soul/store.d.ts.map +1 -1
  224. package/dist/soul/store.js +69 -14
  225. package/dist/soul/store.js.map +1 -1
  226. package/dist/soul/summary.d.ts +10 -0
  227. package/dist/soul/summary.d.ts.map +1 -0
  228. package/dist/soul/summary.js +57 -0
  229. package/dist/soul/summary.js.map +1 -0
  230. package/dist/soul/tools.d.ts.map +1 -1
  231. package/dist/soul/tools.js +13 -24
  232. package/dist/soul/tools.js.map +1 -1
  233. package/dist/soul/types.d.ts +9 -0
  234. package/dist/soul/types.d.ts.map +1 -1
  235. package/dist/soul/types.js.map +1 -1
  236. package/dist/subagent.d.ts +7 -0
  237. package/dist/subagent.d.ts.map +1 -1
  238. package/dist/subagent.js +3 -1
  239. package/dist/subagent.js.map +1 -1
  240. package/dist/tools/dispatch_agent.d.ts +13 -1
  241. package/dist/tools/dispatch_agent.d.ts.map +1 -1
  242. package/dist/tools/dispatch_agent.js +56 -12
  243. package/dist/tools/dispatch_agent.js.map +1 -1
  244. package/dist/tools/dispatch_status.d.ts +22 -0
  245. package/dist/tools/dispatch_status.d.ts.map +1 -0
  246. package/dist/tools/dispatch_status.js +57 -0
  247. package/dist/tools/dispatch_status.js.map +1 -0
  248. package/dist/tools/registry.d.ts +29 -0
  249. package/dist/tools/registry.d.ts.map +1 -1
  250. package/dist/tools/registry.js +67 -0
  251. package/dist/tools/registry.js.map +1 -1
  252. package/dist/tools/run_on_plan.d.ts +46 -0
  253. package/dist/tools/run_on_plan.d.ts.map +1 -0
  254. package/dist/tools/run_on_plan.js +89 -0
  255. package/dist/tools/run_on_plan.js.map +1 -0
  256. package/dist/tools/takoapi.d.ts +60 -0
  257. package/dist/tools/takoapi.d.ts.map +1 -0
  258. package/dist/tools/takoapi.js +181 -0
  259. package/dist/tools/takoapi.js.map +1 -0
  260. package/dist/tools/validate.d.ts +22 -0
  261. package/dist/tools/validate.d.ts.map +1 -0
  262. package/dist/tools/validate.js +50 -0
  263. package/dist/tools/validate.js.map +1 -0
  264. package/dist/web/agent-roster.d.ts +56 -0
  265. package/dist/web/agent-roster.d.ts.map +1 -0
  266. package/dist/web/agent-roster.js +109 -0
  267. package/dist/web/agent-roster.js.map +1 -0
  268. package/dist/web/devices.d.ts +27 -0
  269. package/dist/web/devices.d.ts.map +1 -0
  270. package/dist/web/devices.js +113 -0
  271. package/dist/web/devices.js.map +1 -0
  272. package/dist/web/island.d.ts +5 -1
  273. package/dist/web/island.d.ts.map +1 -1
  274. package/dist/web/island.js +410 -63
  275. package/dist/web/island.js.map +1 -1
  276. package/dist/web/lisa-client.d.ts +20 -0
  277. package/dist/web/lisa-client.d.ts.map +1 -0
  278. package/dist/web/lisa-client.js +1323 -0
  279. package/dist/web/lisa-client.js.map +1 -0
  280. package/dist/web/lisa-css.d.ts +13 -0
  281. package/dist/web/lisa-css.d.ts.map +1 -0
  282. package/dist/web/lisa-css.js +1163 -0
  283. package/dist/web/lisa-css.js.map +1 -0
  284. package/dist/web/lisa-html.d.ts +1 -1
  285. package/dist/web/lisa-html.d.ts.map +1 -1
  286. package/dist/web/lisa-html.js +15 -2136
  287. package/dist/web/lisa-html.js.map +1 -1
  288. package/dist/web/push.d.ts +76 -0
  289. package/dist/web/push.d.ts.map +1 -0
  290. package/dist/web/push.js +163 -0
  291. package/dist/web/push.js.map +1 -0
  292. package/dist/web/server.d.ts +19 -0
  293. package/dist/web/server.d.ts.map +1 -1
  294. package/dist/web/server.js +878 -64
  295. package/dist/web/server.js.map +1 -1
  296. package/package.json +5 -2
@@ -8,6 +8,8 @@ import { reviewDiffTool } from "./review_diff.js";
8
8
  import { runChecksTool } from "./run_checks.js";
9
9
  import { prStatusTool } from "./pr_status.js";
10
10
  import { dispatchAgentTool } from "./dispatch_agent.js";
11
+ import { runOnPlanTool } from "./run_on_plan.js";
12
+ import { dispatchStatusTool } from "./dispatch_status.js";
11
13
  import { scheduledDispatchTool } from "./scheduled_dispatch.js";
12
14
  import { compareAgentsTool } from "./compare_agents.js";
13
15
  import { githubLinkTool } from "./github_link.js";
@@ -29,6 +31,7 @@ import { redeployTool } from "./redeploy.js";
29
31
  import { setMoodTool } from "./set_mood.js";
30
32
  import { webFetchTool } from "./web_fetch.js";
31
33
  import { webSearchTool } from "./web_search.js";
34
+ import { takoapiTool } from "./takoapi.js";
32
35
  import { writeTool } from "./write.js";
33
36
  export function buildToolRegistry(opts = {}) {
34
37
  const tools = [
@@ -54,6 +57,7 @@ export function buildToolRegistry(opts = {}) {
54
57
  desireCloseTool,
55
58
  webFetchTool,
56
59
  webSearchTool,
60
+ takoapiTool,
57
61
  redeployTool,
58
62
  // Orchestration (docs/ORCHESTRATOR_PLAN.md): observe → advise → dispatch → control.
59
63
  listAgentsTool,
@@ -64,6 +68,8 @@ export function buildToolRegistry(opts = {}) {
64
68
  prStatusTool,
65
69
  adviseNowTool,
66
70
  dispatchAgentTool,
71
+ runOnPlanTool,
72
+ dispatchStatusTool,
67
73
  scheduledDispatchTool,
68
74
  compareAgentsTool,
69
75
  githubLinkTool,
@@ -102,4 +108,65 @@ export const READ_ONLY_TOOL_NAMES = new Set([
102
108
  export function readOnlySubset(tools) {
103
109
  return tools.filter((t) => READ_ONLY_TOOL_NAMES.has(t.name));
104
110
  }
111
+ /**
112
+ * Tools that must NOT be available to self-driven autonomous runs (desire
113
+ * heartbeats, idle reflection / Reve). These runs execute unattended on a timer with
114
+ * prompts that Lisa wrote herself — if an indirect prompt injection (e.g. via
115
+ * web_fetch content) plants a malicious actionable desire, these are the tools
116
+ * that would turn it into persistent code execution. Soul / memory / journal /
117
+ * skill tools stay available: autonomous time is for self-work, not ops.
118
+ *
119
+ * User-defined heartbeat tasks (~/.lisa/heartbeat.json) keep the full toolset —
120
+ * those prompts are authored by the user, same trust as typing into the REPL.
121
+ *
122
+ * Escape hatch: LISA_AUTONOMOUS_FULL_TOOLS=1 restores the old behavior.
123
+ */
124
+ export const AUTONOMOUS_BLOCKED_TOOL_NAMES = new Set([
125
+ "bash",
126
+ "write",
127
+ "edit",
128
+ "apply_patch",
129
+ "redeploy",
130
+ "task",
131
+ "dispatch_agent",
132
+ "run_on_plan",
133
+ "signal_agent",
134
+ "scheduled_dispatch",
135
+ "compare_agents",
136
+ "run_checks",
137
+ "github",
138
+ "mcp",
139
+ // takoapi calls spend the user's TAKO_KEY and send data to a remote agent —
140
+ // not something an unattended/remote-origin run should do on its own.
141
+ "takoapi",
142
+ ]);
143
+ export function autonomousSubset(tools) {
144
+ if (process.env.LISA_AUTONOMOUS_FULL_TOOLS === "1")
145
+ return tools;
146
+ return tools.filter((t) => !AUTONOMOUS_BLOCKED_TOOL_NAMES.has(t.name));
147
+ }
148
+ /**
149
+ * Tools that must NOT be reachable from remote-origin surfaces (IM channels:
150
+ * Telegram / Discord / Slack / Feishu / iMessage / webhook) by default.
151
+ * A channel message comes from whoever can reach the bot — with an empty
152
+ * allow-list that can be anyone, and even with one it's a remote, replayable
153
+ * surface. Mutating fs / shell / process-spawning / GitHub-writing tools turn
154
+ * a single hostile message into local code execution, so they're off unless
155
+ * the channel entry opts in with `"unsafeFullTools": true`.
156
+ *
157
+ * skill_manage is also blocked: a remotely planted skill becomes persistent
158
+ * prompt material for later full-tool local sessions.
159
+ */
160
+ export const REMOTE_BLOCKED_TOOL_NAMES = new Set([
161
+ ...AUTONOMOUS_BLOCKED_TOOL_NAMES,
162
+ "skill_manage",
163
+ // dispatch_status surfaces the raw output of dispatched agents — read-only,
164
+ // but richer content than the structural observers and not for remote-origin
165
+ // (channel) callers. NOT autonomous-blocked: an autonomous run may read the
166
+ // result of work it dispatched.
167
+ "dispatch_status",
168
+ ]);
169
+ export function remoteSafeSubset(tools) {
170
+ return tools.filter((t) => !REMOTE_BLOCKED_TOOL_NAMES.has(t.name));
171
+ }
105
172
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * run_on_plan (CODING_PLANS Phase 2) — delegate a coding task to a subscription
3
+ * "coding plan" instead of a metered API key.
4
+ *
5
+ * The mechanism is the sanctioned one from docs/CODING_PLANS.md: LISA does NOT
6
+ * touch the vendor's subscription token. It runs the vendor's OWN CLI that the
7
+ * user is already logged into — `claude -p "<task>"` / `codex exec "<task>"` —
8
+ * via the same `launchAgent` path `dispatch_agent` uses. Because that CLI owns
9
+ * its subscription auth, the work bills to the plan, not an API key.
10
+ *
11
+ * This is a thin, plan-aware wrapper over dispatch: it resolves the selected
12
+ * plan (`lisa model use plan://…`, stored as LISA_CODING_PLAN) or an explicit
13
+ * one, presence-/login-checks it (plans.ts, no secrets read), then hands off to
14
+ * launchAgent. Same safety posture as dispatch_agent — it spawns an autonomous,
15
+ * file-mutating process, so it's approval-gated and excluded from the autonomous
16
+ * / remote-safe toolsets.
17
+ */
18
+ import type { ToolDefinition } from "../types.js";
19
+ import { type DispatchAgentKind } from "./dispatch_agent.js";
20
+ import { type PlanId, type PlanStatus } from "../model/plans.js";
21
+ interface RunOnPlanInput {
22
+ task: string;
23
+ /** "claude" | "codex" | "plan://claude" | … Default: the selected plan. */
24
+ plan?: string;
25
+ cwd?: string;
26
+ /** Override the same-cwd conflict guard (default false). */
27
+ force?: boolean;
28
+ }
29
+ /** Resolve a loose plan argument (id or `plan://id`) or the configured default. Pure. */
30
+ export declare function resolvePlanId(raw: string | undefined, env?: Record<string, string | undefined>): PlanId | null;
31
+ export type PlanRunCheck = {
32
+ ok: true;
33
+ kind: DispatchAgentKind;
34
+ } | {
35
+ ok: false;
36
+ message: string;
37
+ };
38
+ /**
39
+ * Decide whether a resolved plan can be delegated to, given its detected status.
40
+ * Pure — the tool composes this with detectPlan() + launchAgent(). Returns the
41
+ * dispatch kind to launch, or a user-facing refusal message.
42
+ */
43
+ export declare function planRunPreCheck(planId: PlanId, status: PlanStatus): PlanRunCheck;
44
+ export declare const runOnPlanTool: ToolDefinition<RunOnPlanInput, string>;
45
+ export {};
46
+ //# sourceMappingURL=run_on_plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_on_plan.d.ts","sourceRoot":"","sources":["../../src/tools/run_on_plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAOL,KAAK,MAAM,EACX,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,GAAG,IAAI,CAMf;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,CAIhF;AAED,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,cAAc,EAAE,MAAM,CAwEhE,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { activeAgentInCwd, launchAgent } from "./dispatch_agent.js";
2
+ import { detectPlan, parsePlanRef, planDispatchKind, planPreflight, selectedPlan, PLAN_IDS, } from "../model/plans.js";
3
+ /** Resolve a loose plan argument (id or `plan://id`) or the configured default. Pure. */
4
+ export function resolvePlanId(raw, env = process.env) {
5
+ if (!raw || !raw.trim())
6
+ return selectedPlan(env);
7
+ const viaRef = parsePlanRef(raw);
8
+ if (viaRef)
9
+ return viaRef;
10
+ const v = raw.trim().toLowerCase();
11
+ return PLAN_IDS.includes(v) ? v : null;
12
+ }
13
+ /**
14
+ * Decide whether a resolved plan can be delegated to, given its detected status.
15
+ * Pure — the tool composes this with detectPlan() + launchAgent(). Returns the
16
+ * dispatch kind to launch, or a user-facing refusal message.
17
+ */
18
+ export function planRunPreCheck(planId, status) {
19
+ const pf = planPreflight(status);
20
+ if (!pf.ok)
21
+ return { ok: false, message: `Can't run on your ${planId} plan: ${pf.reason}.` };
22
+ return { ok: true, kind: planDispatchKind(planId) };
23
+ }
24
+ export const runOnPlanTool = {
25
+ name: "run_on_plan",
26
+ description: "Delegate a coding task to the user's subscription coding plan (Claude Pro/Max, " +
27
+ "ChatGPT/Codex, or GitHub Copilot) instead of a metered API key. Runs the vendor's own " +
28
+ "CLI that the user is logged into (claude -p / codex exec / copilot -p), so the work " +
29
+ "bills to their subscription, not an API key. Uses the plan selected via " +
30
+ "`lisa model use plan://…` unless you pass one " +
31
+ "in `plan`. The agent runs autonomously in the background and appears in the session " +
32
+ "monitor; this returns a handle and does NOT wait for it to finish (check dispatch_status). " +
33
+ "Spawns an autonomous process, so it requires user approval. Use when the user wants " +
34
+ "coding work run on their subscription rather than spending API tokens.",
35
+ inputSchema: {
36
+ type: "object",
37
+ properties: {
38
+ task: {
39
+ type: "string",
40
+ description: "The coding task/prompt (passed as a single argument, never a shell string).",
41
+ minLength: 1,
42
+ },
43
+ plan: {
44
+ type: "string",
45
+ description: "Which coding plan to use: \"claude\", \"codex\", or \"copilot\" (or plan://<id>). " +
46
+ "Defaults to the plan selected with `lisa model use plan://…`.",
47
+ },
48
+ cwd: {
49
+ type: "string",
50
+ description: "Absolute working directory. Defaults to the current directory.",
51
+ },
52
+ force: {
53
+ type: "boolean",
54
+ description: "Launch even if another agent is already active in this directory (default false).",
55
+ },
56
+ },
57
+ required: ["task"],
58
+ additionalProperties: false,
59
+ },
60
+ async execute(input, ctx) {
61
+ const planId = resolvePlanId(input.plan);
62
+ if (!planId) {
63
+ return input.plan
64
+ ? `Unknown coding plan "${input.plan}". Use one of: ${PLAN_IDS.join(", ")} (or plan://<id>).`
65
+ : "No coding plan selected. Pick one with `lisa model use plan://claude` (or pass " +
66
+ 'plan: "claude" | "codex"). See docs/CODING_PLANS.md.';
67
+ }
68
+ const check = planRunPreCheck(planId, detectPlan(planId));
69
+ if (!check.ok)
70
+ return check.message;
71
+ const cwd = input.cwd && input.cwd.startsWith("/") ? input.cwd : ctx.cwd;
72
+ if (!input.force) {
73
+ const clash = activeAgentInCwd(cwd);
74
+ if (clash) {
75
+ return (`Refusing to run on your ${planId} plan in ${cwd}: ${clash} is already active there. ` +
76
+ `Running two agents in one directory risks clobbering changes. ` +
77
+ `Wait for it to finish, pick another directory, or pass force:true.`);
78
+ }
79
+ }
80
+ const { pid, error, id } = await launchAgent(check.kind, input.task, cwd, ctx.log);
81
+ if (error)
82
+ return error;
83
+ ctx.log(`[plan] ran on ${planId} via ${check.kind} (pid ${pid}) in ${cwd}: ${input.task.slice(0, 80)}`);
84
+ return (`Running on your ${planId} plan — launched ${check.kind} (pid ${pid}) in ${cwd}. ` +
85
+ `This spends your subscription, not an API key. It runs autonomously; I won't block on it — ` +
86
+ `read its output with dispatch_status${id ? ` (id ${id})` : ""}, or signal_agent to list/cancel.`);
87
+ },
88
+ };
89
+ //# sourceMappingURL=run_on_plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_on_plan.js","sourceRoot":"","sources":["../../src/tools/run_on_plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * `takoapi` tool — reach remote agents through TakoAPI (PLAN_DISPATCH_v1.0 D2a).
3
+ *
4
+ * TakoAPI (https://takoapi.com) is "OpenRouter for agents": one key, any
5
+ * registered agent. This tool lets Lisa, mid-conversation, DISCOVER a remote
6
+ * agent by capability and CALL it (A2A `message`) — delegating a task that a
7
+ * specialized remote agent handles better than she would directly. The richer
8
+ * native hub integration (remote agents as first-class sessions) is D2b; this
9
+ * is the near-free discover+call entry point.
10
+ *
11
+ * Outbound + spends the user's TAKO_KEY, so it's gated out of autonomous and
12
+ * remote-origin runs (see AUTONOMOUS_BLOCKED_TOOL_NAMES). The HTTP layer is
13
+ * injectable so the logic is unit-testable without hitting the network.
14
+ */
15
+ import type { ToolDefinition } from "../types.js";
16
+ export interface HttpResponse {
17
+ ok: boolean;
18
+ status: number;
19
+ body: string;
20
+ }
21
+ export interface TakoFetcher {
22
+ get(url: string): Promise<HttpResponse>;
23
+ postJson(url: string, body: unknown, headers: Record<string, string>): Promise<HttpResponse>;
24
+ }
25
+ /** Format a /api/registry response into a readable agent list. Pure. */
26
+ export declare function formatRegistry(body: string, limit?: number): string;
27
+ /** Pull a text reply out of an A2A / OpenAI-shim response, tolerating shapes. Pure. */
28
+ export declare function extractAgentReply(body: string): string;
29
+ /** Discover agents in the public registry (no auth). */
30
+ export declare function takoDiscover(query: string, f?: TakoFetcher): Promise<string>;
31
+ export interface TakoCallResult {
32
+ /** Did we reach the agent and get a non-error response? */
33
+ ok: boolean;
34
+ status: number;
35
+ /** Formatted reply (or a human error string) — what the tool returns to LISA. */
36
+ reply: string;
37
+ /** A2A TaskState observed for the call (D2b ledger). "completed" for a plain
38
+ * sync reply; the agent's own task state if the response carried a Task. */
39
+ taskState: string;
40
+ /** A2A task id, if the response carried one. */
41
+ taskId?: string;
42
+ }
43
+ /**
44
+ * Call an agent via the A2A message endpoint with the user's key, returning both
45
+ * the reply and the observed A2A task state (for the D2b call ledger). Pure
46
+ * w.r.t. fs — recording is the caller's job, so existing `takoCall` tests stay
47
+ * side-effect-free.
48
+ */
49
+ export declare function takoCallDetailed(slug: string, text: string, key: string, f?: TakoFetcher): Promise<TakoCallResult>;
50
+ /** Call an agent via the A2A message endpoint with the user's key. */
51
+ export declare function takoCall(slug: string, text: string, key: string, f?: TakoFetcher): Promise<string>;
52
+ interface TakoInput {
53
+ action: "discover" | "call";
54
+ query?: string;
55
+ slug?: string;
56
+ text?: string;
57
+ }
58
+ export declare const takoapiTool: ToolDefinition<TakoInput, string>;
59
+ export {};
60
+ //# sourceMappingURL=takoapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"takoapi.d.ts","sourceRoot":"","sources":["../../src/tools/takoapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AASlD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9F;AAyBD,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CA2B/D;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwBtD;AAED,wDAAwD;AACxD,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,GAAE,WAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlG;AAED,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd;iFAC6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,CAAC,GAAE,WAA4B,GAC9B,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAED,sEAAsE;AACtE,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,CAAC,GAAE,WAA4B,GAC9B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,UAAU,SAAS;IACjB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,SAAS,EAAE,MAAM,CA0CzD,CAAC"}
@@ -0,0 +1,181 @@
1
+ import { extractTaskState } from "../integrations/takoapi/a2a.js";
2
+ import { recordTakoCall } from "../integrations/takoapi/ledger.js";
3
+ const DEFAULT_BASE = "https://takoapi.com";
4
+ function base() {
5
+ return (process.env.TAKOAPI_BASE_URL ?? DEFAULT_BASE).replace(/\/$/, "");
6
+ }
7
+ const defaultFetcher = {
8
+ async get(url) {
9
+ try {
10
+ const r = await fetch(url, { headers: { accept: "application/json" } });
11
+ return { ok: r.ok, status: r.status, body: await r.text() };
12
+ }
13
+ catch (e) {
14
+ return { ok: false, status: 0, body: e.message };
15
+ }
16
+ },
17
+ async postJson(url, body, headers) {
18
+ try {
19
+ const r = await fetch(url, {
20
+ method: "POST",
21
+ headers: { "content-type": "application/json", ...headers },
22
+ body: JSON.stringify(body),
23
+ });
24
+ return { ok: r.ok, status: r.status, body: await r.text() };
25
+ }
26
+ catch (e) {
27
+ return { ok: false, status: 0, body: e.message };
28
+ }
29
+ },
30
+ };
31
+ /** Format a /api/registry response into a readable agent list. Pure. */
32
+ export function formatRegistry(body, limit = 10) {
33
+ let json;
34
+ try {
35
+ json = JSON.parse(body);
36
+ }
37
+ catch {
38
+ return "(could not parse the TakoAPI registry response)";
39
+ }
40
+ const j = json;
41
+ const arr = Array.isArray(json) ? json : (j.agents ?? j.data ?? j.results ?? []);
42
+ if (!Array.isArray(arr) || arr.length === 0)
43
+ return "(no matching agents found)";
44
+ return arr
45
+ .slice(0, limit)
46
+ .map((raw) => {
47
+ const a = raw;
48
+ const name = (a.name ?? a.slug ?? "(unnamed)");
49
+ const slug = (a.slug ?? "");
50
+ const desc = String(a.description ?? a.summary ?? "").replace(/\s+/g, " ").slice(0, 100);
51
+ const skills = Array.isArray(a.skills)
52
+ ? a.skills
53
+ .map((s) => (typeof s === "string" ? s : s?.name))
54
+ .filter(Boolean)
55
+ .slice(0, 4)
56
+ .join(", ")
57
+ : "";
58
+ return `- ${name}${slug ? ` (slug: ${slug})` : ""}${desc ? ` — ${desc}` : ""}${skills ? ` [${skills}]` : ""}`;
59
+ })
60
+ .join("\n");
61
+ }
62
+ /** Pull a text reply out of an A2A / OpenAI-shim response, tolerating shapes. Pure. */
63
+ export function extractAgentReply(body) {
64
+ let json;
65
+ try {
66
+ json = JSON.parse(body);
67
+ }
68
+ catch {
69
+ return body.slice(0, 2000); // non-JSON → return raw, truncated
70
+ }
71
+ const j = json;
72
+ const partsText = (parts) => Array.isArray(parts)
73
+ ? parts.map((p) => p?.text).filter((t) => typeof t === "string").join("\n")
74
+ : undefined;
75
+ const candidates = [
76
+ j?.choices?.[0]?.message?.content, // OpenAI-compat shim
77
+ partsText(j?.message?.parts), // A2A message
78
+ partsText(j?.parts),
79
+ j?.text,
80
+ j?.reply,
81
+ j?.output,
82
+ j?.result,
83
+ typeof j?.message === "string" ? j.message : undefined,
84
+ ];
85
+ for (const c of candidates)
86
+ if (typeof c === "string" && c.trim())
87
+ return c.trim();
88
+ return JSON.stringify(json).slice(0, 2000);
89
+ }
90
+ /** Discover agents in the public registry (no auth). */
91
+ export async function takoDiscover(query, f = defaultFetcher) {
92
+ const url = `${base()}/api/registry?format=json${query ? `&q=${encodeURIComponent(query)}` : ""}`;
93
+ const res = await f.get(url);
94
+ if (!res.ok)
95
+ return `TakoAPI registry unreachable (status ${res.status || "network error"}).`;
96
+ return formatRegistry(res.body);
97
+ }
98
+ /**
99
+ * Call an agent via the A2A message endpoint with the user's key, returning both
100
+ * the reply and the observed A2A task state (for the D2b call ledger). Pure
101
+ * w.r.t. fs — recording is the caller's job, so existing `takoCall` tests stay
102
+ * side-effect-free.
103
+ */
104
+ export async function takoCallDetailed(slug, text, key, f = defaultFetcher) {
105
+ const url = `${base()}/v1/agents/${encodeURIComponent(slug)}/message`;
106
+ const res = await f.postJson(url, { text }, { authorization: `Bearer ${key}` });
107
+ if (res.status === 401) {
108
+ return {
109
+ ok: false,
110
+ status: 401,
111
+ reply: "TakoAPI rejected the key (401). Check TAKO_KEY at https://takoapi.com/dashboard.",
112
+ taskState: "rejected",
113
+ };
114
+ }
115
+ if (!res.ok) {
116
+ return {
117
+ ok: false,
118
+ status: res.status,
119
+ reply: `TakoAPI call to "${slug}" failed (status ${res.status || "network error"}).`,
120
+ taskState: "failed",
121
+ };
122
+ }
123
+ const task = extractTaskState(res.body); // {state, taskId} | null
124
+ return {
125
+ ok: true,
126
+ status: res.status,
127
+ reply: extractAgentReply(res.body),
128
+ taskState: task?.state ?? "completed",
129
+ ...(task?.taskId ? { taskId: task.taskId } : {}),
130
+ };
131
+ }
132
+ /** Call an agent via the A2A message endpoint with the user's key. */
133
+ export async function takoCall(slug, text, key, f = defaultFetcher) {
134
+ return (await takoCallDetailed(slug, text, key, f)).reply;
135
+ }
136
+ export const takoapiTool = {
137
+ name: "takoapi",
138
+ description: "Reach remote AI agents through TakoAPI (https://takoapi.com) — one key, any agent. " +
139
+ "action='discover' searches the agent registry (optionally by `query`); action='call' sends `text` " +
140
+ "to the agent with the given `slug` and returns its reply. Use when a task is better handled by a " +
141
+ "specialized remote agent than by you. 'call' requires TAKO_KEY (free key at /dashboard).",
142
+ inputSchema: {
143
+ type: "object",
144
+ properties: {
145
+ action: { type: "string", enum: ["discover", "call"] },
146
+ query: { type: "string", description: "search terms (for discover)" },
147
+ slug: { type: "string", description: "agent slug (for call)" },
148
+ text: { type: "string", description: "the request to send the agent (for call)" },
149
+ },
150
+ required: ["action"],
151
+ },
152
+ async execute(input) {
153
+ if (input.action === "discover")
154
+ return await takoDiscover(input.query ?? "");
155
+ if (input.action === "call") {
156
+ if (!input.slug || !input.text)
157
+ return "call needs both `slug` and `text`.";
158
+ const key = process.env.TAKO_KEY?.trim();
159
+ if (!key) {
160
+ return "TAKO_KEY is not set — create one at https://takoapi.com/dashboard and add it to ~/.lisa/config.env.";
161
+ }
162
+ const r = await takoCallDetailed(input.slug, input.text, key);
163
+ // D2b — record the delegation so the agent shows up as a session in the
164
+ // hub (with its A2A TaskState). Best-effort: a ledger write must never
165
+ // break the reply. Only successful calls are recorded (so transient
166
+ // transport errors don't manufacture error-sessions); a genuine agent
167
+ // task failure arrives as ok=true with taskState="failed".
168
+ if (r.ok) {
169
+ try {
170
+ recordTakoCall({ slug: input.slug, state: r.taskState, taskId: r.taskId });
171
+ }
172
+ catch {
173
+ /* ledger unavailable — surface the reply anyway */
174
+ }
175
+ }
176
+ return r.reply;
177
+ }
178
+ return `unknown action "${input.action}" — use "discover" or "call".`;
179
+ },
180
+ };
181
+ //# sourceMappingURL=takoapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"takoapi.js","sourceRoot":"","sources":["../../src/tools/takoapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Tool input validation (FOUNDATIONS §2.3) — a guard between LLM-produced tool
3
+ * input and `tool.execute()`. The review flagged that model-generated input goes
4
+ * straight into execute with no schema check; this catches malformed calls
5
+ * (wrong shape / missing required field / bad enum) and returns a friendly error
6
+ * the model can correct, BEFORE the tool runs (fail-closed).
7
+ *
8
+ * Deliberately lightweight — validates against the JSON-Schema `inputSchema`
9
+ * every ToolDefinition already declares (no new dependency, no separate schema
10
+ * to drift). It checks the high-value, low-false-positive rules: input is an
11
+ * object, required fields are present, declared property types match, and enum
12
+ * membership holds. It does NOT deep-validate nested objects or reject extra
13
+ * properties — over-strictness would block valid calls the tools handle fine.
14
+ * Pure.
15
+ */
16
+ import type Anthropic from "@anthropic-ai/sdk";
17
+ export interface ValidationResult {
18
+ ok: boolean;
19
+ error?: string;
20
+ }
21
+ export declare function validateToolInput(schema: Anthropic.Tool.InputSchema, input: unknown): ValidationResult;
22
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,WAAW,EAClC,KAAK,EAAE,OAAO,GACb,gBAAgB,CAgClB"}
@@ -0,0 +1,50 @@
1
+ export function validateToolInput(schema, input) {
2
+ // Tools take a JSON object. Anything else is malformed.
3
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
4
+ return { ok: false, error: "input must be a JSON object" };
5
+ }
6
+ const obj = input;
7
+ const s = schema;
8
+ const required = Array.isArray(s.required) ? s.required : [];
9
+ for (const key of required) {
10
+ if (!(key in obj) || obj[key] === undefined || obj[key] === null) {
11
+ return { ok: false, error: `missing required field "${key}"` };
12
+ }
13
+ }
14
+ const props = s.properties;
15
+ if (props) {
16
+ for (const [key, spec] of Object.entries(props)) {
17
+ if (!(key in obj) || obj[key] === undefined)
18
+ continue; // optional + absent → fine
19
+ const val = obj[key];
20
+ if (spec?.type && !matchesType(val, spec.type)) {
21
+ return { ok: false, error: `field "${key}" should be ${spec.type}` };
22
+ }
23
+ if (Array.isArray(spec?.enum) && spec.enum.length > 0 && !spec.enum.includes(val)) {
24
+ return { ok: false, error: `field "${key}" must be one of: ${spec.enum.join(", ")}` };
25
+ }
26
+ }
27
+ }
28
+ return { ok: true };
29
+ }
30
+ function matchesType(val, type) {
31
+ switch (type) {
32
+ case "string":
33
+ return typeof val === "string";
34
+ case "number":
35
+ return typeof val === "number";
36
+ case "integer":
37
+ return typeof val === "number" && Number.isInteger(val);
38
+ case "boolean":
39
+ return typeof val === "boolean";
40
+ case "object":
41
+ return val !== null && typeof val === "object" && !Array.isArray(val);
42
+ case "array":
43
+ return Array.isArray(val);
44
+ case "null":
45
+ return val === null;
46
+ default:
47
+ return true; // unknown/compound type → don't block
48
+ }
49
+ }
50
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"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"}