@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.5

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 (418) hide show
  1. package/AGENTSAM.md +11 -0
  2. package/README.md +15 -9
  3. package/apps/client-cms-editor/AGENTS.md +12 -0
  4. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  5. package/apps/client-cms-editor/README.md +72 -0
  6. package/apps/client-cms-editor/agentsam.app.json +57 -0
  7. package/apps/client-cms-editor/backend/README.md +5 -0
  8. package/apps/client-cms-editor/backend/package.json +22 -0
  9. package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
  10. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
  11. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  12. package/apps/client-cms-editor/backend/src/model.ts +115 -0
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  14. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  15. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  16. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  17. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  18. package/apps/client-cms-editor/backend/tsconfig.json +15 -0
  19. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  20. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  21. package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
  22. package/apps/client-cms-editor/frontend/index.html +12 -0
  23. package/apps/client-cms-editor/frontend/package.json +33 -0
  24. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
  25. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
  26. package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
  27. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +8 -0
  29. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
  35. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  36. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  37. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  38. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  39. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  40. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  41. package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
  42. package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
  43. package/apps/client-cms-editor/package-lock.json +3832 -0
  44. package/apps/client-cms-editor/package.json +23 -0
  45. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  46. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  47. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  48. package/apps/client-cms-editor/shared/cms/package.json +21 -0
  49. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
  50. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  51. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
  52. package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
  53. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  54. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  55. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  56. package/bin/agentsam-rapid-rust +36 -0
  57. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  58. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  59. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  60. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  61. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  62. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
  63. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  64. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  65. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  66. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  68. package/docs/contracts/capability-install-planner.md +67 -0
  69. package/docs/contracts/environment-vocabulary.md +195 -0
  70. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  71. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  72. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  73. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  74. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  75. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  76. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  77. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  78. package/docs/plugins.md +2 -2
  79. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  80. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  81. package/docs/product/README.md +8 -0
  82. package/docs/rapid-rust-wasm.md +35 -0
  83. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  84. package/package.json +73 -14
  85. package/packages/agentsam-brand/README.md +106 -11
  86. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  87. package/packages/agentsam-brand/package.json +39 -7
  88. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  89. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  90. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  91. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  92. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  93. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  94. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  95. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  96. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  97. package/packages/agentsam-brand/src/core/errors.js +12 -0
  98. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  99. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  100. package/packages/agentsam-brand/src/core/keys.js +83 -0
  101. package/packages/agentsam-brand/src/core/naming.js +142 -0
  102. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  103. package/packages/agentsam-brand/src/core/pack.js +305 -0
  104. package/packages/agentsam-brand/src/core/plan.js +276 -0
  105. package/packages/agentsam-brand/src/core/preview.js +159 -0
  106. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  107. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  108. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  109. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  110. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  111. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  112. package/packages/agentsam-brand/src/core/promote.js +288 -0
  113. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  114. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  115. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  116. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  117. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  118. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  119. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  120. package/packages/agentsam-brand/src/index.js +193 -36
  121. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  122. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  123. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  124. package/packages/agentsam-brand/src/presets/index.js +40 -0
  125. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  126. package/packages/agentsam-brand/src/presets/model.json +8 -0
  127. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  128. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  129. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  130. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  131. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  132. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  133. package/packages/agentsam-knowledge/src/providers/index.js +6 -4
  134. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  135. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  136. package/packages/agentsam-nav/package.json +2 -2
  137. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  138. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  139. package/packages/agentsam-rapid-rust/README.md +5 -0
  140. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  141. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  142. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  143. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  144. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  145. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  146. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  147. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  148. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  149. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  150. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  151. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  152. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  153. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  154. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  155. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  156. package/packages/agentsam-repository/src/index.js +1 -0
  157. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  158. package/packages/agentsam-repository/src/source-types.js +85 -0
  159. package/packages/agentsam-vault/README.md +96 -0
  160. package/packages/agentsam-vault/package.json +32 -0
  161. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  162. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  163. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  164. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  165. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  166. package/packages/agentsam-vault/src/index.d.ts +9 -0
  167. package/packages/agentsam-vault/src/index.js +27 -0
  168. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  169. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  170. package/packages/agentsam-workbench/README.md +24 -0
  171. package/packages/agentsam-workbench/package.json +38 -0
  172. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  173. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  174. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  175. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  176. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  177. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  178. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  179. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  180. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  181. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  182. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  183. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  184. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  185. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  186. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  187. package/packages/agentsam-workbench/src/index.ts +6 -0
  188. package/packages/agentsam-workbench/src/project-control.css +160 -0
  189. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  190. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  191. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  192. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  193. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  194. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  195. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  196. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  197. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  198. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  199. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  200. package/packages/agentsam-workbench/tsconfig.json +13 -0
  201. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  202. package/packages/connectors/cloudflare/package.json +3 -1
  203. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  204. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  205. package/packages/connectors/cloudflare/src/credential.js +318 -0
  206. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  207. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  208. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  209. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  210. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  211. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  212. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  213. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  214. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  215. package/packages/connectors/cloudflare/src/index.js +102 -265
  216. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  217. package/packages/connectors/cloudflare/src/owner.js +42 -12
  218. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  219. package/packages/connectors/cloudflare/src/routes.js +309 -144
  220. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  221. package/packages/connectors/cloudflare/src/vault.js +2 -2
  222. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  223. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
  224. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  225. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  226. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  227. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
  228. package/packages/identity/README.md +1 -1
  229. package/packages/identity/backend/README.md +1 -1
  230. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
  231. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  232. package/packages/identity/package.json +4 -3
  233. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  234. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  235. package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
  236. package/packages/identity/src/adapters/sqlite/index.js +4 -1
  237. package/packages/identity/src/contracts/auth-config.js +28 -8
  238. package/packages/identity/src/contracts/external-identity.js +1 -1
  239. package/packages/identity/src/contracts/provider.js +1 -0
  240. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  241. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
  242. package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
  243. package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
  244. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  245. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  246. package/packages/identity/src/index.js +16 -0
  247. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  248. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  249. package/packages/identity/src/migrations/README.md +5 -2
  250. package/packages/identity/src/oauth/README.md +10 -5
  251. package/packages/identity/src/oauth/consent-view.js +388 -0
  252. package/packages/identity/src/oauth/credentials.js +31 -11
  253. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  254. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  255. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  256. package/packages/identity/src/providers/iam/index.js +27 -5
  257. package/packages/identity/src/server/identity-service.js +31 -2
  258. package/packages/identity/src/server/worker-router.js +111 -81
  259. package/packages/identity/tests/auth-config.test.mjs +3 -2
  260. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  261. package/packages/identity/tests/identity-service.test.mjs +16 -0
  262. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  263. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  264. package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
  265. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  266. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  267. package/packages/runtime-protocol/src/index.js +154 -0
  268. package/packages/theme-scenes/README.md +164 -0
  269. package/packages/theme-scenes/package.json +53 -0
  270. package/packages/theme-scenes/src/blocks/index.js +30 -0
  271. package/packages/theme-scenes/src/contracts/index.js +286 -0
  272. package/packages/theme-scenes/src/demos/index.js +65 -0
  273. package/packages/theme-scenes/src/index.js +75 -0
  274. package/packages/theme-scenes/src/presets/index.js +263 -0
  275. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  276. package/packages/theme-scenes/src/scenes/index.js +146 -0
  277. package/packages/theme-scenes/src/shell/index.js +47 -0
  278. package/packages/theme-scenes/src/themes/index.js +129 -0
  279. package/packages/theme-scenes/src/visuals/index.js +41 -0
  280. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  281. package/packages/work-graph/src/index.js +34 -1
  282. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  283. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  284. package/protocol/README.md +15 -7
  285. package/protocol/apps/agentsam.app.v1.schema.json +89 -7
  286. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  287. package/protocol/assets/README.md +9 -0
  288. package/protocol/assets/asset-record.v1.schema.json +64 -0
  289. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  290. package/protocol/scoring/README.md +10 -0
  291. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  292. package/protocol/ui/icon-registry.mjs +1 -0
  293. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  294. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  295. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  296. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  297. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  298. package/scripts/build_rapid_rust_cli.py +83 -0
  299. package/src/attachments/index.js +6 -0
  300. package/src/attachments/intake.js +235 -0
  301. package/src/capabilities/repository-snapshot.js +19 -2
  302. package/src/cli/command-catalog.js +8 -0
  303. package/src/cli.js +182 -26
  304. package/src/commands/account-auth.js +94 -8
  305. package/src/commands/app.js +307 -3
  306. package/src/commands/billing.js +127 -0
  307. package/src/commands/brand.js +74 -60
  308. package/src/commands/cheat-sheet.js +154 -0
  309. package/src/commands/cloudflare-login.js +222 -0
  310. package/src/commands/cloudflare.js +453 -23
  311. package/src/commands/codebaseindex.js +6 -1
  312. package/src/commands/compute.js +4 -0
  313. package/src/commands/connections.js +11 -5
  314. package/src/commands/credentials.js +116 -0
  315. package/src/commands/gcloud-auth.js +427 -0
  316. package/src/commands/google-cloud.js +375 -0
  317. package/src/commands/identity-init.js +2 -2
  318. package/src/commands/mcp.js +226 -33
  319. package/src/commands/ollama.js +3 -2
  320. package/src/commands/plugins.js +7 -2
  321. package/src/commands/product.js +36 -0
  322. package/src/commands/runtime-status.js +28 -9
  323. package/src/commands/runtime.js +313 -0
  324. package/src/commands/rust.js +24 -0
  325. package/src/commands/setup.js +279 -0
  326. package/src/commands/shell.js +16 -3
  327. package/src/commands/start-local.js +2 -2
  328. package/src/commands/terminal.js +171 -0
  329. package/src/commands/update.js +140 -0
  330. package/src/commands/whoami.js +329 -65
  331. package/src/features/resolve.js +1 -0
  332. package/src/index.js +4 -0
  333. package/src/indexing/ingest/inventory.js +254 -19
  334. package/src/indexing/ingest/materials.js +3 -9
  335. package/src/indexing/ingest/style-evidence.js +181 -0
  336. package/src/knowledge/source.js +3 -3
  337. package/src/lib/account-session.js +11 -4
  338. package/src/lib/app-authority.js +172 -0
  339. package/src/lib/auth.js +94 -21
  340. package/src/lib/core-client.js +5 -6
  341. package/src/lib/credentials-audit.js +451 -0
  342. package/src/lib/deploy/health.js +24 -6
  343. package/src/lib/detect-context.js +7 -1
  344. package/src/lib/google-cloud-connection.js +270 -0
  345. package/src/lib/google-cloud-inventory.js +385 -0
  346. package/src/lib/google-desktop-oauth.js +372 -0
  347. package/src/lib/google-studio-brokered-oauth.js +158 -0
  348. package/src/lib/identity-scaffold.js +24 -6
  349. package/src/lib/init-options.js +192 -0
  350. package/src/lib/local-scaffold.js +48 -16
  351. package/src/lib/provider-command-remediation.js +308 -0
  352. package/src/lib/provider-credentials.js +8 -0
  353. package/src/lib/scaffold/index.js +8 -2
  354. package/src/lib/scaffold/mcp-server.js +43 -0
  355. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  356. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  357. package/src/lib/scaffold/wizards/cms.js +93 -0
  358. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  359. package/src/lib/setup/contract.js +26 -0
  360. package/src/lib/setup/discover.js +116 -0
  361. package/src/lib/setup/execute.js +205 -0
  362. package/src/lib/setup/planner.js +134 -0
  363. package/src/lib/setup/recipes.js +235 -0
  364. package/src/lib/setup/runtime-persist.js +197 -0
  365. package/src/lib/setup/runtime.js +394 -0
  366. package/src/lib/slash-commands.js +2 -0
  367. package/src/lib/terminal/machine-identity.js +95 -0
  368. package/src/lib/terminal-local.js +164 -0
  369. package/src/lib/terminal-scopes.js +52 -0
  370. package/src/lib/whoami-capabilities.js +184 -0
  371. package/src/local-pty/server.js +34 -5
  372. package/src/mcp/authority.js +58 -108
  373. package/src/mcp/client-adapters.js +68 -144
  374. package/src/mcp/client.js +142 -122
  375. package/src/mcp/cloudflare-bundles.js +225 -0
  376. package/src/mcp/index.js +12 -0
  377. package/src/plugins/cloudflare.js +1 -1
  378. package/src/providers/ollama-chat.js +2 -1
  379. package/src/sam/types.js +27 -2
  380. package/src/security/inventory.js +12 -2
  381. package/src/security/local-vault.js +2 -0
  382. package/src/security/scan.js +1 -1
  383. package/test/account-session.test.mjs +3 -3
  384. package/test/app-authority-context.test.mjs +32 -0
  385. package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
  386. package/test/cli/mcp-client.test.mjs +21 -10
  387. package/test/cli/runtime-persist.test.mjs +56 -0
  388. package/test/cli/rust-command.test.mjs +21 -0
  389. package/test/credentials-audit.test.mjs +113 -0
  390. package/test/deploy-health-scan.test.mjs +29 -1
  391. package/test/gcloud-auth.test.mjs +111 -0
  392. package/test/google-cloud-connection.test.mjs +83 -0
  393. package/test/google-cloud-inventory.test.mjs +64 -0
  394. package/test/init-options.test.mjs +35 -0
  395. package/test/integration/app-command.test.mjs +30 -0
  396. package/test/integration/cad-project.test.mjs +4 -1
  397. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  398. package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
  399. package/test/integration/codebaseindex-ingest.test.mjs +48 -0
  400. package/test/integration/features-resolve.test.mjs +30 -11
  401. package/test/integration/inspect-path-cli.test.mjs +46 -0
  402. package/test/integration/inventory-evidence.test.mjs +125 -0
  403. package/test/integration/runtime-status.integration.test.mjs +2 -1
  404. package/test/knowledge.test.mjs +35 -1
  405. package/test/loopback-oauth.test.mjs +53 -0
  406. package/test/ollama.test.mjs +22 -0
  407. package/test/security.test.mjs +23 -0
  408. package/test/setup-planner.test.mjs +74 -0
  409. package/test/setup-runtime.test.mjs +51 -0
  410. package/test/terminal/local-pty.mock.test.mjs +3 -1
  411. package/test/terminal-machine-identity.test.mjs +88 -0
  412. package/test/whoami-resume.test.mjs +27 -6
  413. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  414. package/packages/work-graph/prototype/README.md +0 -32
  415. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  416. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  417. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  418. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -0,0 +1,237 @@
1
+ -- AgentSam CMS / Rust / machine product registry graduation.
2
+ -- Idempotent: stable product slugs + unique relationship edges.
3
+ -- Database: inneranimalmedia-business
4
+
5
+ INSERT INTO agentsam_products (
6
+ slug, name, kind, status, description,
7
+ repository_id, canonical_path, package_name, version, tags, metadata, updated_at
8
+ ) VALUES (
9
+ 'cms',
10
+ 'InnerAnimalMedia CMS',
11
+ 'product',
12
+ 'wired',
13
+ 'Independent CMS product identity; portable editor/runtime surfaces inherit AgentSam capabilities.',
14
+ 'github:samprimeaux/inneranimalmedia',
15
+ 'src/core/agentsam/cms',
16
+ NULL,
17
+ NULL,
18
+ '["cms","product","installable"]',
19
+ '{"origin":"registry.cms-rust-machine-20260928","installable":true,"app_id":"client-cms-editor","install":{"command":"agentsam app scaffold client-cms-editor","paths":["/install/cms"]},"run_targets":["local","cloudflare","tauri"],"persistence":["sqlite","d1","localStorage_cache"],"cli_commands":[],"capabilities":["cms.editor","cms.pages","cms.sections","cms.components","cms.media"]}',
20
+ unixepoch()
21
+ )
22
+ ON CONFLICT(slug) DO UPDATE SET
23
+ name=excluded.name,
24
+ kind=excluded.kind,
25
+ status=excluded.status,
26
+ description=excluded.description,
27
+ repository_id=COALESCE(excluded.repository_id,agentsam_products.repository_id),
28
+ canonical_path=excluded.canonical_path,
29
+ package_name=excluded.package_name,
30
+ version=excluded.version,
31
+ tags=excluded.tags,
32
+ metadata=excluded.metadata,
33
+ updated_at=excluded.updated_at;
34
+
35
+ INSERT INTO agentsam_products (
36
+ slug, name, kind, status, description,
37
+ repository_id, canonical_path, package_name, version, tags, metadata, updated_at
38
+ ) VALUES (
39
+ 'client-cms-editor',
40
+ 'AgentSam CMS Editor',
41
+ 'app',
42
+ 'scaffolded',
43
+ 'Canonical reusable CMS editor app; donor-quality remaster is in progress behind adapter boundaries.',
44
+ 'github:samprimeaux/agentsam-sdk',
45
+ 'apps/client-cms-editor',
46
+ '@inneranimalmedia/client-cms-editor',
47
+ '0.1.0',
48
+ '["cms","app","editor","installable"]',
49
+ '{"origin":"registry.cms-rust-machine-20260928","installable":true,"app_id":"client-cms-editor","product_id":"cms","legacy_slug":"iam-client-cms-editor","install":{"command":"agentsam app scaffold client-cms-editor","paths":["/install/cms","/install/client-cms-editor"]},"run_targets":["local","cloudflare","tauri"],"persistence":["sqlite","d1","localStorage_cache"],"cli_commands":[],"capabilities":["cms.editor","cms.pages","cms.sections","cms.components","cms.media"]}',
50
+ unixepoch()
51
+ )
52
+ ON CONFLICT(slug) DO UPDATE SET
53
+ name=excluded.name,
54
+ kind=excluded.kind,
55
+ status=excluded.status,
56
+ description=excluded.description,
57
+ repository_id=COALESCE(excluded.repository_id,agentsam_products.repository_id),
58
+ canonical_path=excluded.canonical_path,
59
+ package_name=excluded.package_name,
60
+ version=excluded.version,
61
+ tags=excluded.tags,
62
+ metadata=excluded.metadata,
63
+ updated_at=excluded.updated_at;
64
+
65
+ INSERT INTO agentsam_products (
66
+ slug, name, kind, status, description,
67
+ repository_id, canonical_path, package_name, version, tags, metadata, updated_at
68
+ ) VALUES (
69
+ 'theme-inneranimals-site',
70
+ 'Inner Animals Site Theme',
71
+ 'theme',
72
+ 'prototype',
73
+ 'Harvested Inner Animals storefront/theme candidate awaiting canonical reusable theme graduation.',
74
+ NULL,
75
+ NULL,
76
+ NULL,
77
+ NULL,
78
+ '["cms","theme","harvest","candidate"]',
79
+ '{"origin":"registry.cms-rust-machine-20260928","installable":false,"candidate":true,"source":"harvest","capabilities":["cms.theme"]}',
80
+ unixepoch()
81
+ )
82
+ ON CONFLICT(slug) DO UPDATE SET
83
+ name=excluded.name,
84
+ kind=excluded.kind,
85
+ status=excluded.status,
86
+ description=excluded.description,
87
+ repository_id=COALESCE(excluded.repository_id,agentsam_products.repository_id),
88
+ canonical_path=excluded.canonical_path,
89
+ package_name=excluded.package_name,
90
+ version=excluded.version,
91
+ tags=excluded.tags,
92
+ metadata=excluded.metadata,
93
+ updated_at=excluded.updated_at;
94
+
95
+ INSERT INTO agentsam_products (
96
+ slug, name, kind, status, description,
97
+ repository_id, canonical_path, package_name, version, tags, metadata, updated_at
98
+ ) VALUES (
99
+ 'asrust',
100
+ 'AgentSam Rust/Wasm Edge Lab',
101
+ 'service',
102
+ 'wired',
103
+ 'Live Rust/Wasm Worker capability lab at asrust.inneranimalmedia.com.',
104
+ NULL,
105
+ NULL,
106
+ NULL,
107
+ NULL,
108
+ '["rust","wasm","cloudflare","service"]',
109
+ '{"origin":"registry.cms-rust-machine-20260928","runtime":"rust-wasm","deployment":{"provider":"cloudflare","url":"https://asrust.inneranimalmedia.com","state":"live"},"run_targets":["cloudflare"],"cli_commands":[],"capabilities":["rust.wasm.worker"]}',
110
+ unixepoch()
111
+ )
112
+ ON CONFLICT(slug) DO UPDATE SET
113
+ name=excluded.name,
114
+ kind=excluded.kind,
115
+ status=excluded.status,
116
+ description=excluded.description,
117
+ repository_id=COALESCE(excluded.repository_id,agentsam_products.repository_id),
118
+ canonical_path=excluded.canonical_path,
119
+ package_name=excluded.package_name,
120
+ version=excluded.version,
121
+ tags=excluded.tags,
122
+ metadata=excluded.metadata,
123
+ updated_at=excluded.updated_at;
124
+
125
+ INSERT INTO agentsam_products (
126
+ slug, name, kind, status, description,
127
+ repository_id, canonical_path, package_name, version, tags, metadata, updated_at
128
+ ) VALUES (
129
+ 'agentsam-machine',
130
+ 'AgentSam Machine',
131
+ 'service',
132
+ 'prototype',
133
+ 'Deterministic native inspect/catalog engine; native core is present while top-level agentsam machine dispatch remains pending.',
134
+ 'github:samprimeaux/agentsam-sdk',
135
+ 'native/agentsam-machine',
136
+ NULL,
137
+ '0.1.0',
138
+ '["rust","native","machine","inspect"]',
139
+ '{"origin":"registry.cms-rust-machine-20260928","installable":false,"runtime":"native-rust","run_targets":["local","tauri"],"cli_commands":[],"capabilities":["machine.inspect"],"dispatch":"pending"}',
140
+ unixepoch()
141
+ )
142
+ ON CONFLICT(slug) DO UPDATE SET
143
+ name=excluded.name,
144
+ kind=excluded.kind,
145
+ status=excluded.status,
146
+ description=excluded.description,
147
+ repository_id=COALESCE(excluded.repository_id,agentsam_products.repository_id),
148
+ canonical_path=excluded.canonical_path,
149
+ package_name=excluded.package_name,
150
+ version=excluded.version,
151
+ tags=excluded.tags,
152
+ metadata=excluded.metadata,
153
+ updated_at=excluded.updated_at;
154
+
155
+ INSERT INTO agentsam_products (
156
+ slug, name, kind, status, description,
157
+ repository_id, canonical_path, package_name, version, tags, metadata, updated_at
158
+ ) VALUES (
159
+ 'agentsam-rapid-rust',
160
+ 'AgentSam Rapid Rust',
161
+ 'sdk-package',
162
+ 'prototype',
163
+ 'Rust/Wasm Worker scaffolding and local proof tooling shipped inside the AgentSam SDK.',
164
+ 'github:samprimeaux/agentsam-sdk',
165
+ 'packages/agentsam-rapid-rust',
166
+ '@inneranimalmedia/agentsam-sdk',
167
+ '0.1.0',
168
+ '["rust","wasm","sdk","cli","installable"]',
169
+ '{"origin":"registry.cms-rust-machine-20260928","installable":true,"bundled_in":"@inneranimalmedia/agentsam-sdk","run_targets":["local","cloudflare"],"persistence":[],"cli_commands":["agentsam rust","agentsam wasm"],"capabilities":["rust.scaffold","rust.check","rust.build","rust.dev","rust.deploy"]}',
170
+ unixepoch()
171
+ )
172
+ ON CONFLICT(slug) DO UPDATE SET
173
+ name=excluded.name,
174
+ kind=excluded.kind,
175
+ status=excluded.status,
176
+ description=excluded.description,
177
+ repository_id=COALESCE(excluded.repository_id,agentsam_products.repository_id),
178
+ canonical_path=excluded.canonical_path,
179
+ package_name=excluded.package_name,
180
+ version=excluded.version,
181
+ tags=excluded.tags,
182
+ metadata=excluded.metadata,
183
+ updated_at=excluded.updated_at;
184
+
185
+ -- CMS product is packaged as the canonical editor app.
186
+ INSERT INTO asset_relationships (
187
+ source_type, source_id, target_type, target_id, relationship_type, metadata
188
+ )
189
+ SELECT 'agentsam_product', cms.id, 'agentsam_product', editor.id, 'packaged_as',
190
+ '{"origin":"registry.cms-rust-machine-20260928","role":"editor_app"}'
191
+ FROM agentsam_products cms, agentsam_products editor
192
+ WHERE cms.slug='cms' AND editor.slug='client-cms-editor'
193
+ ON CONFLICT(source_type,source_id,target_type,target_id,relationship_type)
194
+ DO UPDATE SET metadata=excluded.metadata;
195
+
196
+ -- Preserve the existing legacy product identity as an alias, not a second canonical editor.
197
+ INSERT INTO asset_relationships (
198
+ source_type, source_id, target_type, target_id, relationship_type, metadata
199
+ )
200
+ SELECT 'agentsam_product', legacy.id, 'agentsam_product', editor.id, 'aliased_as',
201
+ '{"origin":"registry.cms-rust-machine-20260928","legacy_slug":"iam-client-cms-editor"}'
202
+ FROM agentsam_products legacy, agentsam_products editor
203
+ WHERE legacy.slug='iam-client-cms-editor' AND editor.slug='client-cms-editor'
204
+ ON CONFLICT(source_type,source_id,target_type,target_id,relationship_type)
205
+ DO UPDATE SET metadata=excluded.metadata;
206
+
207
+ -- Harvested theme candidate belongs to the CMS product family.
208
+ INSERT INTO asset_relationships (
209
+ source_type, source_id, target_type, target_id, relationship_type, metadata
210
+ )
211
+ SELECT 'agentsam_product', theme.id, 'agentsam_product', cms.id, 'depends_on',
212
+ '{"origin":"registry.cms-rust-machine-20260928","role":"cms_theme"}'
213
+ FROM agentsam_products theme, agentsam_products cms
214
+ WHERE theme.slug='theme-inneranimals-site' AND cms.slug='cms'
215
+ ON CONFLICT(source_type,source_id,target_type,target_id,relationship_type)
216
+ DO UPDATE SET metadata=excluded.metadata;
217
+
218
+ -- Rapid Rust exposes the commands that are already mainline and tested.
219
+ INSERT INTO asset_relationships (
220
+ source_type, source_id, target_type, target_id, relationship_type, metadata
221
+ )
222
+ SELECT 'agentsam_product', p.id, 'cli_command', 'agentsam:rust', 'exposes_command',
223
+ '{"origin":"registry.cms-rust-machine-20260928","command":"agentsam rust"}'
224
+ FROM agentsam_products p
225
+ WHERE p.slug='agentsam-rapid-rust'
226
+ ON CONFLICT(source_type,source_id,target_type,target_id,relationship_type)
227
+ DO UPDATE SET metadata=excluded.metadata;
228
+
229
+ INSERT INTO asset_relationships (
230
+ source_type, source_id, target_type, target_id, relationship_type, metadata
231
+ )
232
+ SELECT 'agentsam_product', p.id, 'cli_command', 'agentsam:wasm', 'exposes_command',
233
+ '{"origin":"registry.cms-rust-machine-20260928","command":"agentsam wasm"}'
234
+ FROM agentsam_products p
235
+ WHERE p.slug='agentsam-rapid-rust'
236
+ ON CONFLICT(source_type,source_id,target_type,target_id,relationship_type)
237
+ DO UPDATE SET metadata=excluded.metadata;
@@ -0,0 +1,21 @@
1
+ {
2
+ "schema": "agentsam.registry.receipt.v1",
3
+ "database": "inneranimalmedia-business",
4
+ "applied_at": "2026-09-28",
5
+ "validated": true,
6
+ "products": {
7
+ "cms": "wired",
8
+ "client-cms-editor": "scaffolded",
9
+ "theme-inneranimals-site": "prototype",
10
+ "asrust": "wired",
11
+ "agentsam-machine": "prototype",
12
+ "agentsam-rapid-rust": "prototype"
13
+ },
14
+ "relationships": [
15
+ ["cms", "packaged_as", "client-cms-editor"],
16
+ ["iam-client-cms-editor", "aliased_as", "client-cms-editor"],
17
+ ["theme-inneranimals-site", "depends_on", "cms"],
18
+ ["agentsam-rapid-rust", "exposes_command", "agentsam:rust"],
19
+ ["agentsam-rapid-rust", "exposes_command", "agentsam:wasm"]
20
+ ]
21
+ }
@@ -0,0 +1,27 @@
1
+ SELECT slug,kind,status,canonical_path,package_name,
2
+ json_extract(metadata,'$.app_id') AS app_id,
3
+ json_extract(metadata,'$.legacy_slug') AS legacy_slug,
4
+ json_extract(metadata,'$.dispatch') AS dispatch
5
+ FROM agentsam_products
6
+ WHERE slug IN (
7
+ 'cms',
8
+ 'client-cms-editor',
9
+ 'theme-inneranimals-site',
10
+ 'asrust',
11
+ 'agentsam-machine',
12
+ 'agentsam-rapid-rust'
13
+ )
14
+ ORDER BY slug;
15
+
16
+ SELECT p.slug AS source_slug,
17
+ ar.relationship_type,
18
+ CASE WHEN ar.target_type='agentsam_product' THEN tp.slug ELSE ar.target_id END AS target,
19
+ ar.target_type
20
+ FROM asset_relationships ar
21
+ JOIN agentsam_products p
22
+ ON ar.source_type='agentsam_product' AND ar.source_id=p.id
23
+ LEFT JOIN agentsam_products tp
24
+ ON ar.target_type='agentsam_product' AND ar.target_id=tp.id
25
+ WHERE p.slug IN ('cms','iam-client-cms-editor','theme-inneranimals-site','agentsam-rapid-rust')
26
+ AND ar.relationship_type IN ('packaged_as','aliased_as','depends_on','exposes_command')
27
+ ORDER BY source_slug, ar.relationship_type, target;
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env python3
2
+ """Build/install/smoke-test AgentSam Rapid Rust native CLI.
3
+
4
+ Nothing here deploys a Worker. --bootstrap only installs local Rust/Wasm build
5
+ prerequisites. --smoke scaffolds disposable projects and cargo-checks them.
6
+ """
7
+ from __future__ import annotations
8
+ import argparse, json, os, shutil, subprocess, sys, tempfile
9
+ from pathlib import Path
10
+
11
+ ROOT = Path(__file__).resolve().parents[1]
12
+ MANIFEST = ROOT / "packages" / "agentsam-rapid-rust" / "Cargo.toml"
13
+ BINARY = ROOT / "packages" / "agentsam-rapid-rust" / "target" / "release" / "agentsam-rapid-rust"
14
+ WORKER_BUILD_VERSION = "0.8.7"
15
+ TEMPLATES = ("api", "shared-core", "crypto-auth", "data-processor")
16
+
17
+ def run(cmd, *, cwd=ROOT, check=True):
18
+ print("→", " ".join(map(str, cmd)))
19
+ return subprocess.run(list(map(str, cmd)), cwd=cwd, check=check)
20
+
21
+ def have(cmd):
22
+ return shutil.which(cmd) is not None
23
+
24
+ def bootstrap():
25
+ if not have("rustup") or not have("cargo"):
26
+ raise RuntimeError("Rust/rustup/cargo are required")
27
+ installed = subprocess.check_output(["rustup", "target", "list", "--installed"], text=True)
28
+ if "wasm32-unknown-unknown" not in installed.splitlines():
29
+ run(["rustup", "target", "add", "wasm32-unknown-unknown"])
30
+ if not have("worker-build"):
31
+ run(["cargo", "install", "worker-build", "--version", WORKER_BUILD_VERSION, "--locked"])
32
+
33
+ def build():
34
+ run(["cargo", "fmt", "--manifest-path", MANIFEST, "--", "--check"])
35
+ run(["cargo", "test", "--manifest-path", MANIFEST])
36
+ run(["cargo", "build", "--release", "--manifest-path", MANIFEST])
37
+
38
+ def install(dest: Path):
39
+ if not BINARY.exists():
40
+ build()
41
+ dest.mkdir(parents=True, exist_ok=True)
42
+ target = dest / "agentsam-rapid-rust-native"
43
+ tmp = dest / ".agentsam-rapid-rust-native.tmp"
44
+ shutil.copy2(BINARY, tmp)
45
+ tmp.chmod(0o755)
46
+ os.replace(tmp, target)
47
+ print("installed:", target)
48
+ return target
49
+
50
+ def smoke(binary: Path):
51
+ bootstrap()
52
+ with tempfile.TemporaryDirectory(prefix="agentsam-rapid-rust-") as td:
53
+ root = Path(td)
54
+ for template in TEMPLATES:
55
+ name = "fixture-" + template
56
+ run([binary, "new", name, "--template", template, "--out", root])
57
+ project = root / name
58
+ run([binary, "check", "--cwd", project])
59
+
60
+ def main():
61
+ ap=argparse.ArgumentParser(description=__doc__)
62
+ ap.add_argument("--bootstrap", action="store_true")
63
+ ap.add_argument("--build", action="store_true")
64
+ ap.add_argument("--install", action="store_true")
65
+ ap.add_argument("--install-dir", type=Path, default=Path.home()/".agentsam"/"bin")
66
+ ap.add_argument("--smoke", action="store_true")
67
+ ap.add_argument("--json", action="store_true")
68
+ args=ap.parse_args()
69
+ if not any((args.bootstrap,args.build,args.install,args.smoke)):
70
+ args.build=True
71
+ if args.bootstrap: bootstrap()
72
+ if args.build or args.install or args.smoke: build()
73
+ installed=None
74
+ if args.install: installed=install(args.install_dir.expanduser())
75
+ if args.smoke: smoke(installed or BINARY)
76
+ result={"ok":True,"binary":str(BINARY),"installed":str(installed) if installed else None,"smoke":args.smoke}
77
+ if args.json: print(json.dumps(result,indent=2))
78
+ return 0
79
+
80
+ if __name__ == '__main__':
81
+ try: raise SystemExit(main())
82
+ except (RuntimeError, subprocess.CalledProcessError) as exc:
83
+ print("ERROR:", exc, file=sys.stderr); raise SystemExit(2)
@@ -0,0 +1,6 @@
1
+ export {
2
+ intakeLocalPath,
3
+ extractAttachmentPathsFromText,
4
+ validateAttachmentModalities,
5
+ formatAttachmentChip,
6
+ } from './intake.js';
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Portable multimodal attachment intake (CLI + Local Studio).
3
+ * Authority: AgentAttachment references — never base64 in AgentInput.
4
+ */
5
+ import crypto from 'node:crypto';
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import os from 'node:os';
9
+ import { createRequire } from 'node:module';
10
+
11
+ const require = createRequire(import.meta.url);
12
+
13
+ const IMAGE_EXT = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif', '.avif', '.heic', '.heif', '.svg']);
14
+
15
+ function trySharp() {
16
+ try {
17
+ return require('sharp');
18
+ } catch {
19
+ return null;
20
+ }
21
+ }
22
+
23
+ function sha256Buffer(buf) {
24
+ return `sha256:${crypto.createHash('sha256').update(buf).digest('hex')}`;
25
+ }
26
+
27
+ function sniffMime(buf, filePath = '') {
28
+ if (buf?.length >= 8 && buf[0] === 0x89 && buf[1] === 0x50) return 'image/png';
29
+ if (buf?.length >= 3 && buf[0] === 0xff && buf[1] === 0xd8 && buf[2] === 0xff) return 'image/jpeg';
30
+ if (buf?.length >= 12 && buf.toString('ascii', 0, 4) === 'RIFF' && buf.toString('ascii', 8, 12) === 'WEBP') {
31
+ return 'image/webp';
32
+ }
33
+ if (buf?.length >= 12 && buf.toString('ascii', 4, 8) === 'ftyp') return 'image/avif';
34
+ const ext = path.extname(filePath).toLowerCase();
35
+ if (ext === '.svg' || (buf && /<svg[\s>]/i.test(buf.toString('utf8', 0, 256)))) return 'image/svg+xml';
36
+ if (ext === '.gif') return 'image/gif';
37
+ if (ext === '.png') return 'image/png';
38
+ if (ext === '.jpg' || ext === '.jpeg') return 'image/jpeg';
39
+ if (ext === '.webp') return 'image/webp';
40
+ return 'application/octet-stream';
41
+ }
42
+
43
+ function kindFromMime(mime) {
44
+ if (String(mime).startsWith('image/')) return 'image';
45
+ if (String(mime).startsWith('audio/')) return 'audio';
46
+ if (String(mime).startsWith('video/')) return 'video';
47
+ if (String(mime).startsWith('text/')) return 'text';
48
+ return 'binary';
49
+ }
50
+
51
+ function nextTokenLabel(index) {
52
+ return `[Image #${index}]`;
53
+ }
54
+
55
+ /**
56
+ * Intake a local filesystem path into a structured AgentAttachment.
57
+ * Local-first: no Cloudflare required.
58
+ */
59
+ export async function intakeLocalPath(filePath, {
60
+ lifetime = 'ephemeral',
61
+ workDir = path.join(os.tmpdir(), 'agentsam-attachments'),
62
+ maxPixels = 40_000_000,
63
+ inferenceLongEdge = 2048,
64
+ index = 1,
65
+ } = {}) {
66
+ const abs = path.resolve(String(filePath).replace(/^@/, '').replace(/^['"]|['"]$/g, ''));
67
+ if (!fs.existsSync(abs)) {
68
+ const err = new Error(`attachment_missing:${abs}`);
69
+ err.code = 'attachment_missing';
70
+ throw err;
71
+ }
72
+ const buf = fs.readFileSync(abs);
73
+ const mimeType = sniffMime(buf, abs);
74
+ const kind = kindFromMime(mimeType);
75
+ const id = `att_${crypto.randomBytes(8).toString('hex')}`;
76
+ const sha256 = sha256Buffer(buf);
77
+ const name = path.basename(abs);
78
+
79
+ /** @type {import('../../agentsam-contracts/src/artifacts.ts').AgentAttachment} */
80
+ const attachment = {
81
+ id,
82
+ name,
83
+ mimeType,
84
+ size: buf.length,
85
+ kind,
86
+ source: { type: 'local_path', path: abs },
87
+ sha256,
88
+ lifetime,
89
+ metadata: {
90
+ token: kind === 'image' ? nextTokenLabel(index) : `[File #${index}]`,
91
+ },
92
+ };
93
+
94
+ if (kind === 'image' && mimeType !== 'image/svg+xml') {
95
+ const sharp = trySharp();
96
+ if (sharp) {
97
+ const meta = await sharp(buf, { failOn: 'none' }).metadata();
98
+ const width = meta.width || 0;
99
+ const height = meta.height || 0;
100
+ if (width * height > maxPixels) {
101
+ const err = new Error(`attachment_pixel_guard:${width}x${height}`);
102
+ err.code = 'attachment_pixel_guard';
103
+ throw err;
104
+ }
105
+ attachment.image = {
106
+ width,
107
+ height,
108
+ alpha: Boolean(meta.hasAlpha),
109
+ orientation: meta.orientation,
110
+ };
111
+
112
+ // Inference derivative — preserve original path as source
113
+ fs.mkdirSync(workDir, { recursive: true });
114
+ const inferPath = path.join(workDir, `${id}-inference.png`);
115
+ let pipeline = sharp(buf, { failOn: 'none' }).rotate();
116
+ const longEdge = Math.max(width, height);
117
+ if (longEdge > inferenceLongEdge) {
118
+ pipeline = pipeline.resize({
119
+ width: width >= height ? inferenceLongEdge : undefined,
120
+ height: height > width ? inferenceLongEdge : undefined,
121
+ fit: 'inside',
122
+ withoutEnlargement: true,
123
+ });
124
+ }
125
+ // Flatten transparent marks onto neutral for vision (keep original intact)
126
+ if (meta.hasAlpha) {
127
+ pipeline = pipeline.flatten({ background: { r: 32, g: 36, b: 44 } });
128
+ }
129
+ await pipeline.png().toFile(inferPath);
130
+ const inferStat = fs.statSync(inferPath);
131
+ const inferMeta = await sharp(inferPath).metadata();
132
+ attachment.inference = {
133
+ mimeType: 'image/png',
134
+ source: { type: 'local_path', path: inferPath },
135
+ width: inferMeta.width,
136
+ height: inferMeta.height,
137
+ bytes: inferStat.size,
138
+ };
139
+ attachment.preview = { localPath: inferPath };
140
+ } else {
141
+ attachment.metadata.capability_warning = {
142
+ status: 'blocked',
143
+ reason: 'capability_missing',
144
+ capability_id: 'image.raster.transform',
145
+ acceptable_backends: ['sharp', 'imagemagick'],
146
+ };
147
+ }
148
+ }
149
+
150
+ return attachment;
151
+ }
152
+
153
+ /**
154
+ * Parse CLI tokens for @path / absolute image paths dropped into the prompt.
155
+ * Returns { text, attachmentPaths }.
156
+ */
157
+ export function extractAttachmentPathsFromText(text = '') {
158
+ const paths = [];
159
+ let cleaned = String(text || '');
160
+ // @./file or @/abs or @~/rel
161
+ cleaned = cleaned.replace(/(^|\s)@([^\s]+)/g, (full, lead, p) => {
162
+ const candidate = p.replace(/^['"]|['"]$/g, '');
163
+ const expanded = candidate.startsWith('~/')
164
+ ? path.join(os.homedir(), candidate.slice(2))
165
+ : path.resolve(candidate);
166
+ if (fs.existsSync(expanded) && IMAGE_EXT.has(path.extname(expanded).toLowerCase())) {
167
+ paths.push(expanded);
168
+ return `${lead}`;
169
+ }
170
+ return full;
171
+ });
172
+ // bare absolute/relative image path as sole token
173
+ cleaned = cleaned.replace(/(^|\s)(\/?[^\s]+\.(?:png|jpe?g|webp|gif|avif|heic|svg))\b/gi, (full, lead, p) => {
174
+ const expanded = p.startsWith('~/')
175
+ ? path.join(os.homedir(), p.slice(2))
176
+ : path.isAbsolute(p)
177
+ ? p
178
+ : path.resolve(p);
179
+ if (fs.existsSync(expanded)) {
180
+ paths.push(expanded);
181
+ return lead;
182
+ }
183
+ return full;
184
+ });
185
+ return {
186
+ text: cleaned.replace(/\s+/g, ' ').trim(),
187
+ attachmentPaths: [...new Set(paths)],
188
+ };
189
+ }
190
+
191
+ /**
192
+ * Validate selected model modalities against attachments.
193
+ * Fail closed — never silently swap models.
194
+ */
195
+ export function validateAttachmentModalities({ attachments = [], model = {} } = {}) {
196
+ const modalities = new Set(model.input_modalities || model.inputModalities || ['text']);
197
+ const accepted = new Set(
198
+ model.attachment_policy?.accepted_mime_types
199
+ || model.acceptedMimeTypes
200
+ || (modalities.has('image') ? ['image/png', 'image/jpeg', 'image/webp', 'image/gif'] : []),
201
+ );
202
+ const images = attachments.filter((a) => a.kind === 'image' || String(a.mimeType || '').startsWith('image/'));
203
+ if (!images.length) return { ok: true, images: [] };
204
+ if (!modalities.has('image')) {
205
+ return {
206
+ ok: false,
207
+ code: 'model_rejects_image',
208
+ message: `${model.id || model.name || 'Selected model'} does not accept image input.`,
209
+ images,
210
+ };
211
+ }
212
+ for (const img of images) {
213
+ const mime = String(img.inference?.mimeType || img.mimeType || '');
214
+ if (accepted.size && mime && !accepted.has(mime) && !accepted.has(img.mimeType)) {
215
+ return {
216
+ ok: false,
217
+ code: 'mime_not_accepted',
218
+ message: `${model.id || 'Model'} does not accept ${mime || img.mimeType}.`,
219
+ images,
220
+ };
221
+ }
222
+ }
223
+ return { ok: true, images };
224
+ }
225
+
226
+ export function formatAttachmentChip(attachment) {
227
+ const token = attachment.metadata?.token || attachment.name;
228
+ const dims = attachment.image
229
+ ? `${attachment.image.width}×${attachment.image.height}`
230
+ : '—';
231
+ const kb = attachment.size < 1024
232
+ ? `${attachment.size} B`
233
+ : `${(attachment.size / 1024).toFixed(attachment.size >= 10240 ? 0 : 1)} KB`;
234
+ return `${token} ${attachment.mimeType || 'unknown'} · ${dims} · ${kb}`;
235
+ }
@@ -4,7 +4,7 @@ import { execFile } from 'node:child_process';
4
4
  import { promisify } from 'node:util';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { createHash } from 'node:crypto';
7
- import { resolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
7
+ import { tryResolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
8
8
  import { getRepositoryId, tryReadProjectConfig } from '../lib/project-config.js';
9
9
  import { buildMerkleTree } from '../../packages/agentsam-repository/src/merkle/index.js';
10
10
  import { gitIgnoredPaths } from '../../packages/agentsam-repository/src/merkle/git-ignore.js';
@@ -111,7 +111,23 @@ export async function repositorySnapshot({ cwd = process.cwd(), churnDays = 30 }
111
111
  if (!Number.isInteger(churnDays) || churnDays < 1 || churnDays > 3650) {
112
112
  throw new RangeError('churnDays must be an integer from 1..3650');
113
113
  }
114
- const git = resolveGitContext({ cwd });
114
+ const requestedRoot = path.resolve(cwd);
115
+ if (!fs.existsSync(requestedRoot) || !fs.statSync(requestedRoot).isDirectory()) {
116
+ throw new Error(`repository_root_not_found:${requestedRoot}`);
117
+ }
118
+ const resolvedGit = tryResolveGitContext({ cwd: requestedRoot });
119
+ const git = resolvedGit || {
120
+ root: requestedRoot,
121
+ remoteUrl: '',
122
+ remoteHost: null,
123
+ repoFullName: null,
124
+ owner: null,
125
+ repo: null,
126
+ revisionSha: null,
127
+ branch: null,
128
+ detached: false,
129
+ dirty: null,
130
+ };
115
131
  const root = git.root;
116
132
  const ignored = await gitIgnoredPaths(root);
117
133
  const projectConfig = tryReadProjectConfig(root);
@@ -137,6 +153,7 @@ export async function repositorySnapshot({ cwd = process.cwd(), churnDays = 30 }
137
153
  repository: {
138
154
  repository_id: repositoryId,
139
155
  identity_source: projectRepositoryId ? 'project-config' : knowledge.repository_id ? 'knowledge-config' : portableRepositoryId ? 'git-remote' : 'unresolved',
156
+ source_kind: resolvedGit ? 'git' : 'filesystem',
140
157
  provider,
141
158
  full_name: git.repoFullName,
142
159
  remote_url: git.remoteUrl || null,