@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17

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 (466) hide show
  1. package/README.md +21 -1
  2. package/bin/aiwg.mjs +349 -0
  3. package/dist/src/a2a/agent-card.js +145 -0
  4. package/dist/src/a2a/client.js +411 -0
  5. package/dist/src/a2a/hitl-cli.js +171 -0
  6. package/dist/src/a2a/hitl-driver.js +370 -0
  7. package/dist/src/a2a/hitl.js +181 -0
  8. package/dist/src/a2a/http.js +193 -0
  9. package/dist/src/a2a/jcs.js +128 -0
  10. package/dist/src/a2a/jws.js +187 -0
  11. package/dist/src/a2a/types.js +24 -0
  12. package/dist/src/a2a/webhook.js +240 -0
  13. package/dist/src/activity-log/cli.js +348 -0
  14. package/dist/src/activity-log/parser.js +81 -0
  15. package/dist/src/activity-log/types.js +50 -0
  16. package/dist/src/agents/agent-deployer.js +367 -0
  17. package/dist/src/agents/agent-packager.js +271 -0
  18. package/dist/src/agents/agent-validator.js +271 -0
  19. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  20. package/dist/src/agents/grounding/types.js +12 -0
  21. package/dist/src/agents/index.js +10 -0
  22. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  23. package/dist/src/agents/types.js +7 -0
  24. package/dist/src/api/index.d.ts +10 -0
  25. package/dist/src/api/index.js +10 -0
  26. package/dist/src/artifacts/address-parser.js +73 -0
  27. package/dist/src/artifacts/audit/cli.js +183 -0
  28. package/dist/src/artifacts/audit/drift.js +122 -0
  29. package/dist/src/artifacts/audit/types.js +12 -0
  30. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  31. package/dist/src/artifacts/backends/json-backend.js +129 -0
  32. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  33. package/dist/src/artifacts/browser-export.js +622 -0
  34. package/dist/src/artifacts/capability-resolver.js +94 -0
  35. package/dist/src/artifacts/checksum-manifest.js +91 -0
  36. package/dist/src/artifacts/citation-parser.js +162 -0
  37. package/dist/src/artifacts/cli.js +1462 -0
  38. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  39. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  40. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  41. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  42. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  43. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  44. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  45. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  46. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  47. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  48. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  49. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  51. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  52. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  53. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  54. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  55. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  56. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  57. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  58. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  60. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  61. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  62. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  63. package/dist/src/artifacts/corpus-views/build.js +126 -0
  64. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  65. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  66. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  67. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  68. package/dist/src/artifacts/dep-graph.js +173 -0
  69. package/dist/src/artifacts/discover-facets.js +375 -0
  70. package/dist/src/artifacts/embedding-index.js +354 -0
  71. package/dist/src/artifacts/enrichment/cli.js +240 -0
  72. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  73. package/dist/src/artifacts/enrichment/store.js +90 -0
  74. package/dist/src/artifacts/enrichment/types.js +12 -0
  75. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  76. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  77. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  78. package/dist/src/artifacts/fulltext.js +108 -0
  79. package/dist/src/artifacts/graph-backend.js +51 -0
  80. package/dist/src/artifacts/graph-query.js +247 -0
  81. package/dist/src/artifacts/hybrid-query.js +225 -0
  82. package/dist/src/artifacts/index-builder.js +1089 -0
  83. package/dist/src/artifacts/index-reader.js +112 -0
  84. package/dist/src/artifacts/index-status.js +193 -0
  85. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  86. package/dist/src/artifacts/move.js +154 -0
  87. package/dist/src/artifacts/operational-state.js +239 -0
  88. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  89. package/dist/src/artifacts/query-engine.js +1955 -0
  90. package/dist/src/artifacts/source-graph.js +529 -0
  91. package/dist/src/artifacts/stats.js +169 -0
  92. package/dist/src/artifacts/types.js +606 -0
  93. package/dist/src/artifacts/views/cli.js +293 -0
  94. package/dist/src/artifacts/views/definition.js +170 -0
  95. package/dist/src/artifacts/views/store.js +149 -0
  96. package/dist/src/artifacts/views/types.js +8 -0
  97. package/dist/src/artifacts/watcher.js +255 -0
  98. package/dist/src/catalog/builtin-models.json +636 -0
  99. package/dist/src/catalog/cli.js +228 -0
  100. package/dist/src/catalog/cli.mjs +289 -0
  101. package/dist/src/catalog/index.js +15 -0
  102. package/dist/src/catalog/loader.js +217 -0
  103. package/dist/src/catalog/loader.mjs +251 -0
  104. package/dist/src/catalog/sources.json +41 -0
  105. package/dist/src/catalog/types.js +8 -0
  106. package/dist/src/channel/manager.mjs +504 -0
  107. package/dist/src/cli/agent-spawn.js +178 -0
  108. package/dist/src/cli/cli-extension-loader.js +245 -0
  109. package/dist/src/cli/command-log.js +275 -0
  110. package/dist/src/cli/config-loader.js +232 -0
  111. package/dist/src/cli/env.js +82 -0
  112. package/dist/src/cli/errors.js +150 -0
  113. package/dist/src/cli/find-package-root.js +40 -0
  114. package/dist/src/cli/git-hooks.js +250 -0
  115. package/dist/src/cli/handlers/agentcard.js +206 -0
  116. package/dist/src/cli/handlers/artifacts.js +76 -0
  117. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  118. package/dist/src/cli/handlers/cockpit.js +137 -0
  119. package/dist/src/cli/handlers/command-log.js +37 -0
  120. package/dist/src/cli/handlers/daemon.js +59 -0
  121. package/dist/src/cli/handlers/diagnose.js +300 -0
  122. package/dist/src/cli/handlers/execution-mode.js +105 -0
  123. package/dist/src/cli/handlers/feedback.js +341 -0
  124. package/dist/src/cli/handlers/help.js +147 -0
  125. package/dist/src/cli/handlers/index.js +302 -0
  126. package/dist/src/cli/handlers/init.js +179 -0
  127. package/dist/src/cli/handlers/install.js +129 -0
  128. package/dist/src/cli/handlers/issues.js +46 -0
  129. package/dist/src/cli/handlers/lint.js +42 -0
  130. package/dist/src/cli/handlers/local-executor.js +315 -0
  131. package/dist/src/cli/handlers/marketplace.js +168 -0
  132. package/dist/src/cli/handlers/mc.js +1010 -0
  133. package/dist/src/cli/handlers/models.js +352 -0
  134. package/dist/src/cli/handlers/packages.js +155 -0
  135. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  136. package/dist/src/cli/handlers/ralph.js +575 -0
  137. package/dist/src/cli/handlers/refresh.js +432 -0
  138. package/dist/src/cli/handlers/regenerate.js +336 -0
  139. package/dist/src/cli/handlers/repo-access.js +109 -0
  140. package/dist/src/cli/handlers/run.js +165 -0
  141. package/dist/src/cli/handlers/runtime-info.js +301 -0
  142. package/dist/src/cli/handlers/sandbox.js +197 -0
  143. package/dist/src/cli/handlers/scaffolding.js +149 -0
  144. package/dist/src/cli/handlers/script-runner.js +121 -0
  145. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  146. package/dist/src/cli/handlers/serve.js +1835 -0
  147. package/dist/src/cli/handlers/session.js +348 -0
  148. package/dist/src/cli/handlers/setup.js +440 -0
  149. package/dist/src/cli/handlers/skill-lint.js +367 -0
  150. package/dist/src/cli/handlers/skill-usage.js +74 -0
  151. package/dist/src/cli/handlers/steward.js +567 -0
  152. package/dist/src/cli/handlers/subcommands.js +1702 -0
  153. package/dist/src/cli/handlers/team.js +337 -0
  154. package/dist/src/cli/handlers/types.js +11 -0
  155. package/dist/src/cli/handlers/use.js +2772 -0
  156. package/dist/src/cli/handlers/utilities.js +703 -0
  157. package/dist/src/cli/handlers/version.js +134 -0
  158. package/dist/src/cli/handlers/workspace-context.js +93 -0
  159. package/dist/src/cli/handlers/workspace.js +126 -0
  160. package/dist/src/cli/help-generator.js +178 -0
  161. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  162. package/dist/src/cli/hooks/executor.js +96 -0
  163. package/dist/src/cli/hooks/index.js +15 -0
  164. package/dist/src/cli/hooks/registry.js +143 -0
  165. package/dist/src/cli/hooks/types.js +13 -0
  166. package/dist/src/cli/log.js +492 -0
  167. package/dist/src/cli/project-isolation/detect.js +70 -0
  168. package/dist/src/cli/project-isolation/index.js +7 -0
  169. package/dist/src/cli/project-isolation/signals.js +17 -0
  170. package/dist/src/cli/project-isolation/warning.js +102 -0
  171. package/dist/src/cli/prompt-utils.js +155 -0
  172. package/dist/src/cli/provider-deployment-plan.js +126 -0
  173. package/dist/src/cli/provider-resolution.js +119 -0
  174. package/dist/src/cli/router.js +305 -0
  175. package/dist/src/cli/scope-resolver.js +392 -0
  176. package/dist/src/cli/skill-usage.js +616 -0
  177. package/dist/src/cli/ui.js +224 -0
  178. package/dist/src/cli/watch-service.js +203 -0
  179. package/dist/src/cli/workflow-orchestrator.js +478 -0
  180. package/dist/src/cli/workspace-signals.js +321 -0
  181. package/dist/src/community/footer.js +14 -0
  182. package/dist/src/community/links.js +123 -0
  183. package/dist/src/community/milestones.js +46 -0
  184. package/dist/src/community/nudge-policy.js +93 -0
  185. package/dist/src/config/aiwg-config.js +883 -0
  186. package/dist/src/config/cli.js +703 -0
  187. package/dist/src/config/gitignore.js +156 -0
  188. package/dist/src/config/project-artifacts.js +76 -0
  189. package/dist/src/config/user-config.js +428 -0
  190. package/dist/src/config/user-registry.js +127 -0
  191. package/dist/src/config/workspace.js +276 -0
  192. package/dist/src/contributors/detect.js +39 -0
  193. package/dist/src/contributors/discover.js +172 -0
  194. package/dist/src/contributors/heuristic.js +186 -0
  195. package/dist/src/contributors/index.js +11 -0
  196. package/dist/src/contributors/types.js +13 -0
  197. package/dist/src/contributors/validation.js +116 -0
  198. package/dist/src/data/community.schema.json +43 -0
  199. package/dist/src/data/community.yaml +16 -0
  200. package/dist/src/extensions/capability-index.js +270 -0
  201. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  202. package/dist/src/extensions/commands/definitions.js +3485 -0
  203. package/dist/src/extensions/deployment-registration.js +463 -0
  204. package/dist/src/extensions/index.js +22 -0
  205. package/dist/src/extensions/loader.js +132 -0
  206. package/dist/src/extensions/managed-marker.js +100 -0
  207. package/dist/src/extensions/manifest.js +196 -0
  208. package/dist/src/extensions/project-local-activity.js +114 -0
  209. package/dist/src/extensions/project-local-discovery.js +261 -0
  210. package/dist/src/extensions/project-local-doctor.js +281 -0
  211. package/dist/src/extensions/project-local-gitignore.js +176 -0
  212. package/dist/src/extensions/project-local-paths.js +121 -0
  213. package/dist/src/extensions/project-local-promote.js +218 -0
  214. package/dist/src/extensions/project-local-remove.js +373 -0
  215. package/dist/src/extensions/project-local-scaffold.js +252 -0
  216. package/dist/src/extensions/project-quickref.js +291 -0
  217. package/dist/src/extensions/registry.js +368 -0
  218. package/dist/src/extensions/shadow-resolver.js +271 -0
  219. package/dist/src/extensions/types.js +86 -0
  220. package/dist/src/extensions/upstream-registry.js +195 -0
  221. package/dist/src/extensions/validation.js +631 -0
  222. package/dist/src/features/catalog.js +88 -0
  223. package/dist/src/features/cli.js +197 -0
  224. package/dist/src/features/installer.js +57 -0
  225. package/dist/src/features/paths.js +14 -0
  226. package/dist/src/features/runtime.js +21 -0
  227. package/dist/src/features/status.js +134 -0
  228. package/dist/src/hooks/laziness-detection.js +532 -0
  229. package/dist/src/intake/git-history-analyzer.js +486 -0
  230. package/dist/src/intake/index.js +9 -0
  231. package/dist/src/issues/cli.js +327 -0
  232. package/dist/src/issues/index.js +5 -0
  233. package/dist/src/issues/live.js +154 -0
  234. package/dist/src/issues/local.js +666 -0
  235. package/dist/src/issues/sync.js +143 -0
  236. package/dist/src/issues/types.js +2 -0
  237. package/dist/src/issues/workflows.js +164 -0
  238. package/dist/src/kb/cli.js +173 -0
  239. package/dist/src/lint/cli.js +171 -0
  240. package/dist/src/lint/loader.js +225 -0
  241. package/dist/src/lint/reporters.js +141 -0
  242. package/dist/src/lint/runner.js +364 -0
  243. package/dist/src/lint/types.js +10 -0
  244. package/dist/src/marketplace/cache.js +110 -0
  245. package/dist/src/marketplace/identifier.js +63 -0
  246. package/dist/src/marketplace/registry.js +36 -0
  247. package/dist/src/marketplace/sources/clawhub.js +53 -0
  248. package/dist/src/marketplace/sources/git.js +45 -0
  249. package/dist/src/marketplace/types.js +9 -0
  250. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  251. package/dist/src/mcp/cli.mjs +1197 -0
  252. package/dist/src/mcp/elicitation.mjs +149 -0
  253. package/dist/src/mcp/helpers.mjs +287 -0
  254. package/dist/src/mcp/index.mjs +11 -0
  255. package/dist/src/mcp/profiles.js +263 -0
  256. package/dist/src/mcp/profiles.mjs +360 -0
  257. package/dist/src/mcp/registry.js +376 -0
  258. package/dist/src/mcp/registry.mjs +387 -0
  259. package/dist/src/mcp/server.mjs +633 -0
  260. package/dist/src/mcp/test-simple.mjs +271 -0
  261. package/dist/src/mcp/tools/command-run.mjs +101 -0
  262. package/dist/src/mcp/tools/discovery.mjs +291 -0
  263. package/dist/src/mcp/tools/interaction.mjs +87 -0
  264. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  265. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  266. package/dist/src/memory/cli.js +166 -0
  267. package/dist/src/memory/project-registry.js +282 -0
  268. package/dist/src/metrics/artifact-metrics.js +184 -0
  269. package/dist/src/metrics/context-budget.js +174 -0
  270. package/dist/src/metrics/token-counter.js +133 -0
  271. package/dist/src/models/config-loader.js +228 -0
  272. package/dist/src/models/index.js +22 -0
  273. package/dist/src/models/model-capabilities.v1.json +120 -0
  274. package/dist/src/models/model-catalog.v1.json +96 -0
  275. package/dist/src/models/model-discovery.js +521 -0
  276. package/dist/src/models/provider-models.js +73 -0
  277. package/dist/src/models/provider-policy.js +273 -0
  278. package/dist/src/models/resolver.js +245 -0
  279. package/dist/src/models/router.js +70 -0
  280. package/dist/src/models/types.js +8 -0
  281. package/dist/src/models/wrapper-deployment.js +178 -0
  282. package/dist/src/models/wrapper-route.js +54 -0
  283. package/dist/src/ops/cli.js +268 -0
  284. package/dist/src/ops/registry.js +623 -0
  285. package/dist/src/packages/adapters/clawhub.js +113 -0
  286. package/dist/src/packages/adapters/git.js +153 -0
  287. package/dist/src/packages/adapters/gitea.js +93 -0
  288. package/dist/src/packages/adapters/github.js +69 -0
  289. package/dist/src/packages/adapters/local-cache.js +89 -0
  290. package/dist/src/packages/package-registry.js +143 -0
  291. package/dist/src/packages/registry.js +238 -0
  292. package/dist/src/packages/types.js +11 -0
  293. package/dist/src/plugin/cross-framework-ops.js +475 -0
  294. package/dist/src/plugin/framework-config-loader.js +235 -0
  295. package/dist/src/plugin/framework-detector.js +186 -0
  296. package/dist/src/plugin/framework-isolator.js +341 -0
  297. package/dist/src/plugin/framework-migration.js +371 -0
  298. package/dist/src/plugin/metadata-validator.js +906 -0
  299. package/dist/src/plugin/plugin-installer.js +436 -0
  300. package/dist/src/plugin/plugin-status.js +369 -0
  301. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  302. package/dist/src/plugin/registry-validator.js +344 -0
  303. package/dist/src/plugin/skill-command-translator.js +415 -0
  304. package/dist/src/plugin/workspace-creator.js +189 -0
  305. package/dist/src/plugin/workspace-migrator.js +821 -0
  306. package/dist/src/policy/authorization.js +390 -0
  307. package/dist/src/policy/repo-access.js +215 -0
  308. package/dist/src/provenance/cli.js +16 -0
  309. package/dist/src/providers/capability-matrix.js +300 -0
  310. package/dist/src/providers/capability-matrix.yaml +514 -0
  311. package/dist/src/providers/provider-definitions.js +977 -0
  312. package/dist/src/providers/provider-definitions.mjs +159 -0
  313. package/dist/src/providers/provider-inventory.js +169 -0
  314. package/dist/src/quality/feedback-ab.js +174 -0
  315. package/dist/src/quality/feedback-collector.js +176 -0
  316. package/dist/src/quality/feedback-tracker.js +123 -0
  317. package/dist/src/quality/patterns/adr.json +24 -0
  318. package/dist/src/quality/patterns/sad.json +24 -0
  319. package/dist/src/quality/patterns/test-plan.json +24 -0
  320. package/dist/src/quality/patterns/use-case.json +24 -0
  321. package/dist/src/quality/scoring.js +157 -0
  322. package/dist/src/reflections/cli.js +15 -0
  323. package/dist/src/release/plan.js +139 -0
  324. package/dist/src/research/cache/manager.js +227 -0
  325. package/dist/src/research/clients/arxiv.js +156 -0
  326. package/dist/src/research/clients/base.js +197 -0
  327. package/dist/src/research/clients/crossref.js +112 -0
  328. package/dist/src/research/clients/semantic-scholar.js +126 -0
  329. package/dist/src/research/clients/unpaywall.js +87 -0
  330. package/dist/src/research/index.js +14 -0
  331. package/dist/src/research/query-cli.js +336 -0
  332. package/dist/src/research/services/acquisition.js +313 -0
  333. package/dist/src/research/services/archival.js +225 -0
  334. package/dist/src/research/services/citation.js +279 -0
  335. package/dist/src/research/services/discovery.js +243 -0
  336. package/dist/src/research/services/documentation.js +269 -0
  337. package/dist/src/research/services/index.js +14 -0
  338. package/dist/src/research/services/provenance.js +279 -0
  339. package/dist/src/research/services/quality.js +370 -0
  340. package/dist/src/research/services/types.js +7 -0
  341. package/dist/src/research/storage-cli.js +20 -0
  342. package/dist/src/research/types.js +47 -0
  343. package/dist/src/resources/index.d.ts +2 -0
  344. package/dist/src/resources/index.js +2 -0
  345. package/dist/src/resources/web-release.d.ts +89 -0
  346. package/dist/src/resources/web-release.js +882 -0
  347. package/dist/src/rlm/cache/cli.js +162 -0
  348. package/dist/src/rlm/cache/hash.js +35 -0
  349. package/dist/src/rlm/cache/store.js +170 -0
  350. package/dist/src/rlm/cache/types.js +8 -0
  351. package/dist/src/rlm/cli.js +650 -0
  352. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  353. package/dist/src/serve/agent-router.js +205 -0
  354. package/dist/src/serve/dispatch-router.js +171 -0
  355. package/dist/src/serve/executor-registry.js +715 -0
  356. package/dist/src/serve/mission-conductor.js +177 -0
  357. package/dist/src/serve/orchestrator-adapter.js +113 -0
  358. package/dist/src/serve/orchestrator-override.js +94 -0
  359. package/dist/src/serve/orchestrator-pty.js +133 -0
  360. package/dist/src/serve/pty-bridge.js +799 -0
  361. package/dist/src/serve/sandbox-registry.js +832 -0
  362. package/dist/src/serve/screen-reader.js +228 -0
  363. package/dist/src/serve/stack-adapters.js +68 -0
  364. package/dist/src/serve/telemetry.js +143 -0
  365. package/dist/src/skills/adapters/clawhub.js +250 -0
  366. package/dist/src/skills/adapters/local.js +335 -0
  367. package/dist/src/skills/adapters/openclaw.js +316 -0
  368. package/dist/src/skills/cli.js +334 -0
  369. package/dist/src/skills/registry.js +117 -0
  370. package/dist/src/skills/run.js +259 -0
  371. package/dist/src/skills/runtime.js +94 -0
  372. package/dist/src/skills/types.js +10 -0
  373. package/dist/src/smiths/agentsmith/demo.js +116 -0
  374. package/dist/src/smiths/agentsmith/examples.js +300 -0
  375. package/dist/src/smiths/agentsmith/generator.js +503 -0
  376. package/dist/src/smiths/agentsmith/index.js +11 -0
  377. package/dist/src/smiths/agentsmith/types.js +8 -0
  378. package/dist/src/smiths/commandsmith/example.js +220 -0
  379. package/dist/src/smiths/commandsmith/generator.js +288 -0
  380. package/dist/src/smiths/commandsmith/index.js +41 -0
  381. package/dist/src/smiths/commandsmith/templates.js +296 -0
  382. package/dist/src/smiths/commandsmith/types.js +7 -0
  383. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  384. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  385. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  386. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  387. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  388. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  389. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  390. package/dist/src/smiths/context-pipeline/index.js +30 -0
  391. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  392. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  393. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  394. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  395. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  396. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  397. package/dist/src/smiths/context-pipeline/types.js +23 -0
  398. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  399. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  400. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  401. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  402. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  403. package/dist/src/smiths/hook-bridge/index.js +79 -0
  404. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  405. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  406. package/dist/src/smiths/hook-bridge/types.js +31 -0
  407. package/dist/src/smiths/index.js +39 -0
  408. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  409. package/dist/src/smiths/mcpsmith/example.js +119 -0
  410. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  411. package/dist/src/smiths/mcpsmith/index.js +17 -0
  412. package/dist/src/smiths/mcpsmith/types.js +10 -0
  413. package/dist/src/smiths/platform-paths.js +101 -0
  414. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  415. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  416. package/dist/src/smiths/skillsmith/demo.js +83 -0
  417. package/dist/src/smiths/skillsmith/examples.js +161 -0
  418. package/dist/src/smiths/skillsmith/generator.js +316 -0
  419. package/dist/src/smiths/skillsmith/index.js +12 -0
  420. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  421. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  422. package/dist/src/smiths/skillsmith/types.js +9 -0
  423. package/dist/src/smiths/toolsmith/index.js +10 -0
  424. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  425. package/dist/src/smiths/toolsmith/types.js +8 -0
  426. package/dist/src/storage/backends/fortemi.js +227 -0
  427. package/dist/src/storage/backends/fs.js +134 -0
  428. package/dist/src/storage/backends/logseq.js +309 -0
  429. package/dist/src/storage/backends/obsidian.js +233 -0
  430. package/dist/src/storage/cli.js +468 -0
  431. package/dist/src/storage/config.js +272 -0
  432. package/dist/src/storage/index.js +108 -0
  433. package/dist/src/storage/subsystem-cli.js +201 -0
  434. package/dist/src/storage/types.js +33 -0
  435. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  436. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  437. package/dist/src/testing/corpus/index.js +10 -0
  438. package/dist/src/testing/fixtures/index.js +9 -0
  439. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  440. package/dist/src/testing/generators/index.js +11 -0
  441. package/dist/src/testing/generators/test-case-generator.js +393 -0
  442. package/dist/src/testing/generators/test-code-generator.js +384 -0
  443. package/dist/src/testing/generators/use-case-parser.js +325 -0
  444. package/dist/src/testing/index.js +11 -0
  445. package/dist/src/tracker/capability-protocol.js +118 -0
  446. package/dist/src/update/checker.mjs +396 -0
  447. package/dist/src/update/notifier.mjs +235 -0
  448. package/dist/src/writing/content-diversifier.js +804 -0
  449. package/dist/src/writing/example-generator.js +959 -0
  450. package/dist/src/writing/example-templates.js +99 -0
  451. package/dist/src/writing/pattern-library.js +486 -0
  452. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  453. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  454. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  455. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  456. package/dist/src/writing/patterns/transition-words.json +1285 -0
  457. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  458. package/dist/src/writing/prompt-optimizer.js +660 -0
  459. package/dist/src/writing/prompt-templates.js +583 -0
  460. package/dist/src/writing/scoring-config-loader.js +168 -0
  461. package/dist/src/writing/validation-engine.js +595 -0
  462. package/dist/src/writing/validation-rules.js +380 -0
  463. package/dist/src/writing/voice-analyzer.js +439 -0
  464. package/dist/src/writing/voice-calibration.js +661 -0
  465. package/dist/src/writing/voice-profiles.json +588 -0
  466. package/package.json +64 -9
@@ -0,0 +1,370 @@
1
+ // HITL orchestrator driver — glues the SSE stream consumer, envelope
2
+ // extractor, delivery adapter, schema validator, and reply poster
3
+ // together.
4
+ //
5
+ // Usage:
6
+ //
7
+ // import { A2AClient } from './client.js';
8
+ // import { CliHitlDeliveryAdapter } from './hitl-cli.js';
9
+ // import { driveHitlPromptsForTask } from './hitl-driver.js';
10
+ //
11
+ // const client = new A2AClient({ ... });
12
+ // await driveHitlPromptsForTask({
13
+ // client,
14
+ // taskId,
15
+ // adapter: new CliHitlDeliveryAdapter(),
16
+ // auditLog,
17
+ // });
18
+ //
19
+ // The driver:
20
+ // 1. Subscribes to the task's SSE stream.
21
+ // 2. For each `status-update` with `state === 'input-required'`, extracts
22
+ // the hitl-prompt envelope (returns silently if absent — not every
23
+ // input-required state carries a HITL prompt).
24
+ // 3. Validates the envelope, sets up a deadline-based AbortController if
25
+ // `envelope.deadline` is present.
26
+ // 4. Routes to the configured delivery adapter to collect a response.
27
+ // 5. Validates the response against `envelope.response_schema` using Ajv.
28
+ // 6. POSTs the reply Message via `client.sendMessage`. Surfaces 422
29
+ // `hitl_response_invalid` as a clear operator error and re-prompts.
30
+ // 7. Writes one audit-log entry per decision.
31
+ //
32
+ // Concurrent prompts are correlated by `prompt_id` and tracked in an
33
+ // in-memory Map so a single task may have multiple outstanding HITL
34
+ // prompts simultaneously (per spec).
35
+ //
36
+ // @issue #1255
37
+ import { createRequire } from 'node:module';
38
+ import { existsSync } from 'node:fs';
39
+ import { dirname, join, resolve as resolvePath } from 'node:path';
40
+ import { fileURLToPath } from 'node:url';
41
+ import { buildHitlResponseMessage, extractHitlEnvelope, validateResponseStructurally, } from './hitl.js';
42
+ /** Default audit log — writes to stderr as JSONL. Replace with a file/HTTP sink in production. */
43
+ export class StderrHitlAuditLog {
44
+ append(entry) {
45
+ process.stderr.write(JSON.stringify({ hitl_audit: entry }) + '\n');
46
+ }
47
+ }
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ let _ajvCompile = null;
50
+ let _ajvBootstrapped = false;
51
+ function bootstrapAjv() {
52
+ if (_ajvBootstrapped)
53
+ return;
54
+ _ajvBootstrapped = true;
55
+ try {
56
+ const require = createRequire(fileURLToPath(import.meta.url));
57
+ const projectRoot = resolvePath(dirname(fileURLToPath(import.meta.url)), '..', '..');
58
+ const candidates = [
59
+ join(projectRoot, 'node_modules', 'ajv', 'dist', '2020.js'),
60
+ join(projectRoot, 'node_modules', 'ajv', 'dist', 'ajv.js'),
61
+ ];
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ let Ajv = null;
64
+ for (const p of candidates) {
65
+ if (existsSync(p)) {
66
+ try {
67
+ Ajv = require(p);
68
+ break;
69
+ }
70
+ catch {
71
+ /* try next */
72
+ }
73
+ }
74
+ }
75
+ if (!Ajv)
76
+ return;
77
+ const AjvClass = Ajv.default ?? Ajv;
78
+ // strict: false because operator-supplied schemas vary widely; we
79
+ // accept whatever they declare. validateSchema: false avoids meta-
80
+ // schema URI fetches.
81
+ const ajv = new AjvClass({
82
+ strict: false,
83
+ allErrors: true,
84
+ validateSchema: false,
85
+ });
86
+ const formatsPath = join(projectRoot, 'node_modules', 'ajv-formats', 'dist', 'index.js');
87
+ if (existsSync(formatsPath)) {
88
+ try {
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ const fm = require(formatsPath);
91
+ const addFormats = fm.default ?? fm;
92
+ if (typeof addFormats === 'function')
93
+ addFormats(ajv);
94
+ }
95
+ catch {
96
+ /* formats are optional */
97
+ }
98
+ }
99
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
+ _ajvCompile = (schema) => ajv.compile(schema);
101
+ }
102
+ catch {
103
+ /* graceful degrade to structural validator */
104
+ }
105
+ }
106
+ /**
107
+ * Validate `response` against the JSON Schema in `envelope.response_schema`.
108
+ * Uses Ajv when available (transitive dep); falls back to the structural
109
+ * validator in `hitl.ts` otherwise.
110
+ */
111
+ export function validateResponseAgainstSchema(envelope, response) {
112
+ bootstrapAjv();
113
+ if (_ajvCompile) {
114
+ try {
115
+ const validate = _ajvCompile(envelope.response_schema);
116
+ if (validate(response))
117
+ return { ok: true };
118
+ const errors = (validate.errors ?? []).map(formatAjvError);
119
+ return { ok: false, errors };
120
+ }
121
+ catch (e) {
122
+ // Schema itself was malformed — fall through to structural.
123
+ // Don't swallow silently: include the error in fallback notes.
124
+ const structural = validateResponseStructurally(envelope.response_schema, response);
125
+ if (structural.ok)
126
+ return structural;
127
+ return {
128
+ ok: false,
129
+ errors: [
130
+ `ajv refused schema (${e.message}); structural fallback:`,
131
+ ...structural.errors,
132
+ ],
133
+ };
134
+ }
135
+ }
136
+ return validateResponseStructurally(envelope.response_schema, response);
137
+ }
138
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
139
+ function formatAjvError(err) {
140
+ const path = err.instancePath || '$';
141
+ return `${path}: ${err.message ?? 'invalid'}`;
142
+ }
143
+ /**
144
+ * Subscribe to a task's SSE stream and drive HITL prompts to completion
145
+ * via the supplied adapter. Resolves when the stream closes (task reaches
146
+ * a terminal state) or when `maxPrompts` is reached.
147
+ */
148
+ export async function driveHitlPromptsForTask(opts) {
149
+ const auditLog = opts.auditLog ?? new StderrHitlAuditLog();
150
+ const maxRetries = Math.max(1, opts.maxRevalidationRetries ?? 3);
151
+ const messageIdFactory = opts.messageIdFactory ?? defaultMessageIdFactory;
152
+ let prompts = 0;
153
+ const subscription = opts.client.subscribeToTask(opts.taskId, {
154
+ signal: opts.signal,
155
+ });
156
+ try {
157
+ for await (const event of subscription) {
158
+ const envelope = extractEnvelopeFromEvent(event);
159
+ if (!envelope)
160
+ continue;
161
+ const ctx = inferEventContext(event);
162
+ await driveOnePrompt({
163
+ envelope,
164
+ client: opts.client,
165
+ adapter: opts.adapter,
166
+ auditLog,
167
+ taskId: opts.taskId,
168
+ contextId: ctx.contextId,
169
+ deadline: envelope.deadline,
170
+ maxRetries,
171
+ messageIdFactory,
172
+ });
173
+ prompts++;
174
+ if (opts.maxPrompts !== undefined && prompts >= opts.maxPrompts)
175
+ break;
176
+ }
177
+ }
178
+ finally {
179
+ subscription.close();
180
+ }
181
+ }
182
+ /**
183
+ * Drive a single prompt-response cycle. Exposed for callers that want
184
+ * to bypass the SSE stream (e.g. when an envelope arrives via the push-
185
+ * notification webhook receiver in #1256).
186
+ */
187
+ export async function driveOnePrompt(opts) {
188
+ const auditLog = opts.auditLog;
189
+ const maxRetries = Math.max(1, opts.maxRetries ?? 3);
190
+ const messageIdFactory = opts.messageIdFactory ?? defaultMessageIdFactory;
191
+ const startedAt = Date.now();
192
+ // Set up the deadline AbortController if the envelope declares one.
193
+ const controller = new AbortController();
194
+ const deadlineMs = parseDeadline(opts.envelope.deadline);
195
+ let deadlineTimer;
196
+ if (deadlineMs !== null) {
197
+ const remaining = deadlineMs - Date.now();
198
+ if (remaining <= 0) {
199
+ controller.abort();
200
+ }
201
+ else {
202
+ deadlineTimer = setTimeout(() => controller.abort(), remaining);
203
+ }
204
+ }
205
+ let lastError;
206
+ try {
207
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
208
+ let response;
209
+ try {
210
+ response = await opts.adapter.collect(opts.envelope, {
211
+ ...(opts.taskId !== undefined ? { taskId: opts.taskId } : {}),
212
+ ...(opts.contextId !== undefined ? { contextId: opts.contextId } : {}),
213
+ signal: controller.signal,
214
+ });
215
+ }
216
+ catch (err) {
217
+ if (controller.signal.aborted) {
218
+ await auditLog.append({
219
+ decided_at: new Date().toISOString(),
220
+ operator: adapterOperator(opts.adapter),
221
+ channel: opts.adapter.name,
222
+ prompt_id: opts.envelope.prompt_id,
223
+ ...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
224
+ ...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
225
+ outcome: 'expired',
226
+ error: deadlineMs !== null && Date.now() >= deadlineMs
227
+ ? 'deadline expired before response'
228
+ : err.message,
229
+ duration_ms: Date.now() - startedAt,
230
+ });
231
+ return;
232
+ }
233
+ await auditLog.append({
234
+ decided_at: new Date().toISOString(),
235
+ operator: adapterOperator(opts.adapter),
236
+ channel: opts.adapter.name,
237
+ prompt_id: opts.envelope.prompt_id,
238
+ ...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
239
+ ...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
240
+ outcome: 'aborted',
241
+ error: err.message,
242
+ duration_ms: Date.now() - startedAt,
243
+ });
244
+ return;
245
+ }
246
+ const validation = validateResponseAgainstSchema(opts.envelope, response);
247
+ if (!validation.ok) {
248
+ lastError = validation.errors.join('; ');
249
+ // Surface the schema gap clearly and let the operator retry.
250
+ process.stderr.write(`HITL response invalid: ${lastError}\n` +
251
+ (attempt + 1 < maxRetries
252
+ ? `(retry ${attempt + 1}/${maxRetries - 1})\n`
253
+ : ''));
254
+ continue;
255
+ }
256
+ // Validation passed — POST the reply.
257
+ const reply = buildHitlResponseMessage({
258
+ promptId: opts.envelope.prompt_id,
259
+ response,
260
+ messageId: messageIdFactory(),
261
+ ...(opts.taskId !== undefined ? { taskId: opts.taskId } : {}),
262
+ ...(opts.contextId !== undefined ? { contextId: opts.contextId } : {}),
263
+ });
264
+ try {
265
+ await opts.client.sendMessage(reply);
266
+ }
267
+ catch (err) {
268
+ // Surface 422 hitl_response_invalid distinctly from network errors.
269
+ const msg = err.message;
270
+ if (/422|hitl_response_invalid/.test(msg)) {
271
+ lastError = msg;
272
+ process.stderr.write(`Executor rejected response (HTTP 422): ${msg}\n` +
273
+ (attempt + 1 < maxRetries
274
+ ? `(retry ${attempt + 1}/${maxRetries - 1})\n`
275
+ : ''));
276
+ continue;
277
+ }
278
+ await auditLog.append({
279
+ decided_at: new Date().toISOString(),
280
+ operator: adapterOperator(opts.adapter),
281
+ channel: opts.adapter.name,
282
+ prompt_id: opts.envelope.prompt_id,
283
+ ...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
284
+ ...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
285
+ outcome: 'send_failed',
286
+ error: msg,
287
+ duration_ms: Date.now() - startedAt,
288
+ });
289
+ throw err;
290
+ }
291
+ await auditLog.append({
292
+ decided_at: new Date().toISOString(),
293
+ operator: adapterOperator(opts.adapter),
294
+ channel: opts.adapter.name,
295
+ prompt_id: opts.envelope.prompt_id,
296
+ ...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
297
+ ...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
298
+ outcome: 'responded',
299
+ response,
300
+ duration_ms: Date.now() - startedAt,
301
+ });
302
+ return;
303
+ }
304
+ // Exhausted retries — record the final invalid outcome.
305
+ await auditLog.append({
306
+ decided_at: new Date().toISOString(),
307
+ operator: adapterOperator(opts.adapter),
308
+ channel: opts.adapter.name,
309
+ prompt_id: opts.envelope.prompt_id,
310
+ ...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
311
+ ...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
312
+ outcome: 'invalid',
313
+ error: lastError ?? 'response did not validate after max retries',
314
+ duration_ms: Date.now() - startedAt,
315
+ });
316
+ }
317
+ finally {
318
+ if (deadlineTimer)
319
+ clearTimeout(deadlineTimer);
320
+ }
321
+ }
322
+ // ── helpers ────────────────────────────────────────────────────────────
323
+ function extractEnvelopeFromEvent(event) {
324
+ if (event.kind === 'task-state') {
325
+ const result = extractHitlEnvelope(event.task);
326
+ if (result?.ok)
327
+ return result.envelope;
328
+ return null;
329
+ }
330
+ if (event.kind === 'status-update') {
331
+ const result = extractHitlEnvelope(event.status);
332
+ if (result?.ok)
333
+ return result.envelope;
334
+ return null;
335
+ }
336
+ return null;
337
+ }
338
+ function inferEventContext(event) {
339
+ if (event.kind === 'task-state') {
340
+ return event.task.contextId !== undefined
341
+ ? { contextId: event.task.contextId }
342
+ : {};
343
+ }
344
+ // status-update / artifact-update don't carry a contextId; the caller
345
+ // can pass one through `driveOnePrompt` directly if it has one cached.
346
+ return {};
347
+ }
348
+ function parseDeadline(deadline) {
349
+ if (!deadline)
350
+ return null;
351
+ const ms = Date.parse(deadline);
352
+ return Number.isFinite(ms) ? ms : null;
353
+ }
354
+ function adapterOperator(adapter) {
355
+ // CLI adapter exposes `operatorId`; other adapters may too. Fall back
356
+ // to the adapter name so the audit entry is never empty.
357
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
358
+ const id = adapter.operatorId;
359
+ return typeof id === 'string' && id.length > 0 ? id : adapter.name;
360
+ }
361
+ function defaultMessageIdFactory() {
362
+ // Prefer crypto.randomUUID; fall back to timestamp+random for older node.
363
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
364
+ const crypto = globalThis.crypto;
365
+ if (crypto && typeof crypto.randomUUID === 'function') {
366
+ return crypto.randomUUID();
367
+ }
368
+ return `hitl-reply-${Date.now()}-${Math.floor(Math.random() * 1e9)}`;
369
+ }
370
+ //# sourceMappingURL=hitl-driver.js.map
@@ -0,0 +1,181 @@
1
+ // HITL prompt envelope extractor + delivery adapter interface.
2
+ //
3
+ // Per `agentic-sandbox/docs/contracts/extensions/hitl-prompt/v1/spec.md`,
4
+ // when a task transitions to `input-required` the executor places a HITL
5
+ // prompt envelope at:
6
+ //
7
+ // task.status.message.metadata['https://agentic-sandbox.aiwg.io/extensions/hitl-prompt/v1']
8
+ //
9
+ // The envelope has required keys (prompt_id, prompt, response_schema) and
10
+ // optional keys (deadline, allowed_responders). AIWG's orchestrator owns
11
+ // the workflow:
12
+ //
13
+ // 1. Detect `input-required` state on a Task / status-update event
14
+ // 2. Extract the envelope
15
+ // 3. Route to a HitlDeliveryAdapter (CLI / Slack / web)
16
+ // 4. Validate the operator's response against `response_schema`
17
+ // 5. POST a reply Message with `metadata.hitl_response_for: <prompt_id>`
18
+ // and the response payload at `metadata.<URI>`
19
+ //
20
+ // This module handles steps 1–4. Step 5 lives in the A2AClient consumer
21
+ // that drives the task lifecycle.
22
+ //
23
+ // @issue #1255
24
+ import { A2A_HITL_PROMPT_V1 } from './client.js';
25
+ /** Required envelope keys per spec §Prompt envelope. */
26
+ const REQUIRED_ENVELOPE_KEYS = ['prompt_id', 'prompt', 'response_schema'];
27
+ /**
28
+ * Pull the HITL envelope out of a Task / TaskStatus / Message metadata
29
+ * blob. Returns `null` when the structure is not `input-required` or
30
+ * doesn't carry the envelope. Returns a typed envelope when valid.
31
+ *
32
+ * Pass either the full Task, just the TaskStatus, or just the
33
+ * `status.message` to suit the calling site.
34
+ */
35
+ export function extractHitlEnvelope(source) {
36
+ if (!source)
37
+ return null;
38
+ // Get to the `metadata` object that should carry the envelope.
39
+ let metadata;
40
+ let stateGuardPassed = false;
41
+ if (isTask(source)) {
42
+ if (source.status.state !== 'input-required')
43
+ return null;
44
+ stateGuardPassed = true;
45
+ metadata = source.status.message?.metadata;
46
+ }
47
+ else if (isTaskStatus(source)) {
48
+ if (source.state !== 'input-required')
49
+ return null;
50
+ stateGuardPassed = true;
51
+ metadata = source.message?.metadata;
52
+ }
53
+ else if (isMessage(source)) {
54
+ // No state to guard on; assume caller already filtered by state.
55
+ stateGuardPassed = true;
56
+ metadata = source.metadata;
57
+ }
58
+ if (!stateGuardPassed)
59
+ return null;
60
+ if (!metadata) {
61
+ return { ok: false, reason: 'no metadata on status.message' };
62
+ }
63
+ const raw = metadata[A2A_HITL_PROMPT_V1];
64
+ if (raw === undefined) {
65
+ return { ok: false, reason: `missing envelope at metadata[${A2A_HITL_PROMPT_V1}]` };
66
+ }
67
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
68
+ return { ok: false, reason: 'envelope is not an object' };
69
+ }
70
+ const env = raw;
71
+ for (const key of REQUIRED_ENVELOPE_KEYS) {
72
+ if (!(key in env)) {
73
+ return { ok: false, reason: `envelope missing required key: ${key}` };
74
+ }
75
+ }
76
+ if (typeof env['prompt_id'] !== 'string' || env['prompt_id'].length === 0) {
77
+ return { ok: false, reason: 'prompt_id must be a non-empty string' };
78
+ }
79
+ if (typeof env['prompt'] !== 'string') {
80
+ return { ok: false, reason: 'prompt must be a string' };
81
+ }
82
+ return { ok: true, envelope: env };
83
+ }
84
+ /** Build the response Message that closes a HITL prompt cycle. */
85
+ export function buildHitlResponseMessage(opts) {
86
+ const message = {
87
+ messageId: opts.messageId,
88
+ role: 'user',
89
+ parts: [
90
+ {
91
+ kind: 'data',
92
+ data: opts.response,
93
+ },
94
+ ],
95
+ metadata: {
96
+ hitl_response_for: opts.promptId,
97
+ [A2A_HITL_PROMPT_V1]: { response: opts.response },
98
+ },
99
+ };
100
+ if (opts.taskId !== undefined)
101
+ message.taskId = opts.taskId;
102
+ if (opts.contextId !== undefined)
103
+ message.contextId = opts.contextId;
104
+ return message;
105
+ }
106
+ /**
107
+ * Validate a response payload against the envelope's `response_schema`.
108
+ *
109
+ * This module deliberately stays free of an `ajv` import so consumers can
110
+ * either plug in their own validator (see `validateResponseAgainstSchema`)
111
+ * or fall back to structural checks. AIWG already has `ajv` in the dep
112
+ * graph from `src/research/`, so the typical wiring is:
113
+ *
114
+ * import Ajv from 'ajv';
115
+ * const ajv = new Ajv({ allErrors: true });
116
+ * const validate = ajv.compile(envelope.response_schema);
117
+ * const ok = validate(response);
118
+ * if (!ok) { ... use validate.errors ... }
119
+ *
120
+ * For tests we ship a tiny structural validator below that covers the
121
+ * happy path. A full `ajv` wiring lands at the orchestrator call site so
122
+ * AIWG can pick its own validator strategy (Ajv strict mode, Zod, etc.).
123
+ */
124
+ export function validateResponseStructurally(schema, response) {
125
+ const errors = [];
126
+ walk(schema, response, '$', errors);
127
+ return errors.length === 0 ? { ok: true } : { ok: false, errors };
128
+ }
129
+ function walk(schema, value, path, errors) {
130
+ if (schema === null || typeof schema !== 'object' || Array.isArray(schema))
131
+ return;
132
+ const s = schema;
133
+ if (typeof s['type'] === 'string') {
134
+ const expected = s['type'];
135
+ const actual = typeOf(value);
136
+ if (expected !== actual) {
137
+ errors.push(`${path}: expected ${expected}, got ${actual}`);
138
+ return;
139
+ }
140
+ }
141
+ if (s['type'] === 'object' && value !== null && typeof value === 'object' && !Array.isArray(value)) {
142
+ const v = value;
143
+ const required = Array.isArray(s['required']) ? s['required'] : [];
144
+ for (const r of required) {
145
+ if (typeof r === 'string' && !(r in v)) {
146
+ errors.push(`${path}.${r}: required field missing`);
147
+ }
148
+ }
149
+ const properties = s['properties'] && typeof s['properties'] === 'object' && !Array.isArray(s['properties'])
150
+ ? s['properties']
151
+ : {};
152
+ for (const [k, sub] of Object.entries(properties)) {
153
+ if (k in v)
154
+ walk(sub, v[k], `${path}.${k}`, errors);
155
+ }
156
+ }
157
+ if (s['type'] === 'array' && Array.isArray(value)) {
158
+ const items = s['items'];
159
+ if (items) {
160
+ value.forEach((el, i) => walk(items, el, `${path}[${i}]`, errors));
161
+ }
162
+ }
163
+ }
164
+ function typeOf(v) {
165
+ if (v === null)
166
+ return 'null';
167
+ if (Array.isArray(v))
168
+ return 'array';
169
+ return typeof v;
170
+ }
171
+ // ---------- narrow type guards ----------
172
+ function isTask(v) {
173
+ return typeof v === 'object' && v !== null && 'id' in v && 'status' in v;
174
+ }
175
+ function isTaskStatus(v) {
176
+ return typeof v === 'object' && v !== null && 'state' in v && !('id' in v);
177
+ }
178
+ function isMessage(v) {
179
+ return typeof v === 'object' && v !== null && 'messageId' in v && 'role' in v;
180
+ }
181
+ //# sourceMappingURL=hitl.js.map