@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.8

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 (400) hide show
  1. package/AGENTSAM.md +29 -0
  2. package/README.md +37 -0
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +12 -7
  7. package/apps/client-cms-editor/README.md +76 -48
  8. package/apps/client-cms-editor/agentsam.app.json +26 -9
  9. package/apps/client-cms-editor/backend/package.json +20 -3
  10. package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
  11. package/apps/client-cms-editor/backend/src/index.ts +1 -1
  12. package/apps/client-cms-editor/backend/src/model.ts +11 -115
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
  14. package/apps/client-cms-editor/backend/tsconfig.json +6 -1
  15. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  16. package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
  17. package/apps/client-cms-editor/frontend/package.json +16 -7
  18. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
  19. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
  20. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  21. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  22. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  23. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  24. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  25. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  26. package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
  27. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +19 -5
  29. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
  35. package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
  36. package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
  37. package/apps/client-cms-editor/package-lock.json +973 -134
  38. package/apps/client-cms-editor/package.json +118 -6
  39. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  40. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  41. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  42. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  43. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  44. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  45. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  46. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  47. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  48. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  49. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  50. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  51. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  52. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  53. package/apps/client-cms-editor/shared/cms/package.json +17 -7
  54. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  55. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
  56. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
  57. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  58. package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
  59. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  60. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  61. package/contracts/source-types.v1.json +353 -0
  62. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  63. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  64. package/docs/REPO_FILE_MAP.txt +132 -0
  65. package/docs/THEME_REFINERY.md +2 -2
  66. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
  68. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  69. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  70. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  71. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  72. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  73. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  74. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  75. package/native/agentsam-machine/Cargo.lock +426 -0
  76. package/native/agentsam-machine/Cargo.toml +9 -0
  77. package/native/agentsam-machine/cli/Cargo.toml +21 -0
  78. package/native/agentsam-machine/cli/README.md +21 -0
  79. package/native/agentsam-machine/cli/src/main.rs +77 -0
  80. package/native/agentsam-machine/core/Cargo.toml +22 -0
  81. package/native/agentsam-machine/core/README.md +14 -0
  82. package/native/agentsam-machine/core/build.rs +33 -0
  83. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  84. package/native/agentsam-machine/core/src/assets.rs +790 -0
  85. package/native/agentsam-machine/core/src/bound.rs +298 -0
  86. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  87. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  88. package/native/agentsam-machine/core/src/lib.rs +1092 -0
  89. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  90. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  91. package/package.json +64 -24
  92. package/packages/agentsam-brand/README.md +1 -1
  93. package/packages/agentsam-brand/package.json +4 -4
  94. package/packages/agentsam-brand/src/index.js +1 -1
  95. package/packages/agentsam-contracts/package.json +13 -3
  96. package/packages/agentsam-contracts/src/tools.ts +22 -0
  97. package/packages/agentsam-errors/package.json +13 -3
  98. package/packages/agentsam-errors/src/index.js +1 -0
  99. package/packages/agentsam-errors/src/tool.js +56 -0
  100. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  101. package/packages/agentsam-goap/README.md +52 -0
  102. package/packages/agentsam-goap/package.json +37 -0
  103. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  104. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  105. package/packages/agentsam-goap/src/contracts.js +226 -0
  106. package/packages/agentsam-goap/src/control-plane.js +112 -0
  107. package/packages/agentsam-goap/src/errors.js +157 -0
  108. package/packages/agentsam-goap/src/index.js +5 -0
  109. package/packages/agentsam-goap/src/world.js +202 -0
  110. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  111. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  112. package/packages/agentsam-knowledge/package.json +18 -4
  113. package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
  114. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  115. package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
  116. package/packages/agentsam-nav/dist/browser.global.js +21 -18
  117. package/packages/agentsam-nav/dist/browser.js +6807 -130
  118. package/packages/agentsam-nav/dist/index.js +6799 -122
  119. package/packages/agentsam-nav/package.json +24 -6
  120. package/packages/agentsam-queue-control/README.md +1 -1
  121. package/packages/agentsam-queue-control/package.json +7 -2
  122. package/packages/agentsam-rapid-rust/src/main.rs +1 -1
  123. package/packages/agentsam-repository/package.json +13 -3
  124. package/packages/agentsam-repository/src/goap.js +13 -14
  125. package/packages/agentsam-repository/src/source-types.js +8 -0
  126. package/packages/agentsam-repository/src/tickets.js +15 -22
  127. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  128. package/packages/agentsam-vault/package.json +14 -4
  129. package/packages/agentsam-workbench/package.json +15 -4
  130. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  131. package/packages/agentsam-workbench/src/agent/index.ts +2 -0
  132. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  133. package/packages/connectors/cloudflare/package.json +15 -3
  134. package/packages/connectors/cloudflare/src/api-client.js +3 -2
  135. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  136. package/packages/connectors/cloudflare/src/index.js +1 -0
  137. package/packages/heuristic-theme/README.md +2 -2
  138. package/packages/heuristic-theme/package.json +8 -3
  139. package/packages/heuristic-theme/src/registry.js +2 -2
  140. package/packages/heuristic-theme/src/theme.js +1 -1
  141. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  142. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  143. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
  144. package/packages/identity/README.md +2 -2
  145. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
  146. package/packages/identity/migrations/apply-portable.js +109 -0
  147. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
  148. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  149. package/packages/identity/package.json +27 -6
  150. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  151. package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
  152. package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
  153. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
  154. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  155. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  156. package/packages/identity/src/adapters/portable-store.js +479 -0
  157. package/packages/identity/src/adapters/sqlite/index.js +13 -312
  158. package/packages/identity/src/contracts/auth-config.js +0 -1
  159. package/packages/identity/src/contracts/identity-store.js +56 -5
  160. package/packages/identity/src/contracts/provider.js +1 -0
  161. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  162. package/packages/identity/src/core/constants.js +1 -1
  163. package/packages/identity/src/core/session-policy.js +31 -0
  164. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
  165. package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
  166. package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -5
  167. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  168. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +6 -37
  169. package/packages/identity/src/index.js +28 -1
  170. package/packages/identity/src/migrations/README.md +23 -23
  171. package/packages/identity/src/oauth/README.md +1 -1
  172. package/packages/identity/src/oauth/credentials.js +10 -11
  173. package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
  174. package/packages/identity/src/oauth/iam-platform.js +21 -9
  175. package/packages/identity/src/oauth/native-handoff.js +136 -0
  176. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  177. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  178. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  179. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  180. package/packages/identity/src/providers/github/oauth.js +1 -2
  181. package/packages/identity/src/providers/github/profile.js +16 -2
  182. package/packages/identity/src/providers/index.js +11 -3
  183. package/packages/identity/src/server/identity-service.js +2 -1
  184. package/packages/identity/src/server/worker-router.js +71 -18
  185. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  186. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  187. package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
  188. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  189. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  190. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  191. package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
  192. package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
  193. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  194. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  195. package/packages/providers/completeful/package.json +7 -2
  196. package/packages/theme-church-site/package.json +17 -6
  197. package/packages/theme-church-site/src/harvest.json +4 -2
  198. package/packages/theme-church-site/src/index.js +7 -3
  199. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  200. package/packages/theme-companions-site/package.json +17 -6
  201. package/packages/theme-companions-site/src/harvest.json +4 -2
  202. package/packages/theme-companions-site/src/index.js +7 -3
  203. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  204. package/packages/theme-floors-site/package.json +17 -6
  205. package/packages/theme-floors-site/src/harvest.json +4 -2
  206. package/packages/theme-floors-site/src/index.js +7 -3
  207. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  208. package/packages/theme-fuelnfree-site/package.json +17 -6
  209. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  210. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  211. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  212. package/packages/theme-handyman-site/package.json +17 -6
  213. package/packages/theme-handyman-site/src/harvest.json +4 -2
  214. package/packages/theme-handyman-site/src/index.js +7 -3
  215. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  216. package/packages/theme-insurance-site/package.json +17 -6
  217. package/packages/theme-insurance-site/src/harvest.json +4 -2
  218. package/packages/theme-insurance-site/src/index.js +7 -3
  219. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  220. package/packages/theme-scenes/README.md +1 -1
  221. package/packages/theme-scenes/package.json +4 -3
  222. package/packages/theme-scenes/src/registry.js +187 -0
  223. package/packages/theme-shinshu-site/package.json +17 -6
  224. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  225. package/packages/theme-shinshu-site/src/index.js +7 -3
  226. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  227. package/packages/work-graph/package.json +14 -4
  228. package/protocol/FILEMETA_V1.md +2 -2
  229. package/protocol/capabilities/manifest.json +1 -1
  230. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  231. package/protocol/presets/catalog.json +2 -2
  232. package/protocol/theme-refinery/lineage-registry.json +105 -0
  233. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  234. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  235. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  236. package/python/tests/test_repository_intelligence.py +30 -0
  237. package/src/cli/command-catalog.js +48 -5
  238. package/src/cli/dispatch.js +1 -0
  239. package/src/cli.js +20 -1
  240. package/src/cloudflare/runtime-status.js +2 -1
  241. package/src/commands/autorag.js +67 -13
  242. package/src/commands/cheat-sheet.js +29 -4
  243. package/src/commands/codebaseindex.js +45 -2
  244. package/src/commands/goap-world.js +134 -0
  245. package/src/commands/goap.js +11 -4
  246. package/src/commands/knowledge.js +59 -2
  247. package/src/commands/machine-binary.js +109 -0
  248. package/src/commands/machine-runtime.js +266 -0
  249. package/src/commands/machine.js +208 -0
  250. package/src/commands/package.js +530 -0
  251. package/src/commands/plan-ledger.js +370 -0
  252. package/src/commands/plan.js +183 -0
  253. package/src/commands/security.js +67 -4
  254. package/src/commands/setup.js +33 -16
  255. package/src/commands/skill.js +78 -17
  256. package/src/commands/status.js +8 -1
  257. package/src/features/resolve.js +1 -0
  258. package/src/knowledge/engine.js +21 -2
  259. package/src/knowledge/runtime-discovery.js +127 -0
  260. package/src/knowledge/source.js +1 -1
  261. package/src/lib/identity-scaffold.js +53 -13
  262. package/src/lib/setup/recipes.js +1 -1
  263. package/src/lib/slash-commands.js +1 -1
  264. package/src/local/runtime-store.js +24 -2
  265. package/src/local/sqlite.js +17 -0
  266. package/src/models/discovery.js +40 -22
  267. package/src/models/inventory-core.d.ts +105 -0
  268. package/src/models/inventory-core.js +54 -6
  269. package/src/sam/operations/package-audit.js +41 -0
  270. package/src/sam/seed.js +2 -0
  271. package/src/security/logs.js +3 -0
  272. package/src/ui/cli/help.js +41 -0
  273. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
  274. package/test/account-session.test.mjs +0 -101
  275. package/test/agent-capabilities.test.mjs +0 -67
  276. package/test/app-authority-context.test.mjs +0 -32
  277. package/test/app-building-skills.test.mjs +0 -61
  278. package/test/apps-scaffold-contract.test.mjs +0 -114
  279. package/test/blender-cad.test.mjs +0 -146
  280. package/test/cad-docker.test.mjs +0 -96
  281. package/test/capabilities.test.mjs +0 -133
  282. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  283. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  284. package/test/cli/eval-live.test.mjs +0 -219
  285. package/test/cli/go.test.mjs +0 -128
  286. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  287. package/test/cli/mcp-client.test.mjs +0 -256
  288. package/test/cli/preferences-runtime.test.mjs +0 -11
  289. package/test/cli/runtime-persist.test.mjs +0 -56
  290. package/test/cli/runtime-ui.test.mjs +0 -141
  291. package/test/cli/rust-command.test.mjs +0 -21
  292. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  293. package/test/cli/status-actions.test.mjs +0 -88
  294. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  295. package/test/cli-preferences.test.mjs +0 -46
  296. package/test/cloudflare-connector.test.mjs +0 -93
  297. package/test/cloudflare-runtime.test.mjs +0 -82
  298. package/test/context.test.mjs +0 -159
  299. package/test/credentials-audit.test.mjs +0 -113
  300. package/test/deploy-health-scan.test.mjs +0 -95
  301. package/test/deploy-receipt.test.mjs +0 -91
  302. package/test/dockerize.test.mjs +0 -93
  303. package/test/error-diagnostics.test.mjs +0 -124
  304. package/test/eval-context.test.mjs +0 -37
  305. package/test/execution-approvals.test.mjs +0 -27
  306. package/test/fixtures/cad/courtyard-house.json +0 -208
  307. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  308. package/test/gcloud-auth.test.mjs +0 -111
  309. package/test/go/build-source-identity.test.mjs +0 -31
  310. package/test/go/cloudflare-probe.test.mjs +0 -317
  311. package/test/go/distribution.test.mjs +0 -28
  312. package/test/google-cloud-connection.test.mjs +0 -83
  313. package/test/google-cloud-inventory.test.mjs +0 -64
  314. package/test/indexing-provider.test.mjs +0 -29
  315. package/test/init-options.test.mjs +0 -35
  316. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  317. package/test/integration/app-command.test.mjs +0 -85
  318. package/test/integration/cad-discovery.test.mjs +0 -158
  319. package/test/integration/cad-docker-executor.test.mjs +0 -249
  320. package/test/integration/cad-execution.test.mjs +0 -184
  321. package/test/integration/cad-project-app.test.mjs +0 -31
  322. package/test/integration/cad-project-d1.test.mjs +0 -25
  323. package/test/integration/cad-project-native.test.mjs +0 -24
  324. package/test/integration/cad-project-workflow.test.mjs +0 -9
  325. package/test/integration/cad-project.test.mjs +0 -85
  326. package/test/integration/cli-help.test.mjs +0 -41
  327. package/test/integration/cms-app-scaffold.test.mjs +0 -71
  328. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -257
  329. package/test/integration/codebaseindex-ingest.test.mjs +0 -214
  330. package/test/integration/core-client.integration.test.mjs +0 -55
  331. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  332. package/test/integration/features-resolve.test.mjs +0 -147
  333. package/test/integration/icon-registry.test.mjs +0 -67
  334. package/test/integration/ingest-discover-models.test.mjs +0 -30
  335. package/test/integration/inspect-path-cli.test.mjs +0 -46
  336. package/test/integration/install-script.test.mjs +0 -110
  337. package/test/integration/inventory-core.test.mjs +0 -53
  338. package/test/integration/inventory-evidence.test.mjs +0 -125
  339. package/test/integration/knowledge-rpc.test.mjs +0 -112
  340. package/test/integration/local-fs.test.mjs +0 -113
  341. package/test/integration/merkle-cli.test.mjs +0 -61
  342. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  343. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  344. package/test/integration/provider-env-cli.test.mjs +0 -50
  345. package/test/integration/provider-factory.test.mjs +0 -197
  346. package/test/integration/repository-company-graph.test.mjs +0 -90
  347. package/test/integration/runtime-migrations.test.mjs +0 -87
  348. package/test/integration/runtime-status.integration.test.mjs +0 -212
  349. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  350. package/test/integration/sam-decision.test.mjs +0 -584
  351. package/test/integration/sam-kernel.test.mjs +0 -99
  352. package/test/integration/sam-planning-astar.test.mjs +0 -279
  353. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  354. package/test/integration/skill-runtime.test.mjs +0 -240
  355. package/test/integration/storage-architecture.test.mjs +0 -154
  356. package/test/integration/store-discovery.test.mjs +0 -44
  357. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  358. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  359. package/test/integration/tool-runtime.test.mjs +0 -124
  360. package/test/integration/tool-schema.test.mjs +0 -59
  361. package/test/jr-dev-skill.test.mjs +0 -26
  362. package/test/knowledge-context-pack.test.mjs +0 -19
  363. package/test/knowledge-postgres.test.mjs +0 -40
  364. package/test/knowledge-service.test.mjs +0 -110
  365. package/test/knowledge.test.mjs +0 -206
  366. package/test/live/terminal-transport.live.test.mjs +0 -24
  367. package/test/local-sessions.test.mjs +0 -57
  368. package/test/local-studio-deploy.test.mjs +0 -83
  369. package/test/loopback-oauth.test.mjs +0 -53
  370. package/test/merkle-render.test.mjs +0 -31
  371. package/test/mini.test.mjs +0 -140
  372. package/test/model-catalog.test.mjs +0 -70
  373. package/test/models.test.mjs +0 -309
  374. package/test/npm10-lock.test.mjs +0 -29
  375. package/test/ollama.test.mjs +0 -137
  376. package/test/open-url.test.mjs +0 -64
  377. package/test/openai-responses.test.mjs +0 -155
  378. package/test/portable-context.test.mjs +0 -94
  379. package/test/project-config.test.mjs +0 -81
  380. package/test/project-rules.test.mjs +0 -44
  381. package/test/provider-credentials.test.mjs +0 -106
  382. package/test/rehydrate.test.mjs +0 -25
  383. package/test/release-hygiene.test.mjs +0 -42
  384. package/test/repository-snapshot-view.test.mjs +0 -112
  385. package/test/responses-runner.test.mjs +0 -465
  386. package/test/runtime-activity.test.mjs +0 -98
  387. package/test/sdk-worker-contract.test.mjs +0 -72
  388. package/test/security.test.mjs +0 -252
  389. package/test/setup-planner.test.mjs +0 -74
  390. package/test/setup-runtime.test.mjs +0 -51
  391. package/test/shell.test.mjs +0 -281
  392. package/test/skills.test.mjs +0 -22
  393. package/test/smoke.mjs +0 -122
  394. package/test/telemetry.test.mjs +0 -79
  395. package/test/terminal/local-pty.mock.test.mjs +0 -153
  396. package/test/terminal-machine-identity.test.mjs +0 -88
  397. package/test/theme-portability.test.mjs +0 -14
  398. package/test/tools-search.test.mjs +0 -73
  399. package/test/unit/website-assets-bindings.test.mjs +0 -60
  400. package/test/whoami-resume.test.mjs +0 -157
@@ -90,6 +90,23 @@ export async function createLocalSqliteDatabase(filePath = '.agentsam/data/agent
90
90
  },
91
91
  };
92
92
  },
93
+ async batch(statements = []) {
94
+ database.exec('BEGIN IMMEDIATE');
95
+ try {
96
+ const results = [];
97
+ for (const statement of statements) {
98
+ if (!statement || typeof statement.run !== 'function') {
99
+ throw new TypeError('Local SQLite batch entries must expose run()');
100
+ }
101
+ results.push(await statement.run());
102
+ }
103
+ database.exec('COMMIT');
104
+ return results;
105
+ } catch (error) {
106
+ try { database.exec('ROLLBACK'); } catch {}
107
+ throw error;
108
+ }
109
+ },
93
110
  exec(sql) {
94
111
  database.exec(sql);
95
112
  },
@@ -100,15 +100,9 @@ function baseRecord(provider, id, values = {}) {
100
100
 
101
101
  function openAIModelCapabilities(id) {
102
102
  const fallback = fallbackRecord('openai', id);
103
- if (fallback?.capabilities) return {};
104
- if (/^text-embedding-/i.test(id)) return { agent_runtime: false, embeddings: true };
105
- if (/^(?:gpt-image|chatgpt-image|gpt-audio|gpt-realtime|sora|tts|whisper|omni-moderation)/i.test(id)) {
106
- return { agent_runtime: false };
107
- }
108
- if (/^(?:gpt-(?:4o|4\.1|5|6)|o[1-9])/i.test(id)) {
109
- return { agent_runtime: true, responses: true };
110
- }
111
- return { agent_runtime: false };
103
+ // /v1/models proves credential-scoped availability but does not expose
104
+ // per-model modality / Responses compatibility. Never guess from names.
105
+ return fallback?.capabilities ? {} : {};
112
106
  }
113
107
 
114
108
  async function fetchJson(fetchImpl, url, init) {
@@ -157,8 +151,8 @@ export async function discoverAnthropicModels(apiKey, fetchImpl = fetch) {
157
151
  return baseRecord('anthropic', id, {
158
152
  label: clean(row?.display_name) || id,
159
153
  source_url: 'https://api.anthropic.com/v1/models',
160
- capabilities: { messages: true, function_calling: true, prompt_caching: true },
161
- metadata: { created_at: row?.created_at || null, type: row?.type || null },
154
+ capabilities: { messages: true },
155
+ metadata: { created_at: row?.created_at || null, type: row?.type || null, capability_source: 'provider_endpoint_contract' },
162
156
  });
163
157
  })
164
158
  .filter(Boolean);
@@ -179,6 +173,8 @@ export async function discoverGeminiModels(apiKey, fetchImpl = fetch) {
179
173
  .map((row) => {
180
174
  const id = clean(row?.baseModelId || row?.name).replace(/^models\//, '');
181
175
  if (!id) return null;
176
+ const providerDescription = clean(row?.description);
177
+ const specializedOutput = /(?:text[- ]to[- ]speech|\btts\b|image generation|generate images?|transcription|transcribe|audio generation)/i.test(providerDescription);
182
178
  return baseRecord('gemini', id, {
183
179
  label: clean(row?.displayName) || id,
184
180
  context_window: positiveInt(row?.inputTokenLimit),
@@ -187,12 +183,15 @@ export async function discoverGeminiModels(apiKey, fetchImpl = fetch) {
187
183
  source_url: 'https://generativelanguage.googleapis.com/v1beta/models',
188
184
  capabilities: {
189
185
  generate_content: true,
190
- function_calling: true,
186
+ text_output: !specializedOutput,
191
187
  thinking: row?.thinking === true,
192
188
  },
193
189
  metadata: {
194
190
  version: row?.version || null,
191
+ description: providerDescription || null,
195
192
  supported_generation_methods: row?.supportedGenerationMethods || [],
193
+ capability_source: 'provider_api',
194
+ specialized_output: specializedOutput,
196
195
  },
197
196
  });
198
197
  })
@@ -238,22 +237,39 @@ function xaiPricing(row) {
238
237
  export async function discoverXaiModels(apiKey, fetchImpl = fetch) {
239
238
  if (!clean(apiKey)) return failure('credential unavailable', false);
240
239
  try {
241
- const body = await fetchJson(fetchImpl, 'https://api.x.ai/v1/models', {
242
- headers: { authorization: `Bearer ${clean(apiKey)}` },
243
- });
240
+ const auth = { authorization: 'Bearer ' + clean(apiKey) };
241
+ const body = await fetchJson(fetchImpl, 'https://api.x.ai/v1/models', { headers: auth });
242
+ let languageRows = [];
243
+ try {
244
+ const languageBody = await fetchJson(fetchImpl, 'https://api.x.ai/v1/language-models', { headers: auth });
245
+ languageRows = Array.isArray(languageBody?.models) ? languageBody.models : [];
246
+ } catch {
247
+ // Keep full availability even if capability discovery is temporarily unavailable.
248
+ }
249
+ const languageById = new Map(languageRows.map((row) => [clean(row?.id), row]).filter(([id]) => id));
244
250
  const models = (Array.isArray(body?.data) ? body.data : [])
245
251
  .map((row) => {
246
252
  const id = clean(row?.id);
247
- if (!id || /image|video|voice|embedding/i.test(id)) return null;
248
- return baseRecord('grok', id, {
249
- context_window: positiveInt(row?.context_length),
253
+ if (!id) return null;
254
+ const language = languageById.get(id) || null;
255
+ const outputModalities = Array.isArray(language?.output_modalities)
256
+ ? language.output_modalities.map(clean).filter(Boolean)
257
+ : [];
258
+ return baseRecord('xai', id, {
259
+ context_window: positiveInt(language?.context_length ?? row?.context_length),
250
260
  pricing: xaiPricing(row),
251
261
  source_url: 'https://api.x.ai/v1/models',
252
- capabilities: { responses: true, function_calling: true, prompt_caching: true },
262
+ capabilities: {
263
+ responses: Boolean(language),
264
+ text_output: Boolean(language) && outputModalities.includes('text'),
265
+ },
253
266
  metadata: {
254
- aliases: row?.aliases || [],
255
- created: row?.created || null,
256
- owned_by: row?.owned_by || null,
267
+ aliases: row?.aliases || language?.aliases || [],
268
+ created: row?.created || language?.created || null,
269
+ owned_by: row?.owned_by || language?.owned_by || null,
270
+ input_modalities: Array.isArray(language?.input_modalities) ? language.input_modalities : [],
271
+ output_modalities: outputModalities,
272
+ capability_source: language ? 'provider_api_language_models' : 'provider_api_models_only',
257
273
  },
258
274
  });
259
275
  })
@@ -288,6 +304,7 @@ export async function discoverCursorModels(apiKey, fetchImpl = fetch) {
288
304
  aliases: Array.isArray(row?.aliases) ? row.aliases : [],
289
305
  parameters: params,
290
306
  variants: Array.isArray(row?.variants) ? row.variants : [],
307
+ capability_source: 'provider_api',
291
308
  },
292
309
  });
293
310
  })
@@ -332,6 +349,7 @@ export async function discoverCloudflareModels(apiToken, accountId, fetchImpl =
332
349
  task,
333
350
  author: clean(row?.author) || null,
334
351
  description: clean(row?.description) || null,
352
+ capability_source: 'provider_api_task',
335
353
  },
336
354
  });
337
355
  })
@@ -0,0 +1,105 @@
1
+ export type CredentialPlane = "machine" | "studio_vault" | "mixed" | "platform" | string;
2
+
3
+ export interface ProviderCredentialResolution {
4
+ configured: boolean;
5
+ value?: string;
6
+ source?: string | null;
7
+ error?: string | null;
8
+ account_id?: string | null;
9
+ }
10
+
11
+ export interface DiscoveredModelRecord {
12
+ provider: string;
13
+ provider_model_id: string;
14
+ model_id?: string;
15
+ model_key: string;
16
+ label: string;
17
+ availability: string;
18
+ availability_source?: string | null;
19
+ context_window?: number | null;
20
+ max_output_tokens?: number | null;
21
+ reasoning_efforts?: string[];
22
+ service_tiers?: string[];
23
+ capabilities?: Record<string, unknown>;
24
+ metadata?: Record<string, unknown>;
25
+ source?: Record<string, unknown>;
26
+ }
27
+
28
+ export interface CredentialScopedInventory {
29
+ schemaVersion: string;
30
+ generatedAt: string;
31
+ authority: string;
32
+ credential_plane: CredentialPlane;
33
+ providers: Array<{
34
+ id: string;
35
+ label: string;
36
+ configured: boolean;
37
+ source: string | null;
38
+ credentialError: string | null;
39
+ }>;
40
+ discovery: Record<string, {
41
+ attempted: boolean;
42
+ ok: boolean;
43
+ error: string | null;
44
+ returnedModelCount: number;
45
+ curation?: string;
46
+ }>;
47
+ providerModels: Record<string, DiscoveredModelRecord[]>;
48
+ availableModels: DiscoveredModelRecord[];
49
+ }
50
+
51
+ export const INVENTORY_API_PROVIDERS: readonly Readonly<{
52
+ id: string;
53
+ label: string;
54
+ service: string;
55
+ env: string;
56
+ aliases?: readonly string[];
57
+ }>[];
58
+
59
+ export const WORKERS_AI_CURATED_MODEL_IDS: readonly string[];
60
+
61
+ export function providerIdForService(serviceName: unknown): string | null;
62
+ export function filterWorkersAiCurated(models?: DiscoveredModelRecord[], options?: { curated?: boolean }): DiscoveredModelRecord[];
63
+ export function makeMapCredentialResolver(
64
+ credentialByProvider: Map<string, { value: string; source?: string; account_id?: string }>,
65
+ ): (providerId: string) => Promise<ProviderCredentialResolution>;
66
+ export function collectCredentialScopedInventory(options: {
67
+ fetchImpl?: typeof fetch;
68
+ credentialPlane?: CredentialPlane;
69
+ curateWorkersAi?: boolean;
70
+ discoverRemote?: boolean;
71
+ resolveCredential: (providerId: string) => ProviderCredentialResolution | Promise<ProviderCredentialResolution>;
72
+ }): Promise<CredentialScopedInventory>;
73
+ export function sanitizeInventoryForClient(status?: Partial<CredentialScopedInventory>): {
74
+ schemaVersion?: string;
75
+ generatedAt?: string;
76
+ authority?: string;
77
+ credential_plane?: CredentialPlane;
78
+ providers: CredentialScopedInventory["providers"];
79
+ discovery: CredentialScopedInventory["discovery"];
80
+ availableModels: Array<{
81
+ provider: string;
82
+ model_id: string;
83
+ model_key: string | null;
84
+ label: string;
85
+ availability: string;
86
+ availability_source: string | null;
87
+ context_window: number | null;
88
+ reasoning_efforts: string[];
89
+ service_tiers: string[];
90
+ capabilities: Record<string, unknown>;
91
+ chat_eligible: boolean;
92
+ eligibility_reason: string | null;
93
+ eligibility_source: string;
94
+ }>;
95
+ };
96
+ export function modelChatEligibility(row?: DiscoveredModelRecord): {
97
+ chat_eligible: boolean;
98
+ eligibility_reason: string | null;
99
+ eligibility_source: string;
100
+ };
101
+ export function assertModelAvailableForProvider(
102
+ inventory: { availableModels?: Array<Record<string, unknown>> },
103
+ provider: string,
104
+ modelId: string,
105
+ ): Record<string, unknown>;
@@ -7,7 +7,7 @@ export const INVENTORY_API_PROVIDERS = Object.freeze([
7
7
  { id: 'openai', label: 'OpenAI', service: 'openai', env: 'OPENAI_API_KEY' },
8
8
  { id: 'anthropic', label: 'Anthropic', service: 'anthropic', env: 'ANTHROPIC_API_KEY' },
9
9
  { id: 'gemini', label: 'Gemini', service: 'gemini', env: 'GEMINI_API_KEY' },
10
- { id: 'grok', label: 'Grok / xAI', service: 'xai', env: 'XAI_API_KEY', aliases: ['xai', 'grok'] },
10
+ { id: 'xai', label: 'Grok / xAI', service: 'xai', env: 'XAI_API_KEY', aliases: ['grok'] },
11
11
  { id: 'cursor', label: 'Cursor', service: 'cursor', env: 'CURSOR_API_KEY' },
12
12
  { id: 'cloudflare', label: 'Cloudflare', service: 'cloudflare', env: 'CLOUDFLARE_API_TOKEN' },
13
13
  ]);
@@ -29,8 +29,8 @@ const SERVICE_TO_PROVIDER = Object.freeze({
29
29
  openai: 'openai',
30
30
  anthropic: 'anthropic',
31
31
  gemini: 'gemini',
32
- xai: 'grok',
33
- grok: 'grok',
32
+ xai: 'xai',
33
+ grok: 'xai',
34
34
  cursor: 'cursor',
35
35
  cloudflare: 'cloudflare',
36
36
  });
@@ -70,6 +70,41 @@ export function makeMapCredentialResolver(credentialByProvider) {
70
70
  };
71
71
  }
72
72
 
73
+ const CHAT_ADAPTER_PROVIDERS = new Set(['openai', 'anthropic', 'gemini', 'xai', 'cloudflare']);
74
+
75
+ export function modelChatEligibility(row = {}) {
76
+ const rawProvider = String(row.provider || '').trim().toLowerCase();
77
+ const provider = rawProvider === 'grok' ? 'xai' : rawProvider;
78
+ const caps = row.capabilities && typeof row.capabilities === 'object' ? row.capabilities : {};
79
+ const metadata = row.metadata && typeof row.metadata === 'object' ? row.metadata : {};
80
+ const source = String(metadata.capability_source || (row.source?.fallback?.url ? 'provider_reference' : 'provider_api'));
81
+
82
+ if (!CHAT_ADAPTER_PROVIDERS.has(provider)) {
83
+ return { chat_eligible: false, eligibility_reason: 'provider_adapter_unavailable', eligibility_source: source };
84
+ }
85
+ if (caps.embeddings === true) {
86
+ return { chat_eligible: false, eligibility_reason: 'embedding_model', eligibility_source: source };
87
+ }
88
+ if (caps.agent_runtime === false) {
89
+ return { chat_eligible: false, eligibility_reason: 'capability_excludes_chat', eligibility_source: source };
90
+ }
91
+
92
+ const positive =
93
+ (provider === 'openai' && caps.responses === true && caps.agent_runtime === true)
94
+ || (provider === 'anthropic' && caps.messages === true)
95
+ || (provider === 'gemini' && caps.generate_content === true && caps.text_output === true)
96
+ || (provider === 'xai' && caps.responses === true && caps.text_output === true)
97
+ || (provider === 'cloudflare' && caps.workers_ai === true && caps.agent_runtime === true && caps.embeddings !== true);
98
+
99
+ if (positive) {
100
+ return { chat_eligible: true, eligibility_reason: null, eligibility_source: source };
101
+ }
102
+ if (metadata.specialized_output === true || caps.text_output === false) {
103
+ return { chat_eligible: false, eligibility_reason: 'specialized_output_model', eligibility_source: source };
104
+ }
105
+ return { chat_eligible: false, eligibility_reason: 'capability_unknown', eligibility_source: source };
106
+ }
107
+
73
108
  /**
74
109
  * Merge vault credentials (preferred) with optional platform env credentials.
75
110
  * Never returns secret material in the inventory result.
@@ -131,6 +166,15 @@ export async function collectCredentialScopedInventory(options = {}) {
131
166
  };
132
167
  }
133
168
 
169
+ function sanitizeDiscoveryError(error) {
170
+ const raw = String(error || '').trim();
171
+ if (!raw) return null;
172
+ if (/\b(?:401|403)\b|unauthoriz|forbidden|invalid[_ -]?(?:api[_ -]?)?key|credential.*reject/i.test(raw)) {
173
+ return 'provider_credential_rejected';
174
+ }
175
+ return 'provider_discovery_failed';
176
+ }
177
+
134
178
  export function sanitizeInventoryForClient(status = {}) {
135
179
  const out = {
136
180
  schemaVersion: status.schemaVersion,
@@ -142,11 +186,14 @@ export function sanitizeInventoryForClient(status = {}) {
142
186
  label: row.label,
143
187
  configured: row.configured === true,
144
188
  source: row.source || null,
145
- credentialError: row.credentialError || null,
189
+ credentialError: sanitizeDiscoveryError(row.credentialError),
146
190
  })),
147
- discovery: status.discovery || {},
191
+ discovery: Object.fromEntries(Object.entries(status.discovery || {}).map(([provider, row]) => [provider, {
192
+ ...row,
193
+ error: sanitizeDiscoveryError(row?.error),
194
+ }])) ,
148
195
  availableModels: (status.availableModels || []).map((row) => ({
149
- provider: row.provider,
196
+ provider: row.provider === 'grok' ? 'xai' : row.provider,
150
197
  model_id: row.provider_model_id || row.model_id,
151
198
  model_key: row.model_key || null,
152
199
  label: row.label || row.provider_model_id || row.model_id,
@@ -156,6 +203,7 @@ export function sanitizeInventoryForClient(status = {}) {
156
203
  reasoning_efforts: row.reasoning_efforts || [],
157
204
  service_tiers: row.service_tiers || [],
158
205
  capabilities: row.capabilities || {},
206
+ ...modelChatEligibility(row),
159
207
  })),
160
208
  };
161
209
  if (status.local) {
@@ -0,0 +1,41 @@
1
+ import { defineSamOperation } from '../define.js';
2
+ import { auditPackages } from '../../commands/package.js';
3
+
4
+ export const packageAuditOp = defineSamOperation({
5
+ id: 'package.audit',
6
+ version: 1,
7
+ module: 'package',
8
+ action: 'audit',
9
+ summary: 'Audit AgentSam package publication intent, registry state, and structural blockers.',
10
+ purpose:
11
+ 'Establish deterministic package-distribution authority for @inneranimalmedia packages without publishing anything.',
12
+ outcome:
13
+ 'Return classified package manifests, public-distribution intent, registry state when allowed, and structural blockers.',
14
+ description:
15
+ 'Discover scoped package manifests, classify public/private intent, optionally query npm registry state, and return a bounded read-only audit.',
16
+ skill: { id: 'agentsam-progression-guard', help: true },
17
+ accepts: ['root', 'publicOnly', 'offline'],
18
+ phases: ['discover_manifests', 'classify_intent', 'resolve_registry_state', 'emit_audit'],
19
+ execution: {
20
+ lanes: ['local', 'remote', 'sandbox'],
21
+ model: 'never',
22
+ embedding: 'never',
23
+ network: 'optional',
24
+ sideEffects: 'none',
25
+ provider_spend: 'none',
26
+ },
27
+ risk: 'read_only',
28
+ capabilities: ['package.audit'],
29
+ artifacts: ['package.audit'],
30
+ cli: { command: [['package', 'audit']] },
31
+ docs: { section: 'Packages' },
32
+ status: 'stable',
33
+ async handler(input = {}, ctx = {}) {
34
+ const root = input.root || input.cwd || ctx.cwd || process.cwd();
35
+ return auditPackages({
36
+ root,
37
+ publicOnly: input.publicOnly === true || input.public === true,
38
+ offline: input.offline === true,
39
+ });
40
+ },
41
+ });
package/src/sam/seed.js CHANGED
@@ -8,6 +8,7 @@ import { codebaseindexIngestOp } from './operations/codebaseindex-ingest.js';
8
8
  import { planningAstarOp } from './operations/planning-astar.js';
9
9
  import { planningGoapOp } from './operations/planning-goap.js';
10
10
  import { decisionEvaluateOp } from './operations/decision-evaluate.js';
11
+ import { packageAuditOp } from './operations/package-audit.js';
11
12
 
12
13
  export const SEED_OPERATIONS = [
13
14
  repositoryInspect,
@@ -19,6 +20,7 @@ export const SEED_OPERATIONS = [
19
20
  planningAstarOp,
20
21
  planningGoapOp,
21
22
  decisionEvaluateOp,
23
+ packageAuditOp,
22
24
  ];
23
25
 
24
26
  let seeded = false;
@@ -17,6 +17,9 @@ export function triageLog(text) {
17
17
  else if (/\b([1-9]\d*)\s+(?:(?:low|moderate|high|critical)\s+(?:severity\s+)?)?vulnerabilit/i.test(raw) || /npm audit fix/i.test(raw)) add('audit', line, 'rescan-current-lockfile');
18
18
  else if (/ExperimentalWarning/.test(raw)) add('experimental-runtime', line, 'informational', { blocking: false });
19
19
  else if (/new (?:release|(?:patch |minor |major )?version).*(?:pip|npm)|(?:pip|npm).*new (?:release|version)/i.test(raw)) add('tool-update', line, 'informational', { blocking: false });
20
+ // package.json allowScripts is the project authority; a user/global .npmrc allow-scripts clash is expected noise.
21
+ else if (/npm (?:warn|warning) allow-scripts.*declares its own allowScripts/i.test(raw)) add('configuration', line, 'informational', { blocking: false });
22
+ else if (/npm (?:warn|warning) allow-scripts/i.test(raw)) add('configuration', line, 'review-package-manager-config');
20
23
  else if (/npm (?:warn|warning).*config/i.test(raw)) add('configuration', line, 'review-package-manager-config');
21
24
  else if (/\b(?:warning|warn|npm ERR!|npm error)\b/i.test(raw)) add('unclassified-warning', line, 'review-log-at-source');
22
25
  }
@@ -89,6 +89,42 @@ export function renderHelpOverview(version, options = {}) {
89
89
  return lines.join('\n');
90
90
  }
91
91
 
92
+ export function renderCommandHelp(entryOrId, version = String(pkg.version || 'unknown')) {
93
+ const entry = typeof entryOrId === 'string' ? getCliCommand(entryOrId) : entryOrId;
94
+ if (!entry) return renderHelpOverview(version);
95
+
96
+ const usage = entry.usage?.length ? entry.usage : [`agentsam ${entry.id}`];
97
+ const lines = [
98
+ '',
99
+ ' ' + pc.bold('Agent Sam') + ' ' + pc.dim('v' + version) + ' ' + pc.dim('·') + ' ' + pc.bold(entry.id),
100
+ ' ' + pc.dim(entry.summary),
101
+ '',
102
+ ' ' + pc.bold('Usage'),
103
+ ...usage.map((row) => ' ' + pc.cyan(row)),
104
+ ];
105
+
106
+ if (entry.options?.length) {
107
+ const width = Math.min(32, Math.max(...entry.options.map((row) => row.flag.length), 0));
108
+ lines.push(
109
+ '',
110
+ ' ' + pc.bold('Options'),
111
+ ...entry.options.map((row) => ' ' + pc.cyan(row.flag.padEnd(width)) + ' ' + pc.dim(row.description)),
112
+ );
113
+ }
114
+
115
+ if (entry.aliases?.length) {
116
+ lines.push('', ' ' + pc.bold('Aliases'), ' ' + entry.aliases.map((alias) => pc.cyan(`agentsam ${alias}`)).join(' · '));
117
+ }
118
+ if (entry.skill) {
119
+ lines.push('', ' ' + pc.dim(`Skill: agentsam skills ${entry.skill}`));
120
+ }
121
+ if (entry.operation) {
122
+ lines.push(' ' + pc.dim(`Operation: ${entry.operation}`));
123
+ }
124
+ lines.push('');
125
+ return lines.join('\n');
126
+ }
127
+
92
128
  export function renderHelpTopic(topic, version) {
93
129
  if (!topic) return renderHelpOverview(version);
94
130
  const skillHint = topic.rows?.[0]?.[1]?.includes('skill')
@@ -153,6 +189,11 @@ export async function runHelp(argv = [], options = {}) {
153
189
 
154
190
  const topicArg = args.find((arg) => !arg.startsWith('-'));
155
191
  if (topicArg) {
192
+ const command = getCliCommand(topicArg);
193
+ if (command) {
194
+ write(renderCommandHelp(command, version));
195
+ return;
196
+ }
156
197
  const topic = resolveHelpTopic(topicArg);
157
198
  if (!topic) {
158
199
  write(renderHelpOverview(version));
@@ -1,145 +0,0 @@
1
- /**
2
- * Offline first-run CMS site for localhost preview — feeds the real CmsEditor shell.
3
- * Not a separate “scaffold UI”. Migrations/API stay authoritative in production.
4
- */
5
-
6
- export function buildDemoCmsBootstrap(projectSlug = 'demo') {
7
- const pageId = 'page_home';
8
- const heroId = 'sec_hero';
9
- const gridId = 'sec_products';
10
- const footerId = 'sec_footer';
11
- const textBlockId = 'blk_join';
12
-
13
- return {
14
- tenant: {
15
- name: 'Heuristic Theme',
16
- domain: 'demo.localhost',
17
- primary_color: '#1e6a6f',
18
- },
19
- public_domain: 'demo.localhost',
20
- workspace_label: 'Heuristic Theme',
21
- home_page: { id: pageId },
22
- protocol_version: 1,
23
- active_theme: {
24
- css_vars: {
25
- '--brand-primary': '#1e6a6f',
26
- '--brand-secondary': '#123f42',
27
- '--brand-accent': '#cfef5b',
28
- '--color-bg': '#f5f2ea',
29
- '--color-surface': '#ffffff',
30
- '--color-text': '#101014',
31
- '--color-text-muted': '#73737f',
32
- '--font-heading': 'Inter',
33
- '--font-body': 'Inter',
34
- },
35
- },
36
- pages: [
37
- {
38
- id: pageId,
39
- title: 'Home page',
40
- slug: '/',
41
- route_path: '/',
42
- page_type: 'Home',
43
- status: 'draft',
44
- seo_title: 'Heuristic Theme',
45
- meta_description: 'Stock CMS theme preview for AgentSam scaffolding.',
46
- },
47
- ],
48
- sections_by_page: {
49
- [pageId]: [
50
- {
51
- id: heroId,
52
- section_name: 'Editorial hero',
53
- section_type: 'hero',
54
- is_visible: 1,
55
- sort_order: 10,
56
- section_data: {
57
- headline: 'My Store',
58
- subline: 'Stock heuristic-theme · first-run CMS surface',
59
- cta_text: 'Shop collection',
60
- eyebrow: 'Heuristic Theme',
61
- bg_color: '#101014',
62
- },
63
- },
64
- {
65
- id: gridId,
66
- section_name: 'Product grid',
67
- section_type: 'product-grid',
68
- is_visible: 1,
69
- sort_order: 20,
70
- section_data: {
71
- title: 'Featured',
72
- columns: 2,
73
- },
74
- },
75
- {
76
- id: footerId,
77
- section_name: 'Footer',
78
- section_type: 'footer',
79
- is_visible: 1,
80
- sort_order: 30,
81
- section_data: {
82
- zone: 'FOOTER',
83
- bg_color: '#F3F0E8',
84
- },
85
- },
86
- ],
87
- },
88
- blocks_by_section: {
89
- [heroId]: [],
90
- [gridId]: [
91
- {
92
- id: 'blk_card_1',
93
- section_id: gridId,
94
- block_type: 'product-card',
95
- is_visible: 1,
96
- sort_order: 10,
97
- block_data: { title: 'Classic tee', price: '$19.99' },
98
- },
99
- {
100
- id: 'blk_card_2',
101
- section_id: gridId,
102
- block_type: 'product-card',
103
- is_visible: 1,
104
- sort_order: 20,
105
- block_data: { title: 'Soft tee', price: '$19.99' },
106
- },
107
- ],
108
- [footerId]: [
109
- {
110
- id: textBlockId,
111
- section_id: footerId,
112
- block_type: 'text',
113
- is_visible: 1,
114
- sort_order: 10,
115
- block_data: {
116
- text: 'Join our email list',
117
- typography_preset: 'Heading 4',
118
- width: 'fit',
119
- max_width: 'normal',
120
- align: 'left',
121
- },
122
- },
123
- ],
124
- },
125
- component_templates: [
126
- { id: 'tpl_baseline_landing', template_name: 'Landing page', template_type: 'page', category: 'Marketing' },
127
- { id: 'tpl_baseline_hero', template_name: 'Editorial hero', template_type: 'section', category: 'Portfolio' },
128
- { id: 'tpl_baseline_footer', template_name: 'Utility footer', template_type: 'section', category: 'Agency' },
129
- ],
130
- schemas: {
131
- protocol_version: 1,
132
- sections: [
133
- { key: 'hero', type: 'hero', version: 1, label: 'Editorial hero' },
134
- { key: 'product-grid', type: 'product-grid', version: 1, label: 'Product grid' },
135
- { key: 'footer', type: 'footer', version: 1, label: 'Footer' },
136
- ],
137
- blocks: [
138
- { key: 'text', type: 'text', version: 1, label: 'Text' },
139
- { key: 'product-card', type: 'product-card', version: 1, label: 'Product card' },
140
- ],
141
- },
142
- _demo: true,
143
- _project_slug: projectSlug,
144
- };
145
- }