@inneranimalmedia/agentsam-sdk 2.6.3 → 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 (608) hide show
  1. package/AGENTSAM.md +17 -0
  2. package/README.md +31 -10
  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 +16 -1
  57. package/bin/agentsam-rapid-rust +36 -0
  58. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  59. package/docs/BRAND_INTELLIGENCE.md +1 -1
  60. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  61. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  62. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  63. package/docs/architecture/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
  64. package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
  65. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  66. package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  67. package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
  68. package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
  69. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +36 -0
  70. package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
  71. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  72. package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
  73. package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
  74. package/docs/architecture/SAM_KERNEL.md +181 -0
  75. package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
  76. package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
  77. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  78. package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
  79. package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  80. package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -0
  81. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  82. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  83. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  84. package/docs/contracts/capability-install-planner.md +67 -0
  85. package/docs/contracts/environment-vocabulary.md +195 -0
  86. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  87. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  88. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  89. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  90. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  91. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  92. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  93. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  94. package/docs/plugins.md +2 -2
  95. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  96. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  97. package/docs/product/README.md +8 -0
  98. package/docs/rapid-rust-wasm.md +35 -0
  99. package/migrations/d1/0010_portable_tickets_memory.sql +140 -0
  100. package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
  101. package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
  102. package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
  103. package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
  104. package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
  105. package/migrations/d1/0013_identity_oauth_states.sql +15 -0
  106. package/migrations/d1/0014_auth_event_log.sql +20 -0
  107. package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
  108. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  109. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
  110. package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
  111. package/package.json +88 -14
  112. package/packages/agentsam-brand/README.md +106 -11
  113. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  114. package/packages/agentsam-brand/package.json +39 -7
  115. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  116. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  117. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  118. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  119. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  120. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  121. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  122. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  123. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  124. package/packages/agentsam-brand/src/core/errors.js +12 -0
  125. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  126. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  127. package/packages/agentsam-brand/src/core/keys.js +83 -0
  128. package/packages/agentsam-brand/src/core/naming.js +142 -0
  129. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  130. package/packages/agentsam-brand/src/core/pack.js +305 -0
  131. package/packages/agentsam-brand/src/core/plan.js +276 -0
  132. package/packages/agentsam-brand/src/core/preview.js +159 -0
  133. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  134. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  135. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  136. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  137. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  138. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  139. package/packages/agentsam-brand/src/core/promote.js +288 -0
  140. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  141. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  142. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  143. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  144. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  145. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  146. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  147. package/packages/agentsam-brand/src/index.js +193 -36
  148. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  149. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  150. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  151. package/packages/agentsam-brand/src/presets/index.js +40 -0
  152. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  153. package/packages/agentsam-brand/src/presets/model.json +8 -0
  154. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  155. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  156. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  157. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  158. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  159. package/packages/agentsam-contracts/src/errors.ts +16 -0
  160. package/packages/agentsam-errors/src/envelope.js +53 -0
  161. package/packages/agentsam-errors/src/index.js +1 -0
  162. package/packages/agentsam-errors/src/recovery.js +301 -0
  163. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  164. package/packages/agentsam-knowledge/src/providers/index.js +20 -6
  165. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  166. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  167. package/packages/agentsam-nav/package.json +2 -2
  168. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  169. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  170. package/packages/agentsam-rapid-rust/README.md +5 -0
  171. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  172. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  173. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  174. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  175. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  176. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  177. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  178. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  179. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  180. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  181. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  182. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  183. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  184. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  185. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  186. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  187. package/packages/agentsam-repository/src/index.js +1 -0
  188. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  189. package/packages/agentsam-repository/src/source-types.js +85 -0
  190. package/packages/agentsam-vault/README.md +96 -0
  191. package/packages/agentsam-vault/package.json +32 -0
  192. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  193. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  194. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  195. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  196. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  197. package/packages/agentsam-vault/src/index.d.ts +9 -0
  198. package/packages/agentsam-vault/src/index.js +27 -0
  199. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  200. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  201. package/packages/agentsam-workbench/README.md +24 -0
  202. package/packages/agentsam-workbench/package.json +38 -0
  203. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  204. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  205. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  206. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  207. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  208. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  209. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  210. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  211. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  212. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  213. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  214. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  215. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  216. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  217. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  218. package/packages/agentsam-workbench/src/index.ts +6 -0
  219. package/packages/agentsam-workbench/src/project-control.css +160 -0
  220. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  221. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  222. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  223. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  224. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  225. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  226. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  227. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  228. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  229. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  230. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  231. package/packages/agentsam-workbench/tsconfig.json +13 -0
  232. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  233. package/packages/connectors/cloudflare/package.json +3 -1
  234. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  235. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  236. package/packages/connectors/cloudflare/src/credential.js +318 -0
  237. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  238. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  239. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  240. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  241. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  242. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  243. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  244. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  245. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  246. package/packages/connectors/cloudflare/src/index.js +102 -265
  247. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  248. package/packages/connectors/cloudflare/src/owner.js +42 -12
  249. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  250. package/packages/connectors/cloudflare/src/routes.js +318 -144
  251. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  252. package/packages/connectors/cloudflare/src/vault.js +2 -2
  253. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  254. package/packages/connectors/cloudflare/tests/connector.test.mjs +51 -30
  255. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  256. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  257. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  258. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  259. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +31 -2
  260. package/packages/identity/README.md +1 -1
  261. package/packages/identity/backend/README.md +1 -1
  262. package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
  263. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +32 -0
  264. package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
  265. package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
  266. package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
  267. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  268. package/packages/identity/package.json +3 -2
  269. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  270. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  271. package/packages/identity/src/adapters/cloudflare-d1/index.js +153 -24
  272. package/packages/identity/src/adapters/sqlite/index.js +322 -0
  273. package/packages/identity/src/app/verify-app.js +95 -0
  274. package/packages/identity/src/contracts/auth-config.js +28 -8
  275. package/packages/identity/src/contracts/external-identity.js +1 -1
  276. package/packages/identity/src/contracts/identity-store.js +115 -0
  277. package/packages/identity/src/contracts/provider.js +1 -0
  278. package/packages/identity/src/contracts/route-ids.js +30 -0
  279. package/packages/identity/src/contracts/route-projection.js +218 -0
  280. package/packages/identity/src/contracts/routes.js +11 -0
  281. package/packages/identity/src/core/browser-paths.js +4 -5
  282. package/packages/identity/src/core/constants.js +13 -8
  283. package/packages/identity/src/core/session-policy.js +32 -0
  284. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  285. package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -15
  286. package/packages/identity/src/frontend/auth-portal/pages/reset.html +9 -8
  287. package/packages/identity/src/frontend/auth-portal/pages/signup.html +9 -8
  288. package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
  289. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  290. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  291. package/packages/identity/src/index.js +41 -0
  292. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  293. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  294. package/packages/identity/src/migrations/README.md +5 -2
  295. package/packages/identity/src/oauth/README.md +19 -8
  296. package/packages/identity/src/oauth/consent-view.js +388 -0
  297. package/packages/identity/src/oauth/credentials.js +46 -19
  298. package/packages/identity/src/oauth/finalize-inbound.js +1 -1
  299. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  300. package/packages/identity/src/oauth/iam-platform.js +8 -7
  301. package/packages/identity/src/oauth/redirect-paths.js +27 -36
  302. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  303. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  304. package/packages/identity/src/providers/iam/index.js +27 -5
  305. package/packages/identity/src/server/identity-service.js +61 -15
  306. package/packages/identity/src/server/mount-policy.js +30 -0
  307. package/packages/identity/src/server/post-auth.js +79 -0
  308. package/packages/identity/src/server/worker-router.js +208 -146
  309. package/packages/identity/tests/auth-config.test.mjs +3 -2
  310. package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
  311. package/packages/identity/tests/iam-provider.test.mjs +1 -1
  312. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  313. package/packages/identity/tests/identity-service.test.mjs +52 -5
  314. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  315. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  316. package/packages/identity/tests/oauth-credentials.test.mjs +20 -5
  317. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  318. package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
  319. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  320. package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
  321. package/packages/runtime-protocol/src/index.js +154 -0
  322. package/packages/theme-church-site/package.json +2 -1
  323. package/packages/theme-church-site/src/index.js +1 -0
  324. package/packages/theme-companions-site/package.json +2 -1
  325. package/packages/theme-companions-site/src/index.js +1 -0
  326. package/packages/theme-floors-site/package.json +2 -1
  327. package/packages/theme-floors-site/src/index.js +1 -0
  328. package/packages/theme-fuelnfree-site/package.json +2 -1
  329. package/packages/theme-fuelnfree-site/src/index.js +1 -0
  330. package/packages/theme-handyman-site/package.json +2 -1
  331. package/packages/theme-handyman-site/src/index.js +1 -0
  332. package/packages/theme-insurance-site/package.json +2 -1
  333. package/packages/theme-insurance-site/src/index.js +1 -0
  334. package/packages/theme-scenes/README.md +164 -0
  335. package/packages/theme-scenes/package.json +53 -0
  336. package/packages/theme-scenes/src/blocks/index.js +30 -0
  337. package/packages/theme-scenes/src/contracts/index.js +286 -0
  338. package/packages/theme-scenes/src/demos/index.js +65 -0
  339. package/packages/theme-scenes/src/index.js +75 -0
  340. package/packages/theme-scenes/src/presets/index.js +263 -0
  341. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  342. package/packages/theme-scenes/src/scenes/index.js +146 -0
  343. package/packages/theme-scenes/src/shell/index.js +47 -0
  344. package/packages/theme-scenes/src/themes/index.js +129 -0
  345. package/packages/theme-scenes/src/visuals/index.js +41 -0
  346. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  347. package/packages/theme-shinshu-site/package.json +2 -1
  348. package/packages/theme-shinshu-site/src/index.js +1 -0
  349. package/packages/work-graph/src/index.js +34 -1
  350. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  351. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  352. package/protocol/README.md +15 -7
  353. package/protocol/apps/agentsam.app.v1.schema.json +133 -0
  354. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  355. package/protocol/assets/README.md +9 -0
  356. package/protocol/assets/asset-record.v1.schema.json +64 -0
  357. package/protocol/brand/brandpack.v1.schema.json +43 -0
  358. package/protocol/credentials/issue.v1.schema.json +38 -0
  359. package/protocol/database/connection.v1.schema.json +41 -0
  360. package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
  361. package/protocol/errors/error-envelope.schema.json +135 -1
  362. package/protocol/errors/recovery.v1.schema.json +50 -0
  363. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  364. package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
  365. package/protocol/sam/activity.v1.schema.json +48 -0
  366. package/protocol/sam/answer.v1.schema.json +35 -0
  367. package/protocol/sam/calibration.v1.schema.json +21 -0
  368. package/protocol/sam/decision-receipt.v1.schema.json +29 -0
  369. package/protocol/sam/evaluation.v1.schema.json +19 -0
  370. package/protocol/sam/operation.schema.json +66 -0
  371. package/protocol/sam/outcome.v1.schema.json +36 -0
  372. package/protocol/sam/question.v1.schema.json +26 -0
  373. package/protocol/sam/registry.seed.json +153 -0
  374. package/protocol/sam/result.schema.json +53 -0
  375. package/protocol/sam/state.v1.schema.json +23 -0
  376. package/protocol/scoring/README.md +10 -0
  377. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  378. package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
  379. package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
  380. package/protocol/ui/icon-registry.mjs +227 -0
  381. package/protocol/ui/icon.v1.schema.json +51 -0
  382. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  383. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  384. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  385. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  386. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  387. package/scripts/build_rapid_rust_cli.py +83 -0
  388. package/skills/README.md +22 -9
  389. package/skills/agentsam-codebaseindex/SKILL.md +225 -0
  390. package/skills/catalog.json +14 -0
  391. package/src/attachments/index.js +6 -0
  392. package/src/attachments/intake.js +235 -0
  393. package/src/capabilities/repository-snapshot.js +19 -2
  394. package/src/cli/command-catalog.js +138 -0
  395. package/src/cli/dispatch.js +48 -0
  396. package/src/cli.js +225 -27
  397. package/src/commands/account-auth.js +94 -8
  398. package/src/commands/api-key.js +244 -0
  399. package/src/commands/app.js +365 -29
  400. package/src/commands/billing.js +127 -0
  401. package/src/commands/brand.js +86 -74
  402. package/src/commands/cheat-sheet.js +154 -0
  403. package/src/commands/cloudflare-login.js +222 -0
  404. package/src/commands/cloudflare.js +453 -23
  405. package/src/commands/codebaseindex.js +693 -0
  406. package/src/commands/compute.js +4 -0
  407. package/src/commands/connections.js +11 -5
  408. package/src/commands/credentials.js +116 -0
  409. package/src/commands/env.js +152 -25
  410. package/src/commands/gcloud-auth.js +427 -0
  411. package/src/commands/go.js +366 -53
  412. package/src/commands/google-cloud.js +375 -0
  413. package/src/commands/identity-init.js +2 -2
  414. package/src/commands/interaction-clack.js +115 -0
  415. package/src/commands/mcp.js +226 -33
  416. package/src/commands/models.js +1 -1
  417. package/src/commands/ollama.js +3 -2
  418. package/src/commands/plugins.js +7 -2
  419. package/src/commands/product.js +36 -0
  420. package/src/commands/providers.js +62 -14
  421. package/src/commands/runtime-status.js +28 -9
  422. package/src/commands/runtime.js +313 -0
  423. package/src/commands/rust.js +24 -0
  424. package/src/commands/setup.js +279 -0
  425. package/src/commands/shell.js +59 -5
  426. package/src/commands/skill.js +248 -0
  427. package/src/commands/skills.js +1 -1
  428. package/src/commands/start-local.js +6 -2
  429. package/src/commands/terminal.js +171 -0
  430. package/src/commands/update.js +140 -0
  431. package/src/commands/whoami.js +392 -56
  432. package/src/features/resolve.js +1 -0
  433. package/src/go/build.js +229 -39
  434. package/src/go/cloudflare.js +506 -105
  435. package/src/go/container.js +120 -0
  436. package/src/go/contract.js +9 -4
  437. package/src/go/discover.js +149 -33
  438. package/src/go/index.js +15 -3
  439. package/src/go/native-probe-runner.mjs +119 -0
  440. package/src/go/{registry.js → official-registry.js} +64 -7
  441. package/src/go/official-release.js +10 -0
  442. package/src/go/receipts.js +77 -10
  443. package/src/go/verify.js +9 -2
  444. package/src/index.js +31 -0
  445. package/src/indexing/ingest/discover-models.js +298 -0
  446. package/src/indexing/ingest/inventory.js +478 -0
  447. package/src/indexing/ingest/job-graph.js +181 -0
  448. package/src/indexing/ingest/materials.js +204 -0
  449. package/src/indexing/ingest/style-evidence.js +181 -0
  450. package/src/knowledge/source.js +3 -3
  451. package/src/lib/account-session.js +11 -4
  452. package/src/lib/app-authority.js +172 -0
  453. package/src/lib/auth.js +94 -21
  454. package/src/lib/core-client.js +5 -6
  455. package/src/lib/credentials-audit.js +451 -0
  456. package/src/lib/deploy/health.js +24 -6
  457. package/src/lib/detect-context.js +7 -1
  458. package/src/lib/google-cloud-connection.js +270 -0
  459. package/src/lib/google-cloud-inventory.js +385 -0
  460. package/src/lib/google-desktop-oauth.js +372 -0
  461. package/src/lib/google-studio-brokered-oauth.js +158 -0
  462. package/src/lib/identity-scaffold.js +24 -6
  463. package/src/lib/init-options.js +192 -0
  464. package/src/lib/local-scaffold.js +48 -16
  465. package/src/lib/provider-command-remediation.js +308 -0
  466. package/src/lib/provider-credentials.js +71 -21
  467. package/src/lib/scaffold/index.js +8 -2
  468. package/src/lib/scaffold/mcp-server.js +43 -0
  469. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  470. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  471. package/src/lib/scaffold/wizards/cms.js +93 -0
  472. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  473. package/src/lib/setup/contract.js +26 -0
  474. package/src/lib/setup/discover.js +116 -0
  475. package/src/lib/setup/execute.js +205 -0
  476. package/src/lib/setup/planner.js +134 -0
  477. package/src/lib/setup/recipes.js +235 -0
  478. package/src/lib/setup/runtime-persist.js +197 -0
  479. package/src/lib/setup/runtime.js +394 -0
  480. package/src/lib/slash-commands.js +3 -0
  481. package/src/lib/terminal/machine-identity.js +95 -0
  482. package/src/lib/terminal-local.js +164 -0
  483. package/src/lib/terminal-scopes.js +52 -0
  484. package/src/lib/whoami-capabilities.js +184 -0
  485. package/src/local-fs/capability.js +121 -0
  486. package/src/local-fs/freshness.js +75 -0
  487. package/src/local-fs/index.js +385 -0
  488. package/src/local-fs/paths.js +100 -0
  489. package/src/local-pty/server.js +326 -21
  490. package/src/mcp/authority.js +58 -108
  491. package/src/mcp/client-adapters.js +68 -144
  492. package/src/mcp/client.js +142 -122
  493. package/src/mcp/cloudflare-bundles.js +225 -0
  494. package/src/mcp/index.js +12 -0
  495. package/src/models/ai-access-onboarding.js +112 -0
  496. package/src/models/discovery.js +10 -2
  497. package/src/models/inventory-core.js +9 -1
  498. package/src/plugins/cloudflare.js +1 -1
  499. package/src/providers/ollama-chat.js +2 -1
  500. package/src/sam/activity/index.js +183 -0
  501. package/src/sam/client.js +252 -0
  502. package/src/sam/decision/calibration.js +109 -0
  503. package/src/sam/decision/confidence.js +126 -0
  504. package/src/sam/decision/evaluate.js +157 -0
  505. package/src/sam/decision/evaluators/deterministic.js +341 -0
  506. package/src/sam/decision/evaluators/heuristic.js +61 -0
  507. package/src/sam/decision/evaluators/select.js +50 -0
  508. package/src/sam/decision/evaluators/semantic.js +149 -0
  509. package/src/sam/decision/hierarchical.js +61 -0
  510. package/src/sam/decision/index.js +53 -0
  511. package/src/sam/decision/policy.js +86 -0
  512. package/src/sam/decision/questions.js +120 -0
  513. package/src/sam/decision/receipt.js +148 -0
  514. package/src/sam/decision/state.js +117 -0
  515. package/src/sam/decision/types.js +22 -0
  516. package/src/sam/decision/validate.js +200 -0
  517. package/src/sam/define.js +51 -0
  518. package/src/sam/index.js +65 -0
  519. package/src/sam/operations/brand-scan.js +62 -0
  520. package/src/sam/operations/cad-blender-inspect.js +36 -0
  521. package/src/sam/operations/codebaseindex-ingest.js +49 -0
  522. package/src/sam/operations/decision-evaluate.js +59 -0
  523. package/src/sam/operations/planning-astar.js +77 -0
  524. package/src/sam/operations/planning-goap.js +60 -0
  525. package/src/sam/operations/repository-inspect.js +72 -0
  526. package/src/sam/operations/security-scan.js +33 -0
  527. package/src/sam/operations/terminal-exec.js +29 -0
  528. package/src/sam/planning/astar.js +311 -0
  529. package/src/sam/planning/goap.js +177 -0
  530. package/src/sam/planning/index.js +21 -0
  531. package/src/sam/planning/state.js +84 -0
  532. package/src/sam/registry.js +48 -0
  533. package/src/sam/result.js +77 -0
  534. package/src/sam/seed.js +44 -0
  535. package/src/sam/types.js +116 -0
  536. package/src/security/inventory.js +12 -2
  537. package/src/security/local-vault.js +2 -0
  538. package/src/security/scan.js +1 -1
  539. package/src/skills/catalog.js +64 -0
  540. package/src/skills/content-resolver.js +124 -0
  541. package/src/skills/hosted-store.js +37 -0
  542. package/src/skills/index.js +29 -64
  543. package/src/skills/interaction.js +102 -0
  544. package/src/skills/local-store.js +228 -0
  545. package/src/skills/manifest.js +104 -0
  546. package/src/skills/metrics.js +31 -0
  547. package/src/skills/registry.js +184 -0
  548. package/src/skills/runtime.js +287 -0
  549. package/src/skills/slash.js +44 -0
  550. package/src/ui/cli/help.js +94 -101
  551. package/test/account-session.test.mjs +3 -3
  552. package/test/app-authority-context.test.mjs +32 -0
  553. package/test/cli/api-key-env-whoami.test.mjs +129 -0
  554. package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
  555. package/test/cli/go.test.mjs +62 -5
  556. package/test/cli/mcp-client.test.mjs +21 -10
  557. package/test/cli/runtime-persist.test.mjs +56 -0
  558. package/test/cli/rust-command.test.mjs +21 -0
  559. package/test/cli/skill-npm-and-env.test.mjs +52 -0
  560. package/test/cli/wireframes-go-registry.test.mjs +87 -2
  561. package/test/credentials-audit.test.mjs +113 -0
  562. package/test/deploy-health-scan.test.mjs +29 -1
  563. package/test/gcloud-auth.test.mjs +111 -0
  564. package/test/go/build-source-identity.test.mjs +31 -0
  565. package/test/go/cloudflare-probe.test.mjs +274 -10
  566. package/test/go/distribution.test.mjs +28 -0
  567. package/test/google-cloud-connection.test.mjs +83 -0
  568. package/test/google-cloud-inventory.test.mjs +64 -0
  569. package/test/init-options.test.mjs +35 -0
  570. package/test/integration/ai-access-onboarding.test.mjs +47 -0
  571. package/test/integration/app-command.test.mjs +30 -0
  572. package/test/integration/cad-project.test.mjs +4 -1
  573. package/test/integration/cli-help.test.mjs +1 -1
  574. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  575. package/test/integration/cms-site-tenancy-contract.test.mjs +9 -8
  576. package/test/integration/codebaseindex-ingest.test.mjs +214 -0
  577. package/test/integration/features-resolve.test.mjs +30 -11
  578. package/test/integration/icon-registry.test.mjs +67 -0
  579. package/test/integration/ingest-discover-models.test.mjs +30 -0
  580. package/test/integration/inspect-path-cli.test.mjs +46 -0
  581. package/test/integration/install-script.test.mjs +12 -9
  582. package/test/integration/inventory-evidence.test.mjs +125 -0
  583. package/test/integration/local-fs.test.mjs +113 -0
  584. package/test/integration/provider-env-cli.test.mjs +2 -1
  585. package/test/integration/runtime-status.integration.test.mjs +2 -1
  586. package/test/integration/sam-activity-recovery.test.mjs +147 -0
  587. package/test/integration/sam-decision.test.mjs +584 -0
  588. package/test/integration/sam-kernel.test.mjs +99 -0
  589. package/test/integration/sam-planning-astar.test.mjs +279 -0
  590. package/test/integration/skill-runtime.test.mjs +240 -0
  591. package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
  592. package/test/knowledge.test.mjs +35 -1
  593. package/test/loopback-oauth.test.mjs +53 -0
  594. package/test/models.test.mjs +14 -7
  595. package/test/ollama.test.mjs +22 -0
  596. package/test/security.test.mjs +23 -0
  597. package/test/setup-planner.test.mjs +74 -0
  598. package/test/setup-runtime.test.mjs +51 -0
  599. package/test/shell.test.mjs +4 -4
  600. package/test/terminal/local-pty.mock.test.mjs +3 -1
  601. package/test/terminal-machine-identity.test.mjs +88 -0
  602. package/test/whoami-resume.test.mjs +27 -6
  603. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  604. package/packages/work-graph/prototype/README.md +0 -32
  605. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  606. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  607. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  608. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Interactive Agent Sam setup — discover → plan → approve → execute → verify + receipt.
3
+ */
4
+ import readline from 'node:readline/promises';
5
+ import { stdin as input, stdout as output } from 'node:process';
6
+ import { discoverEnvironment, renderEnvironment } from '../lib/setup/discover.js';
7
+ import { buildSetupPlan, renderSetupPlan } from '../lib/setup/planner.js';
8
+ import {
9
+ collectGooglePermissionInventory,
10
+ executeSetupPlan,
11
+ } from '../lib/setup/execute.js';
12
+ import { listCapabilityRecipes } from '../lib/setup/recipes.js';
13
+ import {
14
+ planRuntimeSetup,
15
+ renderRuntimePlan,
16
+ writeRuntimePlanReceipt,
17
+ writeRuntimeInstallReceipt,
18
+ RUNTIME_PROFILES,
19
+ } from '../lib/setup/runtime.js';
20
+ import { runRuntime } from './runtime.js';
21
+
22
+ function writeLine(write, value = '') {
23
+ write(`${value}\n`);
24
+ }
25
+
26
+ function printHelp(write) {
27
+ writeLine(write, '');
28
+ writeLine(write, ' Agent Sam · setup');
29
+ writeLine(write, '');
30
+ writeLine(write, ' agentsam setup interactive discover + plan');
31
+ writeLine(write, ' agentsam setup --yes approve plan non-interactively');
32
+ writeLine(write, ' agentsam setup --dry-run plan only');
33
+ writeLine(write, ' agentsam setup runtime Discover → profiles → GOAP → receipts');
34
+ writeLine(write, ' agentsam setup runtime --profile my_computer --yes');
35
+ writeLine(write, ' agentsam setup image.vectorize specific capability');
36
+ writeLine(write, ' agentsam setup google.cloud');
37
+ writeLine(write, ' agentsam setup google.cloud --inventory');
38
+ writeLine(write, ' agentsam setup --list');
39
+ writeLine(write, ' agentsam setup --json');
40
+ writeLine(write, '');
41
+ writeLine(write, ' Stages: discover → plan → explain → approve → execute → verify + receipt');
42
+ writeLine(write, ' Native installers: Homebrew / apt / winget / npm — Agent Sam does not replace them.');
43
+ writeLine(write, '');
44
+ }
45
+
46
+ async function confirmProceed(write, { yes = false } = {}) {
47
+ if (yes) return true;
48
+ if (!input.isTTY || !output.isTTY) {
49
+ writeLine(write, ' Non-interactive shell — pass --yes to execute, or --dry-run to plan only.');
50
+ return false;
51
+ }
52
+ const rl = readline.createInterface({ input, output });
53
+ try {
54
+ const answer = String(await rl.question(' Proceed? [y/N] ')).trim().toLowerCase();
55
+ return answer === 'y' || answer === 'yes';
56
+ } finally {
57
+ rl.close();
58
+ }
59
+ }
60
+
61
+ async function runSetupRuntime(argv = [], options = {}) {
62
+ const write = options.write || ((s) => process.stdout.write(s));
63
+ const home = options.home;
64
+ const json = argv.includes('--json');
65
+ const yes = argv.includes('--yes') || argv.includes('-y');
66
+ const dryRun = argv.includes('--dry-run');
67
+ const profileIdx = argv.findIndex((a) => a === '--profile' || a === '-p');
68
+ const profileId =
69
+ profileIdx >= 0 && argv[profileIdx + 1]
70
+ ? argv[profileIdx + 1]
71
+ : argv.find((a) => a.startsWith('--profile='))?.slice('--profile='.length) || null;
72
+
73
+ if (argv.includes('help') || argv.includes('--help') || argv.includes('-h')) {
74
+ writeLine(write, '');
75
+ writeLine(write, ' agentsam setup runtime');
76
+ writeLine(write, ' Profiles:');
77
+ for (const p of RUNTIME_PROFILES) {
78
+ writeLine(write, ` ${p.id.padEnd(18)} ${p.label} — ${p.description}`);
79
+ }
80
+ writeLine(write, '');
81
+ writeLine(write, ' agentsam setup runtime --dry-run');
82
+ writeLine(write, ' agentsam setup runtime --profile my_computer --yes');
83
+ writeLine(write, ' Receipts under ~/.agentsam/runtime/');
84
+ writeLine(write, '');
85
+ return 0;
86
+ }
87
+
88
+ if (argv.includes('--list')) {
89
+ if (json) {
90
+ write(`${JSON.stringify(RUNTIME_PROFILES, null, 2)}\n`);
91
+ } else {
92
+ writeLine(write, '');
93
+ writeLine(write, ' Runtime profiles');
94
+ for (const p of RUNTIME_PROFILES) {
95
+ writeLine(write, ` ${p.id.padEnd(18)} ${p.label} — ${p.description}`);
96
+ }
97
+ writeLine(write, '');
98
+ }
99
+ return 0;
100
+ }
101
+
102
+ const plan = await planRuntimeSetup({ home, profileId });
103
+ const planPath = writeRuntimePlanReceipt(plan, home);
104
+ write(renderRuntimePlan(plan));
105
+
106
+ if (json && (dryRun || !yes)) {
107
+ write(JSON.stringify({ plan, plan_receipt: planPath, executed: false }, null, 2) + '\n');
108
+ return plan.recommended?.eligible ? 0 : 2;
109
+ }
110
+
111
+ if (dryRun || !yes) {
112
+ writeLine(write, ` Plan receipt ${planPath}`);
113
+ if (!yes) {
114
+ writeLine(write, ' Pass --yes to install agentsamd (when profile needs it) and write install receipt.');
115
+ }
116
+ writeLine(write, '');
117
+ return 0;
118
+ }
119
+
120
+ const recommended = plan.recommended;
121
+ if (!recommended?.eligible) {
122
+ writeLine(write, ' ✕ No eligible profile — resolve missing tools/capabilities first.');
123
+ writeLine(write, '');
124
+ return 2;
125
+ }
126
+
127
+ let installResult = null;
128
+ if (recommended.target.runtime_adapter === 'agentsamd') {
129
+ const code = await runRuntime(['install', '--yes'], { write, home });
130
+ installResult = { code, adapter: 'agentsamd' };
131
+ if (code !== 0) return code;
132
+ }
133
+
134
+ const receiptPath = writeRuntimeInstallReceipt({
135
+ product: 'agentsam-setup-runtime',
136
+ profile_id: recommended.profile.id,
137
+ target: recommended.target,
138
+ goap: recommended.goap,
139
+ install: installResult,
140
+ plan_receipt: planPath,
141
+ }, home);
142
+
143
+ writeLine(write, ` ✓ Runtime setup receipt ${receiptPath}`);
144
+ writeLine(write, '');
145
+ if (json) {
146
+ write(JSON.stringify({
147
+ plan,
148
+ plan_receipt: planPath,
149
+ install_receipt: receiptPath,
150
+ executed: true,
151
+ }, null, 2) + '\n');
152
+ }
153
+ return 0;
154
+ }
155
+
156
+ export async function runSetup(argv = [], options = {}) {
157
+ const write = options.write || ((s) => process.stdout.write(s));
158
+ const env = options.env || process.env;
159
+ const json = argv.includes('--json');
160
+ const yes = argv.includes('--yes') || argv.includes('-y');
161
+ const dryRun = argv.includes('--dry-run');
162
+ const inventory = argv.includes('--inventory');
163
+ const args = argv.filter(
164
+ (a) => !['--json', '--yes', '-y', '--dry-run', '--inventory', '--list', 'help', '--help', '-h', '--profile', '-p'].includes(a)
165
+ && !String(a).startsWith('--profile='),
166
+ );
167
+
168
+ if (argv.includes('help') || argv.includes('--help') || argv.includes('-h')) {
169
+ printHelp(write);
170
+ return 0;
171
+ }
172
+
173
+ if (args[0] === 'runtime') {
174
+ return runSetupRuntime(argv.filter((a) => a !== 'runtime'), options);
175
+ }
176
+
177
+ if (argv.includes('--list')) {
178
+ const recipes = listCapabilityRecipes();
179
+ if (json) {
180
+ write(JSON.stringify(recipes.map((r) => ({
181
+ id: r.id,
182
+ displayName: r.displayName,
183
+ description: r.description,
184
+ risk: r.risk,
185
+ })), null, 2) + '\n');
186
+ } else {
187
+ writeLine(write, '');
188
+ writeLine(write, ' Installable capabilities');
189
+ for (const r of recipes) {
190
+ writeLine(write, ` ${r.id.padEnd(22)} ${r.displayName}`);
191
+ }
192
+ writeLine(write, '');
193
+ }
194
+ return 0;
195
+ }
196
+
197
+ if (args[0] === 'google.cloud' && inventory) {
198
+ const inv = await collectGooglePermissionInventory({ env });
199
+ if (json) write(JSON.stringify(inv, null, 2) + '\n');
200
+ else {
201
+ writeLine(write, '');
202
+ writeLine(write, ' Agent Sam · Google Cloud permission inventory');
203
+ writeLine(write, '');
204
+ const active = inv.config?.core?.account || '(unset)';
205
+ const project = inv.config?.core?.project || '(unset)';
206
+ writeLine(write, ` active account ${active}`);
207
+ writeLine(write, ` project ${project}`);
208
+ writeLine(write, ` auth accounts ${(inv.auth_list || []).length}`);
209
+ const scopes = String(inv.user_token_scopes?.scope || '').split(/\s+/).filter(Boolean);
210
+ writeLine(write, ` token scopes ${scopes.length ? scopes.length : 'unknown'}`);
211
+ for (const s of scopes.slice(0, 12)) writeLine(write, ` • ${s}`);
212
+ const roles = inv.iam_roles_for_active_user?.roles || [];
213
+ writeLine(write, ` IAM roles ${roles.length ? roles.join(', ') : '—'}`);
214
+ writeLine(write, ` projects visible ${(inv.projects || []).length}`);
215
+ writeLine(write, ` billing accts ${(inv.billing_accounts || []).length}`);
216
+ if (inv.errors?.length) {
217
+ writeLine(write, '');
218
+ writeLine(write, ' Errors');
219
+ for (const e of inv.errors) writeLine(write, ` ✕ ${e}`);
220
+ }
221
+ writeLine(write, '');
222
+ writeLine(write, ' Next');
223
+ writeLine(write, ' agentsam gcloud auth login');
224
+ writeLine(write, ' agentsam google-cloud connection set --identity EMAIL --project PROJECT');
225
+ writeLine(write, ' agentsam google-cloud doctor');
226
+ writeLine(write, '');
227
+ }
228
+ return inv.errors?.length ? 2 : 0;
229
+ }
230
+
231
+ const capabilityIds = args.length ? args : listCapabilityRecipes().map((r) => r.id);
232
+ const environment = await discoverEnvironment({ env });
233
+ const plan = await buildSetupPlan({ environment, capabilityIds });
234
+
235
+ if (json && dryRun) {
236
+ write(JSON.stringify({ environment, plan }, null, 2) + '\n');
237
+ return 0;
238
+ }
239
+
240
+ write(renderEnvironment(environment));
241
+ write(renderSetupPlan(plan));
242
+
243
+ if (dryRun || !plan.would_install.length) {
244
+ if (!plan.would_install.length) {
245
+ writeLine(write, ' ✓ setup complete — requested capabilities already satisfied');
246
+ writeLine(write, ' Next: agentsam doctor · agentsam capabilities · agentsam google-cloud doctor');
247
+ writeLine(write, '');
248
+ }
249
+ if (json) write(JSON.stringify({ environment, plan, executed: false }, null, 2) + '\n');
250
+ return 0;
251
+ }
252
+
253
+ const approved = await confirmProceed(write, { yes });
254
+ if (!approved) {
255
+ writeLine(write, ' Cancelled. Re-run with --yes to install, or --dry-run to plan only.');
256
+ writeLine(write, '');
257
+ return 1;
258
+ }
259
+
260
+ const receipt = await executeSetupPlan(plan, { env, write, home: options.home });
261
+ writeLine(write, '');
262
+ writeLine(write, receipt.ok ? ' ✓ Agent Sam setup complete' : ' ✕ Setup finished with failures');
263
+ writeLine(write, ` Receipt ${receipt.path}`);
264
+ writeLine(write, '');
265
+ writeLine(write, ' Next');
266
+ writeLine(write, ' agentsam doctor');
267
+ writeLine(write, ' agentsam capabilities');
268
+ if (capabilityIds.includes('google.cloud')) {
269
+ writeLine(write, ' agentsam setup google.cloud --inventory');
270
+ writeLine(write, ' agentsam gcloud auth login');
271
+ }
272
+ if (capabilityIds.includes('image.vectorize')) {
273
+ writeLine(write, ' agentsam image optimize ./logo.png # when image command ships');
274
+ }
275
+ writeLine(write, '');
276
+
277
+ if (json) write(JSON.stringify({ environment, plan, receipt }, null, 2) + '\n');
278
+ return receipt.ok ? 0 : 2;
279
+ }
@@ -20,7 +20,7 @@ import { createInlineActivity } from '../ui/cli/activity.js';
20
20
  import { createCliRuntimePresenter } from '../ui/cli/runtime-events.js';
21
21
  import { renderCliFooter, renderDiffPreview, renderUsagePanel } from '../ui/cli/footer.js';
22
22
  import { diagnosticFromError, renderDiagnosticError } from '../errors/index.js';
23
- import { getModelRecord, mergeModelReference } from '../models/index.js';
23
+ import { getModelRecord, mergeModelReference, listModelCatalog } from '../models/index.js';
24
24
  import { discoverProviderModels } from '../models/discovery.js';
25
25
  import { detectCliProject, findCliProjectRoot, readCliPreferences, updateCliPreferences } from '../lib/cli-preferences.js';
26
26
  import { buildContextEconomicsReport, renderContextEconomics } from './context-economics.js';
@@ -31,6 +31,9 @@ import { createLocalSession, saveLocalSession, localSessionElapsedMs, loadSessio
31
31
  import { runtimeDatabasePath } from '../local/runtime-store.js';
32
32
  import { grantExecutionApproval, isExecutionApproved, toolApprovalKey } from '../lib/execution-approvals.js';
33
33
  import { runWhoami } from './whoami.js';
34
+ import { runCredentials } from './credentials.js';
35
+ import { runCheatSheet } from './cheat-sheet.js';
36
+ import pkg from '../../package.json' with { type: 'json' };
34
37
  import { runLogin, runLogout } from './account-auth.js';
35
38
  import { runHelp } from '../ui/cli/help.js';
36
39
  import { hydrateSecureCredentials } from '../security/local-vault.js';
@@ -40,6 +43,11 @@ import { tryResolveGitContext } from '../../packages/agentsam-repository/src/git
40
43
  import { syncWorkspaceStateToD1, readWorkspaceStateFromD1 } from '../../packages/agentsam-repository/src/workspace-state.js';
41
44
  import { syncGitCommitsToD1 } from '../../packages/agentsam-repository/src/work-tracking.js';
42
45
  import { readGoapState, listGoapTickets, createGoapGoal, switchGoapGoal, closeGoapGoal, renderGoapStatus, renderGoapList, renderGoapGoal, renderGoapWhy, renderGoapPlan } from '../../packages/agentsam-repository/src/goap.js';
46
+ import { SkillRegistry, SkillRuntime, SkillContentResolver } from '../skills/index.js';
47
+ import {
48
+ presentAgentSamInteraction,
49
+ handleSkillInteractionChoice,
50
+ } from './interaction-clack.js';
43
51
 
44
52
  function writeLine(write, value = '') { write(`${value}\n`); }
45
53
 
@@ -593,7 +601,7 @@ async function runInteractiveModelTurn(prompt, state) {
593
601
  const provider = createProviderAdapter({
594
602
  modelRecord: model,
595
603
  credential,
596
- endpoint: model.provider === 'ollama' ? process.env.OLLAMA_BASE_URL : undefined,
604
+ endpoint: model.provider === 'ollama' ? (process.env.AGENTSAM_OLLAMA_ENDPOINT || process.env.OLLAMA_BASE_URL || process.env.OLLAMA_HOST) : undefined,
597
605
  fetchImpl: state.providerFetchImpl,
598
606
  });
599
607
  const capabilityAdapter = createCapabilityAdapter();
@@ -784,12 +792,14 @@ export async function dispatchShellLine(line, state = {}) {
784
792
  const commonVerbs = [
785
793
  'help', 'exit', 'quit', 'clear', 'status', 'models', 'model',
786
794
  'whoami', 'cf', 'cloudflare', 'db', 'tunnel', 'connections',
787
- 'connect', 'usage', 'session', 'providers', 'settings', 'logs',
795
+ 'connect', 'usage', 'session', 'providers', 'credentials', 'cheatsheet',
796
+ 'settings', 'logs',
788
797
  'git', 'diff', 'pwd', 'cd', 'fast', 'flex', 'standard', 'reasoning',
789
798
  ];
790
799
  if (commonVerbs.includes(bare)) {
791
- tokens[0] = `/${bare}`;
800
+ tokens[0] = bare === 'cheatsheet' ? '/cheat-sheet' : `/${bare}`;
792
801
  }
802
+ if (bare === 'cheat-sheet') tokens[0] = '/cheat-sheet';
793
803
  }
794
804
 
795
805
  const [command, ...args] = tokens;
@@ -861,6 +871,14 @@ export async function dispatchShellLine(line, state = {}) {
861
871
  state.rl?.resume?.();
862
872
  }
863
873
  break;
874
+ case '/credentials':
875
+ case '/credential':
876
+ await runCredentials(args.length ? args : ['audit'], { write, home: state.home });
877
+ break;
878
+ case '/cheat-sheet':
879
+ case '/cheatsheet':
880
+ runCheatSheet(args, { write, version: pkg.version });
881
+ break;
864
882
  case '/login':
865
883
  await runLogin(args, { write, home: state.home });
866
884
  break;
@@ -1026,8 +1044,44 @@ export async function dispatchShellLine(line, state = {}) {
1026
1044
  await runInteractiveModelTurn(line, state);
1027
1045
  break;
1028
1046
  }
1047
+ {
1048
+ // Explicit slash → portable skill registry (no D1 / R2 / subagents).
1049
+ const skillRuntime = new SkillRuntime({
1050
+ registry: new SkillRegistry({ home: state.home }),
1051
+ contentResolver: new SkillContentResolver(),
1052
+ });
1053
+ const skillResult = await skillRuntime.invoke({ input: line });
1054
+ if (skillResult.matched) {
1055
+ const interactiveStatuses = new Set(['needs_input', 'needs_approval', 'blocked']);
1056
+ if (
1057
+ state.interactive &&
1058
+ interactiveStatuses.has(skillResult.interaction?.status) &&
1059
+ skillResult.interaction?.prompt
1060
+ ) {
1061
+ const choice = await presentAgentSamInteraction(skillResult.interaction, {
1062
+ write,
1063
+ interactive: state.interactive,
1064
+ });
1065
+ if (choice.action === 'create' || String(choice.value || '').startsWith('create')) {
1066
+ await handleSkillInteractionChoice(choice, { write, home: state.home });
1067
+ } else if (choice.action === 'list' || choice.value === 'list') {
1068
+ await handleSkillInteractionChoice(choice, { write, home: state.home });
1069
+ } else if (choice.action === 'install' || choice.value === 'install') {
1070
+ await handleSkillInteractionChoice(choice, { write, home: state.home });
1071
+ }
1072
+ } else if (skillResult.interaction?.prompt?.message) {
1073
+ for (const msgLine of String(skillResult.interaction.prompt.message).split('\n')) {
1074
+ writeLine(write, ` ${msgLine}`);
1075
+ }
1076
+ } else if (skillResult.modelInstructions?.content) {
1077
+ writeLine(write, ` skill ${skillResult.skill?.id} · ${skillResult.receipt?.checksum || 'resolved'}`);
1078
+ writeLine(write, ` (turn instructions ready · ${skillResult.tools?.length || 0} tools declared)`);
1079
+ }
1080
+ break;
1081
+ }
1082
+ }
1029
1083
  writeLine(write, ` Unknown Agent Sam command: ${command}`);
1030
- writeLine(write, ' Type / or /help for available commands.');
1084
+ writeLine(write, ' Type / or /help for available commands. Use /skills for installable slash skills.');
1031
1085
  return { handled: false, exit: false, cwd: state.cwd };
1032
1086
  }
1033
1087
  } catch (error) {
@@ -0,0 +1,248 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+ import {
6
+ SkillRegistry,
7
+ SkillRuntime,
8
+ SkillContentResolver,
9
+ createUserSkill,
10
+ installSkillFromPath,
11
+ aliasSkill,
12
+ removeSkill,
13
+ readLocalRegistry,
14
+ } from '../skills/index.js';
15
+
16
+ function writeLine(write, value = '') {
17
+ write(`${value}\n`);
18
+ }
19
+
20
+ function help() {
21
+ return [
22
+ 'AgentSam · skill',
23
+ ' agentsam skill list',
24
+ ' agentsam skill create <id>',
25
+ ' agentsam skill inspect <id>',
26
+ ' agentsam skill edit <id> (prints path to edit)',
27
+ ' agentsam skill install <path|npm-package> [--alias /trigger]',
28
+ ' agentsam skill alias <id> </trigger>',
29
+ ' agentsam skill remove <id>',
30
+ ' agentsam skill publish <id> (prints package checklist; no network)',
31
+ ' agentsam skill invoke </trigger> [args...]',
32
+ '',
33
+ 'Slash triggers are local. Package manifests only suggest a trigger.',
34
+ 'Collisions require an explicit alias — nothing is globally reserved.',
35
+ '',
36
+ ].join('\n');
37
+ }
38
+
39
+ function looksLikeNpmPackage(source) {
40
+ const s = String(source || '').trim();
41
+ if (!s) return false;
42
+ if (s.startsWith('.') || s.startsWith('/') || s.includes('\\')) return false;
43
+ if (s.startsWith('@')) return true;
44
+ // bare package name (no path separators)
45
+ return !s.includes('/') && !s.endsWith('.json');
46
+ }
47
+
48
+ /**
49
+ * Download an npm package tarball and return the extracted package root
50
+ * that contains agentsam.skill.json (or package root for relative resolve).
51
+ */
52
+ export function resolveNpmSkillPackage(spec, options = {}) {
53
+ const spawn = options.spawnSyncImpl || spawnSync;
54
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-skill-npm-'));
55
+ const pack = spawn('npm', ['pack', spec, '--pack-destination', tmp], {
56
+ encoding: 'utf8',
57
+ cwd: options.cwd || process.cwd(),
58
+ env: options.env || process.env,
59
+ });
60
+ if ((pack.status ?? 1) !== 0) {
61
+ throw new Error(`npm_pack_failed:${spec}:${String(pack.stderr || pack.stdout || '').trim() || 'unknown'}`);
62
+ }
63
+ const tgzName = String(pack.stdout || '')
64
+ .trim()
65
+ .split(/\r?\n/)
66
+ .filter(Boolean)
67
+ .pop();
68
+ if (!tgzName) throw new Error(`npm_pack_empty:${spec}`);
69
+ const tgzPath = path.join(tmp, path.basename(tgzName));
70
+ if (!fs.existsSync(tgzPath)) throw new Error(`npm_pack_missing:${tgzPath}`);
71
+
72
+ const extractDir = path.join(tmp, 'pkg');
73
+ fs.mkdirSync(extractDir, { recursive: true });
74
+ const tar = spawn('tar', ['-xzf', tgzPath, '-C', extractDir], { encoding: 'utf8' });
75
+ if ((tar.status ?? 1) !== 0) {
76
+ throw new Error(`npm_extract_failed:${String(tar.stderr || '').trim() || 'tar failed'}`);
77
+ }
78
+ const packageRoot = path.join(extractDir, 'package');
79
+ const candidates = [
80
+ path.join(packageRoot, 'agentsam.skill.json'),
81
+ path.join(packageRoot, 'skill', 'agentsam.skill.json'),
82
+ path.join(packageRoot, 'skills', 'agentsam.skill.json'),
83
+ ];
84
+ for (const file of candidates) {
85
+ if (fs.existsSync(file)) return path.dirname(file);
86
+ }
87
+ // walk one level
88
+ if (fs.existsSync(packageRoot)) {
89
+ for (const name of fs.readdirSync(packageRoot)) {
90
+ const nested = path.join(packageRoot, name, 'agentsam.skill.json');
91
+ if (fs.existsSync(nested)) return path.dirname(nested);
92
+ }
93
+ }
94
+ throw new Error(`agentsam.skill.json_not_found_in_package:${spec}`);
95
+ }
96
+
97
+ /**
98
+ * @param {string[]} argv
99
+ * @param {{ write?: Function, home?: string, env?: NodeJS.ProcessEnv }} [options]
100
+ */
101
+ export async function runSkill(argv = [], options = {}) {
102
+ const write = options.write || ((t) => process.stdout.write(t));
103
+ const [command = 'list', ...rest] = argv;
104
+
105
+ if (command === '--help' || command === '-h' || command === 'help') {
106
+ write(help());
107
+ return null;
108
+ }
109
+
110
+ const registry = new SkillRegistry({ home: options.home, env: options.env });
111
+ const runtime = new SkillRuntime({
112
+ registry,
113
+ contentResolver: new SkillContentResolver(),
114
+ });
115
+
116
+ if (command === 'list') {
117
+ const rows = registry.list();
118
+ writeLine(write, '');
119
+ writeLine(write, ' AgentSam · skills');
120
+ writeLine(write, '');
121
+ for (const row of rows) {
122
+ const trig = row.trigger ? row.trigger.padEnd(22) : '(no trigger)'.padEnd(22);
123
+ writeLine(write, ` ${trig} ${row.id.padEnd(28)} [${row.source}]`);
124
+ if (row.description) writeLine(write, ` ${row.description}`);
125
+ }
126
+ writeLine(write, '');
127
+ return rows;
128
+ }
129
+
130
+ if (command === 'create') {
131
+ const id = rest[0];
132
+ if (!id) throw new Error('skill create requires <id>');
133
+ const result = createUserSkill(id, { home: options.home, env: options.env });
134
+ writeLine(write, '');
135
+ writeLine(write, ` created ${result.manifest.id}`);
136
+ writeLine(write, ` trigger ${result.trigger}`);
137
+ writeLine(write, ` path ${result.root}`);
138
+ writeLine(write, '');
139
+ return result;
140
+ }
141
+
142
+ if (command === 'inspect') {
143
+ const id = rest[0];
144
+ if (!id) throw new Error('skill inspect requires <id>');
145
+ const skill = registry.getById(id);
146
+ if (!skill) throw new Error(`unknown_skill:${id}`);
147
+ write(`${JSON.stringify(skill, null, 2)}\n`);
148
+ return skill;
149
+ }
150
+
151
+ if (command === 'edit') {
152
+ const id = rest[0];
153
+ if (!id) throw new Error('skill edit requires <id>');
154
+ const local = readLocalRegistry({ home: options.home, env: options.env });
155
+ const entry = local.entries[id];
156
+ if (!entry) throw new Error(`skill_not_user_editable:${id}`);
157
+ writeLine(write, entry.manifestPath);
158
+ writeLine(write, path.join(entry.baseDir, 'SKILL.md'));
159
+ return entry;
160
+ }
161
+
162
+ if (command === 'install') {
163
+ const source = rest[0];
164
+ if (!source) throw new Error('skill install requires <path|npm-package>');
165
+ let aliasOnCollision;
166
+ for (let i = 1; i < rest.length; i += 1) {
167
+ if (rest[i] === '--alias' || rest[i] === '--trigger') aliasOnCollision = rest[++i];
168
+ }
169
+
170
+ let installPath = source;
171
+ if (looksLikeNpmPackage(source)) {
172
+ writeLine(write, ` packing ${source}…`);
173
+ installPath = resolveNpmSkillPackage(source, options);
174
+ }
175
+
176
+ try {
177
+ const result = installSkillFromPath(installPath, {
178
+ home: options.home,
179
+ env: options.env,
180
+ aliasOnCollision,
181
+ });
182
+ writeLine(write, '');
183
+ writeLine(write, ` installed ${result.id}`);
184
+ writeLine(write, ` trigger ${result.trigger}`);
185
+ writeLine(write, '');
186
+ return result;
187
+ } catch (error) {
188
+ if (error?.code === 'SLASH_COLLISION') {
189
+ writeLine(write, '');
190
+ writeLine(write, ` Conflict: ${error.suggested} already owned by ${error.owner}`);
191
+ writeLine(write, ' Choose an alias:');
192
+ for (const c of error.candidates || []) {
193
+ writeLine(write, ` agentsam skill install ${source} --alias ${c}`);
194
+ }
195
+ writeLine(write, '');
196
+ throw error;
197
+ }
198
+ throw error;
199
+ }
200
+ }
201
+
202
+ if (command === 'alias') {
203
+ const id = rest[0];
204
+ const trigger = rest[1];
205
+ if (!id || !trigger) throw new Error('skill alias requires <id> </trigger>');
206
+ const result = aliasSkill(id, trigger, { home: options.home, env: options.env });
207
+ writeLine(write, ` ${result.id} → ${result.trigger}`);
208
+ return result;
209
+ }
210
+
211
+ if (command === 'remove') {
212
+ const id = rest[0];
213
+ if (!id) throw new Error('skill remove requires <id>');
214
+ const result = removeSkill(id, { home: options.home, env: options.env });
215
+ writeLine(write, result.removed ? ` removed ${id}` : ` ${id} was not installed`);
216
+ return result;
217
+ }
218
+
219
+ if (command === 'publish') {
220
+ const id = rest[0];
221
+ if (!id) throw new Error('skill publish requires <id>');
222
+ const skill = registry.getById(id);
223
+ if (!skill) throw new Error(`unknown_skill:${id}`);
224
+ writeLine(write, '');
225
+ writeLine(write, ' Publish checklist (no network from portable core):');
226
+ writeLine(write, ' 1. Ensure agentsam.skill.json validates as agentsam.skill.v1');
227
+ writeLine(write, ' 2. npm publish (suggested slash is not globally reserved)');
228
+ writeLine(write, ' 3. Consumers: agentsam skill install <path|@scope/pkg>');
229
+ writeLine(write, ` skill ${skill.id}`);
230
+ writeLine(write, ` slash ${skill.manifest.slash?.suggested || '(none)'}`);
231
+ writeLine(write, '');
232
+ return { id: skill.id, checklist: true };
233
+ }
234
+
235
+ if (command === 'invoke') {
236
+ const input = rest.join(' ').trim();
237
+ if (!input.startsWith('/')) throw new Error('skill invoke requires a /trigger');
238
+ const result = await runtime.invoke({ input });
239
+ write(`${JSON.stringify(result, null, 2)}\n`);
240
+ return result;
241
+ }
242
+
243
+ throw new Error(`unknown skill command: ${command}`);
244
+ }
245
+
246
+ export function skillCommandHelp() {
247
+ return help();
248
+ }
@@ -1,4 +1,4 @@
1
- import { getSkill, listSkills, loadSkill } from '../skills/index.js';
1
+ import { getSkill, listSkills, loadSkill } from '../skills/catalog.js';
2
2
 
3
3
  function parse(argv = []) {
4
4
  const out = { id: '', json: false, references: false };
@@ -32,8 +32,8 @@ export async function runStartLocal(opts = {}) {
32
32
  const port = opts.port ?? config?.pty_port ?? 3099;
33
33
 
34
34
  console.log(`
35
- Agent Sam — local PTY
36
- No Cloudflare · no tunnel · no IAM login
35
+ Agent Sam — local Studio plane (PTY + FS)
36
+ Loopback only · no tunnel · not ExecOS enroll
37
37
  `);
38
38
  if (!config) {
39
39
  console.log(` ⚠ No .agentsam/config.json found; using current repository/directory as the PTY root.`);
@@ -45,6 +45,9 @@ export async function runStartLocal(opts = {}) {
45
45
  console.log(` ✓ PTY listening ${server.url}`);
46
46
  console.log(` ✓ Health ${server.healthUrl}`);
47
47
  console.log(` ✓ Project root ${server.cwd}`);
48
+ console.log(` ✓ Workspace ${server.workspace_id}`);
49
+ console.log(` ✓ Capability ${server.capability.capability.slice(0, 12)}… (loopback bootstrap)`);
50
+ console.log(` ✓ Runtime file ${server.runtimeFile}`);
48
51
  console.log(` ✓ Shell ${server.shell}`);
49
52
  console.log(`
50
53
  Project services:
@@ -52,6 +55,7 @@ export async function runStartLocal(opts = {}) {
52
55
  npm run db:status → inspect local SQLite
53
56
  npx agentsam → enter Agent Sam
54
57
 
58
+ Studio: open a filesystem workspace rooted at this same directory.
55
59
  Press Ctrl+C to stop.
56
60
  `);
57
61