@inneranimalmedia/agentsam-sdk 2.6.2 → 2.6.4

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 (661) hide show
  1. package/AGENTSAM.md +51 -1
  2. package/README.md +95 -0
  3. package/apps/README.md +34 -0
  4. package/apps/cad-creator/README.md +728 -0
  5. package/apps/cad-creator/shared/cad/package.json +19 -0
  6. package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
  7. package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
  8. package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
  9. package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
  10. package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
  11. package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
  12. package/apps/cad-creator/shared/cad/src/index.ts +4 -0
  13. package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
  14. package/apps/cad-creator/shared/cad/src/types.ts +507 -0
  15. package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
  16. package/bin/agentsam +16 -1
  17. package/docs/AUTORAG.md +58 -0
  18. package/docs/BRAND_INTELLIGENCE.md +30 -0
  19. package/docs/CLI_SHELL.md +4 -2
  20. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  21. package/docs/MERKLE.md +4 -0
  22. package/docs/PROJECT_CONFIG.md +3 -0
  23. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  24. package/docs/THEME_REFINERY.md +120 -0
  25. package/docs/architecture/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
  26. package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
  27. package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  28. package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
  29. package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
  30. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +28 -0
  31. package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
  32. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  33. package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
  34. package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
  35. package/docs/architecture/SAM_KERNEL.md +181 -0
  36. package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
  37. package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
  38. package/docs/architecture/STORAGE.md +87 -0
  39. package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
  40. package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  41. package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -0
  42. package/docs/cad-project-tools.md +69 -0
  43. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  44. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  45. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  46. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  47. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  48. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  49. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  50. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  51. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  52. package/docs/plugins.md +43 -0
  53. package/docs/tools/README.md +57 -0
  54. package/docs/tools/agent-and-orchestration.md +49 -0
  55. package/docs/tools/browser-and-research.md +46 -0
  56. package/docs/tools/cloudflare-platform.md +32 -0
  57. package/docs/tools/cms.md +25 -0
  58. package/docs/tools/communications.md +41 -0
  59. package/docs/tools/database-and-storage.md +62 -0
  60. package/docs/tools/design-and-media.md +64 -0
  61. package/docs/tools/filesystem-and-code.md +55 -0
  62. package/docs/tools/github.md +56 -0
  63. package/docs/tools/integrations-and-misc.md +16 -0
  64. package/docs/tools/memory.md +21 -0
  65. package/docs/tools/terminal-and-execution.md +29 -0
  66. package/docs/tools/tickets-and-platform.md +30 -0
  67. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  68. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  69. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  70. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  71. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  72. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  73. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  74. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  75. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  76. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  77. package/migrations/d1/0010_portable_tickets_memory.sql +140 -0
  78. package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
  79. package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
  80. package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
  81. package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
  82. package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
  83. package/migrations/d1/0013_identity_oauth_states.sql +15 -0
  84. package/migrations/d1/0014_auth_event_log.sql +20 -0
  85. package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
  86. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
  87. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  88. package/migrations/runtime/0002_project_sessions.sql +15 -0
  89. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  90. package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
  91. package/package.json +107 -12
  92. package/packages/agentsam-brand/README.md +21 -0
  93. package/packages/agentsam-brand/package.json +22 -0
  94. package/packages/agentsam-brand/src/contract.js +59 -0
  95. package/packages/agentsam-brand/src/extract.js +126 -0
  96. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  97. package/packages/agentsam-brand/src/index.js +48 -0
  98. package/packages/agentsam-brand/src/plan.js +115 -0
  99. package/packages/agentsam-brand/src/resolve.js +139 -0
  100. package/packages/agentsam-brand/src/scan.js +250 -0
  101. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  102. package/packages/agentsam-contracts/README.md +23 -0
  103. package/packages/agentsam-contracts/package.json +32 -0
  104. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  105. package/packages/agentsam-contracts/src/agent.ts +35 -0
  106. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  107. package/packages/agentsam-contracts/src/authority.ts +29 -0
  108. package/packages/agentsam-contracts/src/context.ts +16 -0
  109. package/packages/agentsam-contracts/src/errors.ts +62 -0
  110. package/packages/agentsam-contracts/src/events.ts +47 -0
  111. package/packages/agentsam-contracts/src/execution.ts +50 -0
  112. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  113. package/packages/agentsam-contracts/src/identity.ts +16 -0
  114. package/packages/agentsam-contracts/src/index.ts +14 -0
  115. package/packages/agentsam-contracts/src/models.ts +9 -0
  116. package/packages/agentsam-contracts/src/providers.ts +33 -0
  117. package/packages/agentsam-contracts/src/repository.ts +64 -0
  118. package/packages/agentsam-contracts/src/tools.ts +98 -0
  119. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  120. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  121. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  122. package/packages/agentsam-contracts/tsconfig.json +12 -0
  123. package/packages/agentsam-errors/package.json +17 -0
  124. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  125. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  126. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  127. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  128. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  129. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  130. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  131. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  132. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  133. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  134. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  135. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  136. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  137. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  138. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  139. package/packages/agentsam-errors/src/envelope.js +239 -0
  140. package/packages/agentsam-errors/src/error.js +24 -0
  141. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  142. package/packages/agentsam-errors/src/index.js +11 -0
  143. package/packages/agentsam-errors/src/normalize.js +30 -0
  144. package/packages/agentsam-errors/src/recovery.js +301 -0
  145. package/packages/agentsam-errors/src/redaction.js +52 -0
  146. package/packages/agentsam-errors/src/render.js +16 -0
  147. package/packages/agentsam-errors/src/retry.js +10 -0
  148. package/packages/agentsam-errors/src/transport.js +52 -0
  149. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  150. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  151. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  152. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  153. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  154. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  155. package/packages/agentsam-knowledge/package.json +15 -0
  156. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  157. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  158. package/packages/agentsam-knowledge/src/index.js +3 -0
  159. package/packages/agentsam-knowledge/src/providers/index.js +107 -0
  160. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  161. package/packages/agentsam-nav/README.md +40 -0
  162. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  163. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  164. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  165. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  166. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  167. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  168. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  169. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  170. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  171. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  172. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  173. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  174. package/packages/agentsam-nav/dist/browser.js +613 -0
  175. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  176. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  177. package/packages/agentsam-nav/dist/index.js +614 -0
  178. package/packages/agentsam-nav/dist/legacy.css +83 -0
  179. package/packages/agentsam-nav/dist/shell.css +113 -0
  180. package/packages/agentsam-nav/dist/theme.css +113 -0
  181. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  182. package/packages/agentsam-nav/package.json +43 -0
  183. package/packages/agentsam-queue-control/README.md +107 -0
  184. package/packages/agentsam-queue-control/package.json +31 -0
  185. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  186. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  187. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  188. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  189. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  190. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  191. package/packages/agentsam-queue-control/src/index.js +7 -0
  192. package/packages/agentsam-queue-control/src/policy.js +88 -0
  193. package/packages/agentsam-queue-control/src/topology.js +66 -0
  194. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  195. package/packages/agentsam-repository/src/goap.js +718 -0
  196. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  197. package/packages/agentsam-repository/src/index.js +5 -0
  198. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  199. package/packages/agentsam-repository/src/tickets.js +184 -0
  200. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  201. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  202. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  203. package/packages/connectors/cloudflare/src/index.js +297 -15
  204. package/packages/connectors/cloudflare/src/owner.js +43 -40
  205. package/packages/connectors/cloudflare/src/routes.js +176 -26
  206. package/packages/connectors/cloudflare/tests/connector.test.mjs +137 -2
  207. package/packages/heuristic-theme/README.md +11 -0
  208. package/packages/heuristic-theme/package.json +25 -0
  209. package/packages/heuristic-theme/src/index.js +2 -0
  210. package/packages/heuristic-theme/src/registry.js +36 -0
  211. package/packages/heuristic-theme/src/theme.js +41 -0
  212. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  213. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  214. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  215. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  216. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +83 -0
  217. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  218. package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
  219. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +31 -0
  220. package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
  221. package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
  222. package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
  223. package/packages/identity/package.json +4 -3
  224. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  225. package/packages/identity/src/adapters/cloudflare-d1/index.js +156 -18
  226. package/packages/identity/src/adapters/sqlite/index.js +319 -0
  227. package/packages/identity/src/app/verify-app.js +95 -0
  228. package/packages/identity/src/contracts/identity-store.js +115 -0
  229. package/packages/identity/src/contracts/provider.js +3 -2
  230. package/packages/identity/src/contracts/route-ids.js +30 -0
  231. package/packages/identity/src/contracts/route-projection.js +218 -0
  232. package/packages/identity/src/contracts/routes.js +11 -0
  233. package/packages/identity/src/core/browser-paths.js +4 -5
  234. package/packages/identity/src/core/constants.js +13 -8
  235. package/packages/identity/src/core/session-policy.js +32 -0
  236. package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -9
  237. package/packages/identity/src/frontend/auth-portal/pages/reset.html +3 -3
  238. package/packages/identity/src/frontend/auth-portal/pages/signup.html +3 -3
  239. package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
  240. package/packages/identity/src/index.js +27 -0
  241. package/packages/identity/src/oauth/README.md +10 -4
  242. package/packages/identity/src/oauth/credentials.js +31 -11
  243. package/packages/identity/src/oauth/finalize-inbound.js +1 -1
  244. package/packages/identity/src/oauth/iam-platform.js +13 -12
  245. package/packages/identity/src/oauth/redirect-paths.js +27 -36
  246. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  247. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  248. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  249. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  250. package/packages/identity/src/providers/index.js +18 -2
  251. package/packages/identity/src/server/identity-service.js +35 -8
  252. package/packages/identity/src/server/mount-policy.js +30 -0
  253. package/packages/identity/src/server/post-auth.js +79 -0
  254. package/packages/identity/src/server/worker-router.js +153 -66
  255. package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
  256. package/packages/identity/tests/iam-provider.test.mjs +1 -1
  257. package/packages/identity/tests/identity-service.test.mjs +47 -1
  258. package/packages/identity/tests/oauth-credentials.test.mjs +3 -1
  259. package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
  260. package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
  261. package/packages/providers/completeful/README.md +38 -0
  262. package/packages/providers/completeful/package.json +29 -0
  263. package/packages/providers/completeful/src/client.js +162 -0
  264. package/packages/providers/completeful/src/events.js +49 -0
  265. package/packages/providers/completeful/src/index.js +22 -0
  266. package/packages/providers/completeful/src/tools.js +579 -0
  267. package/packages/providers/completeful/src/webhooks.js +55 -0
  268. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  269. package/packages/theme-church-site/README.md +10 -0
  270. package/packages/theme-church-site/package.json +31 -0
  271. package/packages/theme-church-site/src/harvest.json +14 -0
  272. package/packages/theme-church-site/src/index.js +85 -0
  273. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  274. package/packages/theme-companions-site/README.md +10 -0
  275. package/packages/theme-companions-site/package.json +31 -0
  276. package/packages/theme-companions-site/src/harvest.json +12 -0
  277. package/packages/theme-companions-site/src/index.js +83 -0
  278. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  279. package/packages/theme-floors-site/README.md +10 -0
  280. package/packages/theme-floors-site/package.json +31 -0
  281. package/packages/theme-floors-site/src/harvest.json +14 -0
  282. package/packages/theme-floors-site/src/index.js +83 -0
  283. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  284. package/packages/theme-fuelnfree-site/README.md +10 -0
  285. package/packages/theme-fuelnfree-site/package.json +31 -0
  286. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  287. package/packages/theme-fuelnfree-site/src/index.js +82 -0
  288. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  289. package/packages/theme-handyman-site/README.md +10 -0
  290. package/packages/theme-handyman-site/package.json +31 -0
  291. package/packages/theme-handyman-site/src/harvest.json +10 -0
  292. package/packages/theme-handyman-site/src/index.js +84 -0
  293. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  294. package/packages/theme-insurance-site/README.md +10 -0
  295. package/packages/theme-insurance-site/package.json +31 -0
  296. package/packages/theme-insurance-site/src/harvest.json +10 -0
  297. package/packages/theme-insurance-site/src/index.js +84 -0
  298. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  299. package/packages/theme-shinshu-site/README.md +10 -0
  300. package/packages/theme-shinshu-site/package.json +31 -0
  301. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  302. package/packages/theme-shinshu-site/src/index.js +84 -0
  303. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  304. package/packages/work-graph/README.md +49 -0
  305. package/packages/work-graph/package.json +19 -0
  306. package/packages/work-graph/prototype/README.md +32 -0
  307. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  308. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  309. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  310. package/packages/work-graph/prototype-gnantt.html +655 -0
  311. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  312. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  313. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  314. package/packages/work-graph/src/index.js +76 -0
  315. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  316. package/packages/work-graph/src/renderers/timeline.js +16 -0
  317. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  318. package/protocol/README.md +12 -0
  319. package/protocol/apps/agentsam.app.v1.schema.json +51 -0
  320. package/protocol/brand/brandpack.v1.schema.json +43 -0
  321. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  322. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  323. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  324. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  325. package/protocol/capabilities/manifest.json +163 -1
  326. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  327. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  328. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  329. package/protocol/commerce/catalog.v1.json +50 -0
  330. package/protocol/credentials/issue.v1.schema.json +38 -0
  331. package/protocol/database/connection.v1.schema.json +41 -0
  332. package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
  333. package/protocol/errors/error-catalog.json +164 -0
  334. package/protocol/errors/error-envelope.schema.json +678 -0
  335. package/protocol/errors/recovery.v1.schema.json +50 -0
  336. package/protocol/features/README.md +57 -0
  337. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  338. package/protocol/features/catalog.json +65 -0
  339. package/protocol/features/examples/provider-resend.feature.json +17 -0
  340. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  341. package/protocol/knowledge/LIFECYCLE.md +140 -0
  342. package/protocol/knowledge/README.md +4 -0
  343. package/protocol/presets/catalog.json +128 -19
  344. package/protocol/rpc/v1/errors.proto +24 -0
  345. package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
  346. package/protocol/sam/activity.v1.schema.json +48 -0
  347. package/protocol/sam/answer.v1.schema.json +35 -0
  348. package/protocol/sam/calibration.v1.schema.json +21 -0
  349. package/protocol/sam/decision-receipt.v1.schema.json +29 -0
  350. package/protocol/sam/evaluation.v1.schema.json +19 -0
  351. package/protocol/sam/operation.schema.json +66 -0
  352. package/protocol/sam/outcome.v1.schema.json +36 -0
  353. package/protocol/sam/question.v1.schema.json +26 -0
  354. package/protocol/sam/registry.seed.json +153 -0
  355. package/protocol/sam/result.schema.json +53 -0
  356. package/protocol/sam/state.v1.schema.json +23 -0
  357. package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
  358. package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
  359. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  360. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  361. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  362. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  363. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  364. package/protocol/ui/icon-registry.mjs +226 -0
  365. package/protocol/ui/icon.v1.schema.json +51 -0
  366. package/services/cad/server.py +249 -2
  367. package/skills/README.md +22 -9
  368. package/skills/agentsam-codebaseindex/SKILL.md +225 -0
  369. package/skills/catalog.json +14 -0
  370. package/src/agent/capability-adapter.js +15 -5
  371. package/src/agent/index.js +2 -1
  372. package/src/agent/model-turn.js +51 -0
  373. package/src/agent/responses-runner.js +304 -38
  374. package/src/capabilities/index.js +1 -0
  375. package/src/capabilities/terminal-exec.js +78 -0
  376. package/src/cli/command-catalog.js +130 -0
  377. package/src/cli/dispatch.js +48 -0
  378. package/src/cli.js +160 -10
  379. package/src/cloudflare/index.js +6 -0
  380. package/src/cloudflare/runtime-status.js +393 -0
  381. package/src/cloudflare/wrangler.js +17 -1
  382. package/src/commands/api-key.js +244 -0
  383. package/src/commands/app.js +138 -0
  384. package/src/commands/autorag.js +77 -0
  385. package/src/commands/brand.js +291 -0
  386. package/src/commands/cad.js +1 -0
  387. package/src/commands/codebaseindex.js +688 -0
  388. package/src/commands/connections.js +126 -29
  389. package/src/commands/context-economics.js +8 -0
  390. package/src/commands/db.js +7 -0
  391. package/src/commands/env.js +155 -27
  392. package/src/commands/eval.js +209 -14
  393. package/src/commands/go.js +678 -0
  394. package/src/commands/goap.js +176 -0
  395. package/src/commands/identity-init.js +27 -3
  396. package/src/commands/identity-protocol.js +195 -0
  397. package/src/commands/interaction-clack.js +115 -0
  398. package/src/commands/knowledge.js +64 -5
  399. package/src/commands/mcp.js +341 -0
  400. package/src/commands/merkle-persist.js +3 -1
  401. package/src/commands/merkle.js +18 -3
  402. package/src/commands/models.js +110 -24
  403. package/src/commands/plugins.js +175 -0
  404. package/src/commands/preferences.js +28 -8
  405. package/src/commands/product.js +53 -10
  406. package/src/commands/providers.js +173 -44
  407. package/src/commands/resume.js +9 -5
  408. package/src/commands/runtime-status.js +154 -0
  409. package/src/commands/shell.js +508 -56
  410. package/src/commands/skill.js +248 -0
  411. package/src/commands/skills.js +1 -1
  412. package/src/commands/start-local.js +4 -0
  413. package/src/commands/status.js +82 -7
  414. package/src/commands/tunnel.js +228 -195
  415. package/src/commands/whoami.js +156 -12
  416. package/src/context/budget.js +6 -0
  417. package/src/context/index.js +2 -1
  418. package/src/context/project-card.js +75 -0
  419. package/src/errors/contract.js +34 -211
  420. package/src/errors/diagnostic.js +95 -51
  421. package/src/errors/index.js +6 -13
  422. package/src/eval/index.js +6 -0
  423. package/src/eval/live.js +439 -0
  424. package/src/features/resolve.js +242 -0
  425. package/src/go/build.js +298 -0
  426. package/src/go/cloudflare.js +608 -0
  427. package/src/go/container.js +120 -0
  428. package/src/go/contract.js +144 -0
  429. package/src/go/discover.js +212 -0
  430. package/src/go/index.js +25 -0
  431. package/src/go/native-probe-runner.mjs +119 -0
  432. package/src/go/official-registry.js +280 -0
  433. package/src/go/official-release.js +10 -0
  434. package/src/go/receipts.js +144 -0
  435. package/src/go/verify.js +38 -0
  436. package/src/index.js +127 -1
  437. package/src/indexing/ingest/discover-models.js +298 -0
  438. package/src/indexing/ingest/inventory.js +243 -0
  439. package/src/indexing/ingest/job-graph.js +181 -0
  440. package/src/indexing/ingest/materials.js +210 -0
  441. package/src/knowledge/config.js +13 -5
  442. package/src/knowledge/engine.js +23 -8
  443. package/src/knowledge/index.js +1 -0
  444. package/src/knowledge/lane-registry.js +46 -0
  445. package/src/knowledge/providers/gemini.js +48 -8
  446. package/src/knowledge/service/client.js +13 -1
  447. package/src/knowledge/service/grpc-codec.js +156 -53
  448. package/src/knowledge/service/job-engine.js +133 -11
  449. package/src/knowledge/service/job-worker.js +34 -5
  450. package/src/knowledge/service/server.js +10 -1
  451. package/src/knowledge/store-discovery.js +77 -0
  452. package/src/lib/account-session.js +8 -2
  453. package/src/lib/agent-instructions.js +3 -0
  454. package/src/lib/auth.js +7 -3
  455. package/src/lib/cad/blender.js +42 -3
  456. package/src/lib/cad/d1-project-store.js +43 -0
  457. package/src/lib/cad/discovery.js +616 -0
  458. package/src/lib/cad/docker-executor.js +352 -0
  459. package/src/lib/cad/freecad.js +253 -0
  460. package/src/lib/cad/index.js +40 -0
  461. package/src/lib/cad/openscad.js +198 -0
  462. package/src/lib/cad/project-cli.d.ts +2 -0
  463. package/src/lib/cad/project-cli.js +21 -0
  464. package/src/lib/cad/project-contract.d.ts +3 -0
  465. package/src/lib/cad/project-contract.js +1 -0
  466. package/src/lib/cad/project-recipe.js +30 -0
  467. package/src/lib/cad/project-runtime.d.ts +2 -0
  468. package/src/lib/cad/project-runtime.js +53 -0
  469. package/src/lib/cad/project-store.js +25 -0
  470. package/src/lib/cad/project-workflows.js +31 -0
  471. package/src/lib/cad-docker.js +21 -2
  472. package/src/lib/cli-preferences.js +17 -2
  473. package/src/lib/core-client.js +37 -18
  474. package/src/lib/deploy/local-studio.js +6 -5
  475. package/src/lib/dockerize.js +3 -0
  476. package/src/lib/execution-approvals.js +1 -0
  477. package/src/lib/identity-scaffold.js +4 -1
  478. package/src/lib/knowledge-docker.js +9 -1
  479. package/src/lib/local-sessions.js +124 -34
  480. package/src/lib/local-status.js +35 -14
  481. package/src/lib/project-config.js +9 -0
  482. package/src/lib/provider-credentials.js +136 -32
  483. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  484. package/src/lib/scaffold/wizards/cms.js +2 -8
  485. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  486. package/src/lib/slash-commands.js +10 -2
  487. package/src/local/migrations.js +109 -1
  488. package/src/local/runtime-store.js +31 -5
  489. package/src/local/sqlite.js +36 -1
  490. package/src/local-fs/capability.js +121 -0
  491. package/src/local-fs/freshness.js +75 -0
  492. package/src/local-fs/index.js +385 -0
  493. package/src/local-fs/paths.js +100 -0
  494. package/src/local-pty/server.js +295 -19
  495. package/src/mcp/authority.js +348 -0
  496. package/src/mcp/client-adapters.js +431 -0
  497. package/src/mcp/client.js +172 -0
  498. package/src/mcp/index.js +47 -0
  499. package/src/mcp/telemetry.js +103 -0
  500. package/src/models/ai-access-onboarding.js +112 -0
  501. package/src/models/catalog.js +329 -51
  502. package/src/models/discovery.js +34 -6
  503. package/src/models/index.js +2 -0
  504. package/src/models/inventory-core.js +190 -0
  505. package/src/models/policy.js +20 -0
  506. package/src/plugins/cloudflare.js +103 -0
  507. package/src/plugins/completeful.js +69 -0
  508. package/src/plugins/contracts.js +86 -0
  509. package/src/plugins/index.js +11 -0
  510. package/src/plugins/registry.js +207 -0
  511. package/src/plugins/resource-scope.js +45 -0
  512. package/src/plugins/runtime.js +118 -0
  513. package/src/plugins/vectorize.js +31 -0
  514. package/src/progression/engine.js +171 -0
  515. package/src/progression/index.js +1 -0
  516. package/src/providers/cloudflare-chat.js +1 -1
  517. package/src/providers/gemini-generate-content.js +2 -1
  518. package/src/providers/openai-responses.js +45 -16
  519. package/src/providers/tool-schema.js +85 -0
  520. package/src/repository/index.js +29 -0
  521. package/src/rpc/generated/errors_pb.js +961 -1
  522. package/src/sam/activity/index.js +183 -0
  523. package/src/sam/client.js +252 -0
  524. package/src/sam/decision/calibration.js +109 -0
  525. package/src/sam/decision/confidence.js +126 -0
  526. package/src/sam/decision/evaluate.js +157 -0
  527. package/src/sam/decision/evaluators/deterministic.js +341 -0
  528. package/src/sam/decision/evaluators/heuristic.js +61 -0
  529. package/src/sam/decision/evaluators/select.js +50 -0
  530. package/src/sam/decision/evaluators/semantic.js +149 -0
  531. package/src/sam/decision/hierarchical.js +61 -0
  532. package/src/sam/decision/index.js +53 -0
  533. package/src/sam/decision/policy.js +86 -0
  534. package/src/sam/decision/questions.js +120 -0
  535. package/src/sam/decision/receipt.js +148 -0
  536. package/src/sam/decision/state.js +117 -0
  537. package/src/sam/decision/types.js +22 -0
  538. package/src/sam/decision/validate.js +200 -0
  539. package/src/sam/define.js +51 -0
  540. package/src/sam/index.js +65 -0
  541. package/src/sam/operations/brand-scan.js +62 -0
  542. package/src/sam/operations/cad-blender-inspect.js +36 -0
  543. package/src/sam/operations/codebaseindex-ingest.js +49 -0
  544. package/src/sam/operations/decision-evaluate.js +59 -0
  545. package/src/sam/operations/planning-astar.js +77 -0
  546. package/src/sam/operations/planning-goap.js +60 -0
  547. package/src/sam/operations/repository-inspect.js +72 -0
  548. package/src/sam/operations/security-scan.js +33 -0
  549. package/src/sam/operations/terminal-exec.js +29 -0
  550. package/src/sam/planning/astar.js +311 -0
  551. package/src/sam/planning/goap.js +177 -0
  552. package/src/sam/planning/index.js +21 -0
  553. package/src/sam/planning/state.js +84 -0
  554. package/src/sam/registry.js +48 -0
  555. package/src/sam/result.js +77 -0
  556. package/src/sam/seed.js +44 -0
  557. package/src/sam/types.js +91 -0
  558. package/src/security/local-vault.js +415 -0
  559. package/src/security/process.js +20 -4
  560. package/src/skills/catalog.js +64 -0
  561. package/src/skills/content-resolver.js +124 -0
  562. package/src/skills/hosted-store.js +37 -0
  563. package/src/skills/index.js +29 -64
  564. package/src/skills/interaction.js +102 -0
  565. package/src/skills/local-store.js +228 -0
  566. package/src/skills/manifest.js +104 -0
  567. package/src/skills/metrics.js +31 -0
  568. package/src/skills/registry.js +184 -0
  569. package/src/skills/runtime.js +287 -0
  570. package/src/skills/slash.js +44 -0
  571. package/src/status/actions.js +192 -0
  572. package/src/tools/hydrate.js +5 -1
  573. package/src/tools/index.js +7 -0
  574. package/src/tools/redact.js +64 -0
  575. package/src/tools/registry.js +83 -0
  576. package/src/tools/runtime.js +257 -0
  577. package/src/tools/search.js +21 -8
  578. package/src/ui/ansi.js +117 -3
  579. package/src/ui/cli/activity.js +76 -7
  580. package/src/ui/cli/footer.js +110 -9
  581. package/src/ui/cli/help.js +96 -96
  582. package/src/ui/wireframes.js +166 -0
  583. package/test/account-session.test.mjs +28 -0
  584. package/test/apps-scaffold-contract.test.mjs +16 -1
  585. package/test/capabilities.test.mjs +1 -1
  586. package/test/cli/api-key-env-whoami.test.mjs +129 -0
  587. package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
  588. package/test/cli/eval-live.test.mjs +219 -0
  589. package/test/cli/go.test.mjs +128 -0
  590. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  591. package/test/cli/mcp-client.test.mjs +245 -0
  592. package/test/cli/runtime-ui.test.mjs +69 -2
  593. package/test/cli/skill-npm-and-env.test.mjs +52 -0
  594. package/test/cli/status-actions.test.mjs +88 -0
  595. package/test/cli/wireframes-go-registry.test.mjs +139 -0
  596. package/test/cloudflare-connector.test.mjs +3 -6
  597. package/test/cloudflare-runtime.test.mjs +8 -1
  598. package/test/context.test.mjs +15 -0
  599. package/test/error-diagnostics.test.mjs +9 -0
  600. package/test/fixtures/cad/courtyard-house.json +208 -0
  601. package/test/go/build-source-identity.test.mjs +31 -0
  602. package/test/go/cloudflare-probe.test.mjs +317 -0
  603. package/test/go/distribution.test.mjs +28 -0
  604. package/test/integration/ai-access-onboarding.test.mjs +47 -0
  605. package/test/integration/app-command.test.mjs +55 -0
  606. package/test/integration/cad-discovery.test.mjs +158 -0
  607. package/test/integration/cad-docker-executor.test.mjs +249 -0
  608. package/test/integration/cad-execution.test.mjs +184 -0
  609. package/test/integration/cad-project-app.test.mjs +31 -0
  610. package/test/integration/cad-project-d1.test.mjs +25 -0
  611. package/test/integration/cad-project-native.test.mjs +24 -0
  612. package/test/integration/cad-project-workflow.test.mjs +9 -0
  613. package/test/integration/cad-project.test.mjs +82 -0
  614. package/test/integration/cli-help.test.mjs +5 -1
  615. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  616. package/test/integration/codebaseindex-ingest.test.mjs +166 -0
  617. package/test/integration/core-client.integration.test.mjs +55 -0
  618. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  619. package/test/integration/features-resolve.test.mjs +128 -0
  620. package/test/integration/icon-registry.test.mjs +67 -0
  621. package/test/integration/ingest-discover-models.test.mjs +30 -0
  622. package/test/integration/install-script.test.mjs +110 -0
  623. package/test/integration/inventory-core.test.mjs +53 -0
  624. package/test/integration/local-fs.test.mjs +113 -0
  625. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  626. package/test/integration/provider-env-cli.test.mjs +3 -2
  627. package/test/integration/runtime-migrations.test.mjs +6 -1
  628. package/test/integration/runtime-status.integration.test.mjs +211 -0
  629. package/test/integration/sam-activity-recovery.test.mjs +147 -0
  630. package/test/integration/sam-decision.test.mjs +584 -0
  631. package/test/integration/sam-kernel.test.mjs +99 -0
  632. package/test/integration/sam-planning-astar.test.mjs +279 -0
  633. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  634. package/test/integration/skill-runtime.test.mjs +240 -0
  635. package/test/integration/storage-architecture.test.mjs +154 -0
  636. package/test/integration/store-discovery.test.mjs +44 -0
  637. package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
  638. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  639. package/test/integration/tool-runtime.test.mjs +124 -0
  640. package/test/integration/tool-schema.test.mjs +59 -0
  641. package/test/knowledge-service.test.mjs +4 -0
  642. package/test/local-sessions.test.mjs +11 -2
  643. package/test/local-studio-deploy.test.mjs +1 -1
  644. package/test/model-catalog.test.mjs +28 -1
  645. package/test/models.test.mjs +172 -11
  646. package/test/openai-responses.test.mjs +60 -0
  647. package/test/provider-credentials.test.mjs +15 -5
  648. package/test/responses-runner.test.mjs +321 -6
  649. package/test/shell.test.mjs +151 -6
  650. package/test/smoke.mjs +2 -2
  651. package/test/tools-search.test.mjs +33 -0
  652. package/test/unit/website-assets-bindings.test.mjs +60 -0
  653. package/test/whoami-resume.test.mjs +82 -3
  654. package/examples/gorilla-shell/README.md +0 -15
  655. package/src/lib/gorilla-template.js +0 -54
  656. package/templates/gorilla-shell/App.tsx +0 -639
  657. package/templates/gorilla-shell/README.md +0 -34
  658. package/templates/gorilla-shell/index.html +0 -15
  659. package/templates/gorilla-shell/main.jsx +0 -9
  660. package/templates/gorilla-shell/package.json +0 -19
  661. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -0,0 +1,14 @@
1
+ import { classifyProviderFailure } from './provider.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ export function classifyGcpFailure(evidence = {}, context = {}) {
5
+ const statusName = String(evidence.status_name || evidence.type || evidence.code || '').toUpperCase();
6
+ const text = `${evidence.message || ''} ${evidence.error || ''}`.toLowerCase();
7
+ let reason = context.reason;
8
+ if (!reason && (evidence.project_state === 'missing' || /project.*(?:missing|not set|not specified)/.test(text))) reason = ERROR_REASON.GCP_PROJECT_MISSING;
9
+ else if (!reason && /api.*(?:disabled|not enabled)|has not been used.*before/.test(text)) reason = ERROR_REASON.GCP_API_DISABLED;
10
+ else if (!reason && (statusName === 'RESOURCE_EXHAUSTED' || /quota/.test(text))) reason = ERROR_REASON.GCP_QUOTA_EXHAUSTED;
11
+ else if (!reason && (statusName === 'NOT_FOUND' || Number(evidence.status) === 404) && (context.resource?.type === 'vm' || /instance|vm/.test(text))) reason = ERROR_REASON.GCP_VM_NOT_FOUND;
12
+ else if (!reason && (statusName === 'UNAVAILABLE' || Number(evidence.status) === 503)) reason = ERROR_REASON.GCP_VM_UNAVAILABLE;
13
+ return classifyProviderFailure('gcp', evidence, { ...context, reason, domain: context.domain || 'runtime', tool: context.tool || 'gcp' });
14
+ }
@@ -0,0 +1,22 @@
1
+ import { classifyProviderFailure } from './provider.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ function header(headers, name) {
5
+ if (!headers) return '';
6
+ if (typeof headers.get === 'function') return String(headers.get(name) || '');
7
+ const wanted = name.toLowerCase();
8
+ for (const [key, value] of Object.entries(headers)) if (String(key).toLowerCase() === wanted) return String(value || '');
9
+ return '';
10
+ }
11
+
12
+ export function classifyGitHubFailure(evidence = {}, context = {}) {
13
+ const status = Number(evidence.status || 0);
14
+ const text = `${evidence.code || ''} ${evidence.message || ''}`.toLowerCase();
15
+ let reason = context.reason;
16
+ if (!reason && evidence.installation_state === 'missing') reason = ERROR_REASON.GITHUB_INSTALLATION_MISSING;
17
+ else if (!reason && status === 403 && (header(evidence.headers, 'x-ratelimit-remaining') === '0' || /rate limit exceeded/.test(text))) reason = ERROR_REASON.GITHUB_RATE_LIMITED;
18
+ else if (!reason && status === 403 && /secondary rate limit|abuse detection/.test(text)) reason = ERROR_REASON.GITHUB_SECONDARY_RATE_LIMITED;
19
+ else if (!reason && status === 403) reason = ERROR_REASON.GITHUB_SCOPE_INSUFFICIENT;
20
+ else if (!reason && status === 404 && (context.resource?.type === 'repository' || /repository/.test(text))) reason = ERROR_REASON.GITHUB_REPOSITORY_NOT_FOUND;
21
+ return classifyProviderFailure('github', evidence, { ...context, reason, domain: context.domain || 'repository' });
22
+ }
@@ -0,0 +1,17 @@
1
+ import { classifyProviderFailure } from './provider.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ export function classifyGoogleAIFailure(evidence = {}, context = {}) {
5
+ const statusName = String(evidence.status_name || evidence.type || evidence.code || '').toUpperCase();
6
+ const message = String(evidence.message || '');
7
+ let reason = context.reason;
8
+ if (!reason && /API key not valid|invalid API key/i.test(message)) reason = ERROR_REASON.PROVIDER_CREDENTIAL_INVALID;
9
+ else if (!reason && statusName === 'UNAUTHENTICATED') reason = ERROR_REASON.PROVIDER_CREDENTIAL_INVALID;
10
+ else if (!reason && statusName === 'PERMISSION_DENIED') reason = ERROR_REASON.PROVIDER_SCOPE_INSUFFICIENT;
11
+ else if (!reason && statusName === 'RESOURCE_EXHAUSTED') reason = /billing|budget/i.test(message) ? ERROR_REASON.PROVIDER_BUDGET_EXHAUSTED : ERROR_REASON.PROVIDER_QUOTA_EXHAUSTED;
12
+ else if (!reason && statusName === 'UNAVAILABLE') reason = ERROR_REASON.PROVIDER_UNAVAILABLE;
13
+ else if (!reason && statusName === 'INVALID_ARGUMENT') reason = ERROR_REASON.PROVIDER_REQUEST_INVALID;
14
+ return classifyProviderFailure(context.provider || 'google_ai', evidence, { ...context, reason });
15
+ }
16
+
17
+ export const classifyGeminiFailure = (evidence = {}, context = {}) => classifyGoogleAIFailure(evidence, { ...context, provider: 'gemini' });
@@ -0,0 +1,55 @@
1
+ export { classifyProviderFailure, reasonFromGenericEvidence } from './provider.js';
2
+ export { classifyOpenAIFailure } from './openai.js';
3
+ export { classifyAnthropicFailure } from './anthropic.js';
4
+ export { classifyGoogleAIFailure, classifyGeminiFailure } from './google.js';
5
+ export { classifyCursorFailure } from './cursor.js';
6
+ export { classifyGitHubFailure } from './github.js';
7
+ export { classifyCloudflareFailure } from './cloudflare.js';
8
+ export { classifyDockerFailure } from './docker.js';
9
+ export { classifyGcpFailure } from './gcp.js';
10
+ export { classifyProcessFailure } from './process.js';
11
+ export { classifyOAuthFailure } from './oauth.js';
12
+ export { classifyCadFailure, classifyFreeCadFailure, classifyOpenScadFailure, classifyBlenderFailure, classifyMeshyFailure } from './cad.js';
13
+ export { classifyDeviceFailure } from './device.js';
14
+ export { classifyInternalFailure } from './internal.js';
15
+
16
+ import { classifyOpenAIFailure } from './openai.js';
17
+ import { classifyAnthropicFailure } from './anthropic.js';
18
+ import { classifyGoogleAIFailure, classifyGeminiFailure } from './google.js';
19
+ import { classifyCursorFailure } from './cursor.js';
20
+ import { classifyGitHubFailure } from './github.js';
21
+ import { classifyCloudflareFailure } from './cloudflare.js';
22
+ import { classifyDockerFailure } from './docker.js';
23
+ import { classifyGcpFailure } from './gcp.js';
24
+ import { classifyCadFailure } from './cad.js';
25
+ import { classifyDeviceFailure } from './device.js';
26
+ import { classifyInternalFailure } from './internal.js';
27
+ import { classifyProviderFailure } from './provider.js';
28
+
29
+ export function classifyFailure(source, evidence = {}, context = {}) {
30
+ const key = String(source || '').toLowerCase();
31
+ switch (key) {
32
+ case 'openai': return classifyOpenAIFailure(evidence, context);
33
+ case 'anthropic': return classifyAnthropicFailure(evidence, context);
34
+ case 'google':
35
+ case 'google_ai': return classifyGoogleAIFailure(evidence, context);
36
+ case 'gemini': return classifyGeminiFailure(evidence, context);
37
+ case 'cursor': return classifyCursorFailure(evidence, context);
38
+ case 'github': return classifyGitHubFailure(evidence, context);
39
+ case 'cloudflare': return classifyCloudflareFailure(evidence, context);
40
+ case 'docker': return classifyDockerFailure(evidence, context);
41
+ case 'gcp':
42
+ case 'google_cloud': return classifyGcpFailure(evidence, context);
43
+ case 'freecad':
44
+ case 'openscad':
45
+ case 'blender':
46
+ case 'meshy': return classifyCadFailure(key, evidence, context);
47
+ case 'device':
48
+ case 'execos_device': return classifyDeviceFailure(evidence, context);
49
+ case 'agentsam':
50
+ case 'agentsam-sdk':
51
+ case 'inneranimalmedia':
52
+ case 'execos': return classifyInternalFailure(evidence, { ...context, system: key });
53
+ default: return classifyProviderFailure(key || 'provider', evidence, context);
54
+ }
55
+ }
@@ -0,0 +1,40 @@
1
+ import { createErrorEnvelope } from '../envelope.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ const INTERNAL_REASONS = new Set([
5
+ ERROR_REASON.INTERNAL,
6
+ ERROR_REASON.INTERNAL_INVARIANT_VIOLATION,
7
+ ERROR_REASON.INTERNAL_CONFIGURATION_INVALID,
8
+ ERROR_REASON.INTERNAL_CONTRACT_VIOLATION,
9
+ ERROR_REASON.INTERNAL_ADAPTER_FAILED,
10
+ ERROR_REASON.INTERNAL_DEPENDENCY_FAILED,
11
+ ERROR_REASON.IDENTITY_RESOLUTION_FAILED,
12
+ ERROR_REASON.IDENTITY_MISMATCH,
13
+ ERROR_REASON.PERSISTENCE_FAILED,
14
+ ERROR_REASON.DATA_CORRUPT,
15
+ ERROR_REASON.DATA_LOSS,
16
+ ]);
17
+
18
+ export function classifyInternalFailure(evidence = {}, context = {}) {
19
+ const reason = context.reason && INTERNAL_REASONS.has(context.reason) ? context.reason : ERROR_REASON.INTERNAL;
20
+ return createErrorEnvelope({
21
+ reason,
22
+ message: context.message || evidence.message || 'AgentSam encountered an internal failure.',
23
+ source: context.source || { kind: 'agentsam', name: context.system || 'agentsam-sdk', service: context.service || null },
24
+ resolution_owner: 'agentsam',
25
+ severity: 'blocking_internal',
26
+ retryable: false,
27
+ remediation: { action: 'inspect_platform', message: context.remediation_message || 'AgentSam must inspect this platform failure.' },
28
+ domain: context.domain || 'runtime',
29
+ tool: context.tool || null,
30
+ stage: context.stage || 'execute',
31
+ resource: context.resource || null,
32
+ provider: context.provider || null,
33
+ provider_code: evidence.provider_code || evidence.code || null,
34
+ request_id: evidence.request_id || null,
35
+ trace_id: evidence.trace_id || context.trace_id || null,
36
+ native: { code: evidence.code, exception_type: evidence.exception_type || evidence.name, exit_code: evidence.exit_code, signal: evidence.signal, stderr: evidence.stderr, stdout: evidence.stdout, stack: evidence.stack },
37
+ environment: context.environment || null,
38
+ details: evidence.details || null,
39
+ });
40
+ }
@@ -0,0 +1,24 @@
1
+ import { createErrorEnvelope } from '../envelope.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ export function classifyOAuthFailure(error, context = {}) {
5
+ const code = String(error?.code || error || '').toLowerCase();
6
+ let reason = context.reason;
7
+ if (!reason && ['invalid_client','invalid_grant'].includes(code)) reason = ERROR_REASON.PROVIDER_CREDENTIAL_INVALID;
8
+ else if (!reason && ['unauthorized_client','access_denied'].includes(code)) reason = ERROR_REASON.USER_PERMISSION_DENIED;
9
+ else if (!reason && ['invalid_scope'].includes(code)) reason = ERROR_REASON.PROVIDER_SCOPE_INSUFFICIENT;
10
+ else if (!reason && ['invalid_request','unsupported_grant_type'].includes(code)) reason = ERROR_REASON.INPUT_INVALID;
11
+ else reason ||= ERROR_REASON.UNKNOWN;
12
+ return createErrorEnvelope({
13
+ reason,
14
+ message: context.message || error?.message || `OAuth failure: ${code || 'unknown'}`,
15
+ source: context.source || { kind: context.provider ? 'provider' : 'runtime', name: context.provider || 'oauth' },
16
+ domain: 'auth',
17
+ tool: context.provider || 'oauth',
18
+ stage: context.stage || 'oauth',
19
+ provider: context.provider || null,
20
+ provider_code: code || null,
21
+ native: { code },
22
+ details: error?.details || null,
23
+ });
24
+ }
@@ -0,0 +1,17 @@
1
+ import { classifyProviderFailure } from './provider.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ const BUDGET_CODES = new Set(['credit_balance_exhausted','organization_spend_limit_exceeded','project_spend_limit_exceeded','organization_usage_limit_exceeded']);
5
+
6
+ export function classifyOpenAIFailure(evidence = {}, context = {}) {
7
+ const code = String(evidence.code || evidence.provider_code || '').toLowerCase();
8
+ const message = String(evidence.message || '');
9
+ let reason = context.reason;
10
+ if (!reason && BUDGET_CODES.has(code)) reason = ERROR_REASON.PROVIDER_BUDGET_EXHAUSTED;
11
+ else if (!reason && (code === 'insufficient_quota' || /quota/i.test(message))) reason = ERROR_REASON.PROVIDER_QUOTA_EXHAUSTED;
12
+ else if (!reason && code === 'previous_response_not_found') reason = ERROR_REASON.CONTINUATION_INVALID;
13
+ else if (!reason && code === 'websocket_connection_limit_reached') reason = ERROR_REASON.PROVIDER_CAPACITY_EXHAUSTED;
14
+ else if (!reason && (code === 'server_is_overloaded' || /overload/i.test(message))) reason = ERROR_REASON.PROVIDER_OVERLOADED;
15
+ else if (!reason && /service[_ -]?tier/i.test(message)) reason = ERROR_REASON.SERVICE_TIER_UNSUPPORTED;
16
+ return classifyProviderFailure('openai', evidence, { ...context, reason });
17
+ }
@@ -0,0 +1,35 @@
1
+ import { createErrorEnvelope } from '../envelope.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ export function classifyProcessFailure(evidence = {}, context = {}) {
5
+ const code = String(evidence.code || '').toUpperCase();
6
+ let reason = context.reason;
7
+ if (!reason && (evidence.cancelled || code === 'ABORT_ERR' || code === 'PROCESS_CANCELLED')) reason = ERROR_REASON.CANCELLED;
8
+ else if (!reason && (evidence.timeout || code === 'ETIMEDOUT' || code === 'PROCESS_TIMEOUT')) reason = ERROR_REASON.EXECUTION_TIMEOUT;
9
+ else if (!reason && (evidence.output_limit || code === 'PROCESS_OUTPUT_LIMIT')) reason = ERROR_REASON.PROCESS_OUTPUT_LIMIT;
10
+ else if (!reason && (code === 'ENOENT' || code === 'EACCES' || evidence.spawn_failed)) reason = ERROR_REASON.PROCESS_SPAWN_FAILED;
11
+ else if (!reason && Number.isInteger(evidence.exit_code) && evidence.exit_code !== 0) reason = ERROR_REASON.PROCESS_CRASHED;
12
+ else reason ||= ERROR_REASON.EXECUTION_FAILED;
13
+ let severity = context.severity;
14
+ let remediation = context.remediation;
15
+ if (context.retryable === false && !severity && reason === ERROR_REASON.EXECUTION_TIMEOUT) {
16
+ severity = 'blocking_user_fixable';
17
+ remediation = remediation || { action: 'change_configuration', message: 'Increase process timeout or inspect execution.' };
18
+ }
19
+ return createErrorEnvelope({
20
+ reason,
21
+ message: context.message || evidence.message || 'Process failed',
22
+ source: context.source || { kind: 'runtime', name: context.tool || 'process' },
23
+ resolution_owner: context.resolution_owner,
24
+ severity,
25
+ remediation,
26
+ domain: context.domain || 'runtime',
27
+ tool: context.tool || null,
28
+ stage: context.stage || 'execute',
29
+ retryable: context.retryable,
30
+ resource: context.resource || null,
31
+ environment: context.environment || null,
32
+ native: { code: evidence.code, exception_type: evidence.exception_type, exit_code: evidence.exit_code, signal: evidence.signal, stderr: evidence.stderr, stdout: evidence.stdout, stack: evidence.stack },
33
+ details: evidence.details || null,
34
+ });
35
+ }
@@ -0,0 +1,114 @@
1
+ import { createErrorEnvelope } from '../envelope.js';
2
+ import { ERROR_REASON } from '../vocabulary.js';
3
+
4
+ function clean(value) { return value == null ? '' : String(value).trim(); }
5
+ function lower(...values) { return values.map(clean).join(' ').toLowerCase(); }
6
+ function header(headers, name) {
7
+ if (!headers) return '';
8
+ if (typeof headers.get === 'function') return clean(headers.get(name));
9
+ const wanted = name.toLowerCase();
10
+ for (const [key, value] of Object.entries(headers)) if (String(key).toLowerCase() === wanted) return clean(value);
11
+ return '';
12
+ }
13
+ function retryAfterMs(headers, explicit) {
14
+ if (Number.isFinite(explicit) && explicit >= 0) return Math.round(explicit);
15
+ const value = header(headers, 'retry-after');
16
+ if (!value) return null;
17
+ if (/^\d+(?:\.\d+)?$/.test(value)) return Math.max(0, Math.round(Number(value) * 1000));
18
+ const when = Date.parse(value);
19
+ return Number.isFinite(when) ? Math.max(0, when - Date.now()) : null;
20
+ }
21
+ function requestId(headers, explicit) {
22
+ return clean(explicit) || header(headers, 'x-request-id') || header(headers, 'request-id') || header(headers, 'cf-ray') || null;
23
+ }
24
+
25
+ function reasonFromGenericEvidence(evidence = {}) {
26
+ const status = Number(evidence.status || evidence.http_status || 0);
27
+ const code = clean(evidence.code || evidence.provider_code).toLowerCase();
28
+ const type = clean(evidence.type).toLowerCase();
29
+ const text = lower(code, type, evidence.message, evidence.error);
30
+ if (evidence.connected === false) return ERROR_REASON.PROVIDER_NOT_CONNECTED;
31
+ if (evidence.credential_state === 'missing') return ERROR_REASON.PROVIDER_CREDENTIAL_MISSING;
32
+ if (evidence.credential_state === 'expired') return ERROR_REASON.PROVIDER_CREDENTIAL_EXPIRED;
33
+ if (evidence.credential_state === 'invalid') return ERROR_REASON.PROVIDER_CREDENTIAL_INVALID;
34
+ if (/credit|billing|spend[_ -]?limit|budget|payment required/.test(text)) return ERROR_REASON.PROVIDER_BUDGET_EXHAUSTED;
35
+ if (/quota|resource[_ -]?exhausted|usage[_ -]?limit/.test(text)) return ERROR_REASON.PROVIDER_QUOTA_EXHAUSTED;
36
+ if (/context.{0,20}(too long|limit|window|length)|max(?:imum)?[_ -]?tokens|request too large/.test(text)) return ERROR_REASON.CONTEXT_WINDOW_EXCEEDED;
37
+ if (/service[_ -]?tier/.test(text) && /(unsupported|invalid|not available)/.test(text)) return ERROR_REASON.SERVICE_TIER_UNSUPPORTED;
38
+ if (/region|country|location/.test(text) && /(unsupported|not available|restricted)/.test(text)) return ERROR_REASON.PROVIDER_REGION_UNSUPPORTED;
39
+ if (/content[_ -]?(filter|policy|blocked)|safety|moderation/.test(text)) return ERROR_REASON.PROVIDER_CONTENT_BLOCKED;
40
+ if (/model/.test(text) && /(not found|unknown|does not exist|unsupported)/.test(text)) return ERROR_REASON.PROVIDER_MODEL_NOT_FOUND;
41
+ if (status === 401 || /invalid[_ -]?(api[_ -]?)?key|authentication_error|unauthenticated/.test(text)) return ERROR_REASON.PROVIDER_CREDENTIAL_INVALID;
42
+ if (status === 403 || /permission|forbidden|scope/.test(text)) return ERROR_REASON.PROVIDER_SCOPE_INSUFFICIENT;
43
+ if (status === 429 || /rate[_ -]?limit|too many requests|slow[_ -]?down/.test(text)) return ERROR_REASON.PROVIDER_RATE_LIMITED;
44
+ if (status === 529 || /overload|overloaded|capacity/.test(text)) return ERROR_REASON.PROVIDER_OVERLOADED;
45
+ if (status >= 500) return ERROR_REASON.PROVIDER_UNAVAILABLE;
46
+ if (status === 404) return ERROR_REASON.TARGET_NOT_FOUND;
47
+ if (status === 400 || status === 409 || status === 422) return ERROR_REASON.PROVIDER_REQUEST_INVALID;
48
+ return ERROR_REASON.UNKNOWN;
49
+ }
50
+
51
+ export function classifyProviderFailure(provider, evidence = {}, context = {}) {
52
+ const name = clean(provider || context.provider || 'provider').toLowerCase();
53
+ const reason = context.reason || reasonFromGenericEvidence(evidence);
54
+ const providerCode = clean(evidence.code || evidence.provider_code || evidence.type) || null;
55
+ const requestOrigin = clean(context.request_origin || evidence.request_origin).toLowerCase();
56
+ const configuredOwner = clean(context.credential_owner || context.account_owner || context.configuration_owner).toLowerCase();
57
+ const internalRequestFailure = reason === ERROR_REASON.PROVIDER_REQUEST_INVALID && requestOrigin === 'agentsam';
58
+ const ownerSensitiveFailure = [
59
+ ERROR_REASON.PROVIDER_NOT_CONNECTED,
60
+ ERROR_REASON.PROVIDER_CREDENTIAL_MISSING,
61
+ ERROR_REASON.PROVIDER_CREDENTIAL_INVALID,
62
+ ERROR_REASON.PROVIDER_CREDENTIAL_EXPIRED,
63
+ ERROR_REASON.PROVIDER_SCOPE_INSUFFICIENT,
64
+ ERROR_REASON.PROVIDER_BUDGET_EXHAUSTED,
65
+ ERROR_REASON.PROVIDER_QUOTA_EXHAUSTED,
66
+ ].includes(reason);
67
+ const platformOwnedFailure = ownerSensitiveFailure && ['agentsam','inneranimalmedia','platform'].includes(configuredOwner);
68
+ const organizationOwnedFailure = ownerSensitiveFailure && ['organization','organization_admin','org'].includes(configuredOwner);
69
+ const localConfigurationFailure = [ERROR_REASON.PROVIDER_NOT_CONNECTED, ERROR_REASON.PROVIDER_CREDENTIAL_MISSING].includes(reason);
70
+ const resolutionOwner = internalRequestFailure || platformOwnedFailure
71
+ ? 'agentsam'
72
+ : organizationOwnedFailure
73
+ ? 'organization_admin'
74
+ : context.resolution_owner;
75
+ const severity = internalRequestFailure || platformOwnedFailure ? 'blocking_internal' : context.severity;
76
+ const remediation = internalRequestFailure || platformOwnedFailure
77
+ ? { action: 'inspect_platform', message: 'AgentSam must inspect its provider integration or platform-owned credential.' }
78
+ : organizationOwnedFailure
79
+ ? { action: 'contact_organization_admin', message: 'An organization administrator must update this provider connection or account.' }
80
+ : context.remediation;
81
+ const source = context.source || (localConfigurationFailure
82
+ ? platformOwnedFailure
83
+ ? { kind: 'agentsam', name: 'inneranimalmedia', service: name }
84
+ : { kind: 'user', name: organizationOwnedFailure ? 'organization_configuration' : 'project_configuration', service: name }
85
+ : { kind: 'provider', name, service: clean(context.service || evidence.service) || null });
86
+ return createErrorEnvelope({
87
+ reason,
88
+ message: context.message || evidence.message || evidence.error || `${name} request failed`,
89
+ source,
90
+ resolution_owner: resolutionOwner,
91
+ severity,
92
+ remediation,
93
+ domain: context.domain || 'provider',
94
+ tool: context.tool || name,
95
+ stage: context.stage || 'request',
96
+ retryable: context.retryable,
97
+ retry_after_ms: retryAfterMs(evidence.headers, evidence.retry_after_ms),
98
+ http_status: Number(evidence.status || evidence.http_status || 0) || undefined,
99
+ provider: name,
100
+ provider_code: providerCode,
101
+ request_id: requestId(evidence.headers, evidence.request_id),
102
+ trace_id: evidence.trace_id || context.trace_id || null,
103
+ resource: context.resource || null,
104
+ environment: context.environment || null,
105
+ native: {
106
+ code: providerCode,
107
+ exception_type: evidence.type || evidence.exception_type || null,
108
+ stack: evidence.stack || null,
109
+ },
110
+ details: evidence.details ?? evidence.body ?? null,
111
+ });
112
+ }
113
+
114
+ export { reasonFromGenericEvidence };
@@ -0,0 +1,239 @@
1
+ import {
2
+ DEFAULT_HTTP_STATUS,
3
+ ERROR_CODE,
4
+ ERROR_DOMAIN,
5
+ ERROR_REASON_POLICY,
6
+ ERROR_RESOLUTION_OWNER,
7
+ ERROR_SCHEMA_VERSION,
8
+ ERROR_SEVERITY,
9
+ ERROR_SOURCE_KIND,
10
+ GRPC_STATUS,
11
+ REMEDIATION_ACTION,
12
+ } from './vocabulary.js';
13
+ import { fingerprintError } from './fingerprint.js';
14
+ import { redactErrorValue, redactString, sanitizeNativeEvidence } from './redaction.js';
15
+
16
+ const REASON_PATTERN = /^[a-z][a-z0-9_]{0,127}$/;
17
+ const VALUES = object => new Set(Object.values(object));
18
+ const CODE_VALUES = VALUES(ERROR_CODE);
19
+ const SEVERITY_VALUES = VALUES(ERROR_SEVERITY);
20
+ const SOURCE_VALUES = VALUES(ERROR_SOURCE_KIND);
21
+ const OWNER_VALUES = VALUES(ERROR_RESOLUTION_OWNER);
22
+ const DOMAIN_VALUES = VALUES(ERROR_DOMAIN);
23
+ const ACTION_VALUES = VALUES(REMEDIATION_ACTION);
24
+ const GRPC_CODE_BY_NUMBER = new Map(Object.entries(GRPC_STATUS).map(([name, value]) => [value, ERROR_CODE[name]]));
25
+ const HTTP_OVERRIDES = new Map([
26
+ [400, ERROR_CODE.INVALID_ARGUMENT], [401, ERROR_CODE.UNAUTHENTICATED], [403, ERROR_CODE.PERMISSION_DENIED],
27
+ [404, ERROR_CODE.NOT_FOUND], [408, ERROR_CODE.DEADLINE_EXCEEDED], [409, ERROR_CODE.ABORTED],
28
+ [412, ERROR_CODE.FAILED_PRECONDITION], [413, ERROR_CODE.RESOURCE_EXHAUSTED], [415, ERROR_CODE.INVALID_ARGUMENT],
29
+ [422, ERROR_CODE.INVALID_ARGUMENT], [429, ERROR_CODE.RESOURCE_EXHAUSTED], [499, ERROR_CODE.CANCELLED],
30
+ [500, ERROR_CODE.INTERNAL], [501, ERROR_CODE.UNIMPLEMENTED], [502, ERROR_CODE.UNAVAILABLE],
31
+ [503, ERROR_CODE.UNAVAILABLE], [504, ERROR_CODE.DEADLINE_EXCEEDED], [520, ERROR_CODE.UNAVAILABLE],
32
+ [521, ERROR_CODE.UNAVAILABLE], [522, ERROR_CODE.UNAVAILABLE], [523, ERROR_CODE.UNAVAILABLE],
33
+ [524, ERROR_CODE.DEADLINE_EXCEEDED], [525, ERROR_CODE.UNAVAILABLE], [526, ERROR_CODE.UNAVAILABLE],
34
+ [530, ERROR_CODE.UNAVAILABLE],
35
+ ]);
36
+ const USER_ACTIONS = new Set([
37
+ REMEDIATION_ACTION.REAUTHENTICATE,
38
+ REMEDIATION_ACTION.CONNECT_PROVIDER,
39
+ REMEDIATION_ACTION.CONFIGURE_PROVIDER_CREDENTIAL,
40
+ REMEDIATION_ACTION.REFRESH_PROVIDER_CREDENTIAL,
41
+ REMEDIATION_ACTION.REQUEST_PERMISSION,
42
+ REMEDIATION_ACTION.REENROLL_DEVICE,
43
+ REMEDIATION_ACTION.INSTALL_DEPENDENCY,
44
+ REMEDIATION_ACTION.UPGRADE_DEPENDENCY,
45
+ REMEDIATION_ACTION.CONFIGURE_DEPENDENCY,
46
+ REMEDIATION_ACTION.CHANGE_CONFIGURATION,
47
+ REMEDIATION_ACTION.CHANGE_INPUT,
48
+ REMEDIATION_ACTION.REDUCE_SCOPE,
49
+ REMEDIATION_ACTION.INCREASE_QUOTA,
50
+ REMEDIATION_ACTION.ADD_BUDGET,
51
+ REMEDIATION_ACTION.SELECT_MODEL,
52
+ REMEDIATION_ACTION.CHANGE_REGION,
53
+ REMEDIATION_ACTION.RESTART_RUNTIME,
54
+ ]);
55
+
56
+ function clean(value) { return value == null ? '' : String(value).trim(); }
57
+ function optional(value, max = 512) { const text = clean(value); return text ? redactString(text, max) : null; }
58
+ function deepFreeze(value) {
59
+ if (!value || typeof value !== 'object' || Object.isFrozen(value)) return value;
60
+ for (const child of Object.values(value)) deepFreeze(child);
61
+ return Object.freeze(value);
62
+ }
63
+ function normalizeSource(source, fallbackName = 'agentsam-sdk') {
64
+ const input = source && typeof source === 'object' ? source : {};
65
+ const kind = clean(input.kind || ERROR_SOURCE_KIND.AGENTSAM);
66
+ if (!SOURCE_VALUES.has(kind)) throw new TypeError(`Unknown AgentSam error source kind: ${kind}`);
67
+ return Object.freeze({
68
+ kind,
69
+ name: optional(input.name || fallbackName, 256) || fallbackName,
70
+ service: optional(input.service, 256),
71
+ });
72
+ }
73
+ function normalizeRemediation(remediation, policy) {
74
+ const input = remediation && typeof remediation === 'object' ? remediation : {};
75
+ const action = clean(input.action || policy.remediation_action || REMEDIATION_ACTION.NONE);
76
+ if (!ACTION_VALUES.has(action)) throw new TypeError(`Unknown AgentSam remediation action: ${action}`);
77
+ return Object.freeze({
78
+ action,
79
+ message: optional(input.message, 2_000),
80
+ automatic: input.automatic === true,
81
+ command: optional(input.command, 1_000),
82
+ url: optional(input.url, 2_000),
83
+ });
84
+ }
85
+ function normalizeResource(resource) {
86
+ if (!resource || typeof resource !== 'object') return null;
87
+ const type = optional(resource.type, 128);
88
+ if (!type) return null;
89
+ return Object.freeze({ type, id: optional(resource.id, 512), name: optional(resource.name, 512) });
90
+ }
91
+ function normalizeEnvironment(environment) {
92
+ if (!environment || typeof environment !== 'object') return null;
93
+ return Object.freeze({
94
+ detected_version: optional(environment.detected_version, 512),
95
+ required_version: optional(environment.required_version, 512),
96
+ component: optional(environment.component, 512),
97
+ runtime: optional(environment.runtime, 512),
98
+ platform: optional(environment.platform, 512),
99
+ });
100
+ }
101
+
102
+ export function canonicalCodeFromHttpStatus(status) {
103
+ const value = Number(status || 0);
104
+ return HTTP_OVERRIDES.get(value) || (value >= 500 ? ERROR_CODE.INTERNAL : ERROR_CODE.UNKNOWN);
105
+ }
106
+ export function canonicalCodeFromGrpcStatus(status) { return GRPC_CODE_BY_NUMBER.get(Number(status)) || ERROR_CODE.UNKNOWN; }
107
+ export function defaultHttpStatusForCode(code) { return DEFAULT_HTTP_STATUS[code] ?? 500; }
108
+ export function grpcStatusForCode(code) { return GRPC_STATUS[code] ?? GRPC_STATUS.UNKNOWN; }
109
+
110
+ export function createErrorEnvelope(input = {}) {
111
+ const reason = clean(input.reason || 'unknown');
112
+ if (!REASON_PATTERN.test(reason)) throw new TypeError(`Invalid AgentSam error reason: ${reason}`);
113
+ const policy = ERROR_REASON_POLICY[reason] || ERROR_REASON_POLICY.unknown;
114
+ const code = clean(input.code || policy.code);
115
+ if (!CODE_VALUES.has(code) || code === ERROR_CODE.OK) throw new TypeError(`Unknown AgentSam error code: ${code}`);
116
+ if (ERROR_REASON_POLICY[reason] && code !== policy.code) {
117
+ throw new TypeError(`AgentSam error reason ${reason} requires canonical code ${policy.code}, received ${code}`);
118
+ }
119
+ const severity = clean(input.severity || policy.severity);
120
+ if (!SEVERITY_VALUES.has(severity)) throw new TypeError(`Unknown AgentSam error severity: ${severity}`);
121
+ const retryable = input.retryable == null ? Boolean(policy.retryable) : Boolean(input.retryable);
122
+ const resolutionOwner = clean(input.resolution_owner || policy.resolution_owner);
123
+ if (!OWNER_VALUES.has(resolutionOwner)) throw new TypeError(`Unknown AgentSam error resolution owner: ${resolutionOwner}`);
124
+ const domain = clean(input.domain || ERROR_DOMAIN.RUNTIME);
125
+ if (!DOMAIN_VALUES.has(domain)) throw new TypeError(`Unknown AgentSam error domain: ${domain}`);
126
+ const remediation = normalizeRemediation(input.remediation, policy);
127
+ if (severity === ERROR_SEVERITY.TRANSIENT && !retryable) throw new TypeError('transient AgentSam errors must be retryable');
128
+ if ((remediation.action === REMEDIATION_ACTION.RETRY || remediation.action === REMEDIATION_ACTION.RETRY_LATER) && !retryable) {
129
+ throw new TypeError(`${remediation.action} remediation requires retryable=true`);
130
+ }
131
+ if (severity === ERROR_SEVERITY.BLOCKING_INTERNAL && USER_ACTIONS.has(remediation.action)) {
132
+ throw new TypeError(`blocking_internal errors cannot prescribe user remediation action ${remediation.action}`);
133
+ }
134
+ const source = normalizeSource(input.source);
135
+ const native = sanitizeNativeEvidence(input.native);
136
+ const environment = normalizeEnvironment(input.environment);
137
+ const envelope = {
138
+ ok: false,
139
+ schema_version: ERROR_SCHEMA_VERSION,
140
+ code,
141
+ reason,
142
+ severity,
143
+ source,
144
+ resolution_owner: resolutionOwner,
145
+ domain,
146
+ tool: optional(input.tool, 256),
147
+ stage: optional(input.stage, 256),
148
+ message: redactString(input.message || 'Operation failed', 4_000),
149
+ retryable,
150
+ retry_after_ms: input.retry_after_ms == null ? null : Math.max(0, Math.round(Number(input.retry_after_ms) || 0)),
151
+ remediation,
152
+ resource: normalizeResource(input.resource),
153
+ native,
154
+ environment,
155
+ http_status: input.http_status == null ? defaultHttpStatusForCode(code) : Number(input.http_status),
156
+ grpc_status: input.grpc_status == null ? grpcStatusForCode(code) : Number(input.grpc_status),
157
+ transport: optional(input.transport, 256),
158
+ provider: optional(input.provider, 256),
159
+ provider_code: optional(input.provider_code, 512),
160
+ request_id: optional(input.request_id, 512),
161
+ trace_id: optional(input.trace_id, 512),
162
+ fingerprint: '',
163
+ occurrence_count: Number.isInteger(input.occurrence_count) && input.occurrence_count > 0 ? input.occurrence_count : 1,
164
+ details: input.details == null ? null : redactErrorValue(input.details),
165
+ };
166
+ if (!Number.isInteger(envelope.http_status) || envelope.http_status < 100 || envelope.http_status > 599) envelope.http_status = null;
167
+ if (!Number.isInteger(envelope.grpc_status) || envelope.grpc_status < 0 || envelope.grpc_status > 16) envelope.grpc_status = null;
168
+ envelope.fingerprint = optional(input.fingerprint, 128) || fingerprintError(envelope);
169
+
170
+ // Optional recovery dimensions (v1-compatible extras — orthogonal to reason enum)
171
+ const failureClass = input.failure_class || null;
172
+ if (failureClass) envelope.failure_class = clean(failureClass);
173
+ if (input.operation && typeof input.operation === 'object') {
174
+ envelope.operation = Object.freeze({
175
+ kind: optional(input.operation.kind, 256),
176
+ action: optional(input.operation.action, 256),
177
+ resource_type: optional(input.operation.resource_type, 128),
178
+ resource_id: optional(input.operation.resource_id, 512),
179
+ read_only: input.operation.read_only === true,
180
+ idempotent: input.operation.idempotent === true,
181
+ side_effect_state: optional(input.operation.side_effect_state, 64) || 'unknown',
182
+ });
183
+ }
184
+ if (input.retry && typeof input.retry === 'object') {
185
+ envelope.retry = Object.freeze({
186
+ allowed: input.retry.allowed == null ? retryable : Boolean(input.retry.allowed),
187
+ strategy: optional(input.retry.strategy, 64) || (retryable ? 'exponential_backoff' : 'none'),
188
+ retry_after_ms: input.retry.retry_after_ms == null ? envelope.retry_after_ms : Math.max(0, Math.round(Number(input.retry.retry_after_ms) || 0)),
189
+ max_attempts: Number.isInteger(input.retry.max_attempts) ? input.retry.max_attempts : null,
190
+ requires_idempotency_key: input.retry.requires_idempotency_key === true,
191
+ });
192
+ }
193
+ if (input.fallback && typeof input.fallback === 'object') {
194
+ envelope.fallback = Object.freeze({
195
+ allowed: Boolean(input.fallback.allowed),
196
+ strategy: optional(input.fallback.strategy, 64),
197
+ preserve_semantics: input.fallback.preserve_semantics !== false,
198
+ target: optional(input.fallback.target, 256),
199
+ });
200
+ }
201
+ if (input.notify && typeof input.notify === 'object') {
202
+ envelope.notify = Object.freeze({
203
+ user: optional(input.notify.user, 64) || 'immediately',
204
+ operator: optional(input.notify.operator, 64) || 'never',
205
+ agent: optional(input.notify.agent, 64) || 'stop',
206
+ });
207
+ }
208
+ if (input.cause && typeof input.cause === 'object') {
209
+ envelope.cause = input.cause;
210
+ }
211
+ if (input.status === 'partial' || input.status === 'success' || input.status === 'failure') {
212
+ envelope.status = input.status;
213
+ }
214
+ if (input.completed != null || input.failed != null) {
215
+ envelope.partial = Object.freeze({
216
+ completed: Number(input.completed) || 0,
217
+ failed: Number(input.failed) || 0,
218
+ failures: Array.isArray(input.failures) ? input.failures : [],
219
+ });
220
+ }
221
+
222
+ return deepFreeze(envelope);
223
+ }
224
+
225
+ export function isErrorEnvelope(value) {
226
+ return Boolean(value && typeof value === 'object' && value.ok === false && value.schema_version === ERROR_SCHEMA_VERSION && CODE_VALUES.has(value.code) && typeof value.reason === 'string');
227
+ }
228
+
229
+ export function assertErrorEnvelope(value) {
230
+ if (!isErrorEnvelope(value)) throw new TypeError('Expected an AgentSam ErrorEnvelope');
231
+ return createErrorEnvelope(value);
232
+ }
233
+
234
+ export function serializeError(value) { return JSON.stringify(assertErrorEnvelope(value)); }
235
+ export function parseError(value) {
236
+ const parsed = typeof value === 'string' ? JSON.parse(value) : value;
237
+ if (parsed?.schema_version !== ERROR_SCHEMA_VERSION) throw new TypeError(`Unsupported AgentSam error schema version: ${parsed?.schema_version ?? 'missing'}`);
238
+ return createErrorEnvelope(parsed);
239
+ }
@@ -0,0 +1,24 @@
1
+ import { createErrorEnvelope, isErrorEnvelope } from './envelope.js';
2
+
3
+ export class AgentSamError extends Error {
4
+ constructor(envelope, options = {}) {
5
+ const normalized = isErrorEnvelope(envelope) ? envelope : createErrorEnvelope(envelope);
6
+ super(normalized.message, options.cause ? { cause: options.cause } : undefined);
7
+ this.name = 'AgentSamError';
8
+ this.envelope = normalized;
9
+ // Compatibility alias for pre-v1 callers. It points at the canonical
10
+ // envelope; it is not a second diagnostic vocabulary.
11
+ this.diagnostic = normalized;
12
+ this.code = normalized.code;
13
+ this.reason = normalized.reason;
14
+ this.severity = normalized.severity;
15
+ this.retryable = normalized.retryable;
16
+ this.status = normalized.http_status;
17
+ this.fingerprint = normalized.fingerprint;
18
+ }
19
+ }
20
+
21
+ export function asAgentSamError(value, options = {}) {
22
+ if (value instanceof AgentSamError) return value;
23
+ return new AgentSamError(value, options);
24
+ }
@@ -0,0 +1,35 @@
1
+ function clean(value) { return value == null ? '' : String(value).trim(); }
2
+
3
+ function stableFields(value = {}) {
4
+ return [
5
+ value.code,
6
+ value.reason,
7
+ value.severity,
8
+ value.source?.kind,
9
+ value.source?.name,
10
+ value.source?.service,
11
+ value.resolution_owner,
12
+ value.domain,
13
+ value.tool,
14
+ value.stage,
15
+ value.provider,
16
+ value.provider_code,
17
+ value.native?.code,
18
+ value.native?.exception_type,
19
+ value.environment?.component,
20
+ value.environment?.runtime,
21
+ ].map(clean).join('\u001f');
22
+ }
23
+
24
+ // FNV-1a 64-bit: deterministic, dependency-free, Worker/Node safe. This is an
25
+ // operational grouping key, not a cryptographic integrity primitive.
26
+ export function fingerprintError(value = {}) {
27
+ const text = stableFields(value);
28
+ let hash = 0xcbf29ce484222325n;
29
+ const prime = 0x100000001b3n;
30
+ for (let i = 0; i < text.length; i += 1) {
31
+ hash ^= BigInt(text.charCodeAt(i));
32
+ hash = BigInt.asUintN(64, hash * prime);
33
+ }
34
+ return `err_${hash.toString(16).padStart(16, '0')}`;
35
+ }