@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.7

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 (699) hide show
  1. package/AGENTSAM.md +40 -0
  2. package/README.md +15 -9
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +17 -0
  7. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  8. package/apps/client-cms-editor/README.md +100 -0
  9. package/apps/client-cms-editor/agentsam.app.json +74 -0
  10. package/apps/client-cms-editor/backend/README.md +5 -0
  11. package/apps/client-cms-editor/backend/package.json +39 -0
  12. package/apps/client-cms-editor/backend/src/api/client.ts +233 -0
  13. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  14. package/apps/client-cms-editor/backend/src/model.ts +11 -0
  15. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  16. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  17. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  18. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  19. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  20. package/apps/client-cms-editor/backend/tsconfig.json +20 -0
  21. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  22. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  23. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  24. package/apps/client-cms-editor/bin/agentsam-cms.mjs +3 -0
  25. package/apps/client-cms-editor/frontend/index.html +12 -0
  26. package/apps/client-cms-editor/frontend/package.json +42 -0
  27. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +156 -0
  28. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +36 -0
  29. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  30. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  31. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  32. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  33. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  34. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  35. package/apps/client-cms-editor/frontend/src/editor/legacy/CmsEditorPrototype.tsx +1374 -0
  36. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  37. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  38. package/apps/client-cms-editor/frontend/src/index.ts +22 -0
  39. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  40. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  41. package/apps/client-cms-editor/frontend/src/main.tsx +91 -0
  42. package/apps/client-cms-editor/frontend/src/mount.tsx +113 -0
  43. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  44. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  45. package/apps/client-cms-editor/frontend/src/styles/studio.css +158 -0
  46. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  47. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  48. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  49. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  50. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  51. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  52. package/apps/client-cms-editor/frontend/tsconfig.json +36 -0
  53. package/apps/client-cms-editor/frontend/vite.config.ts +25 -0
  54. package/apps/client-cms-editor/package-lock.json +4671 -0
  55. package/apps/client-cms-editor/package.json +135 -0
  56. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  57. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  58. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  59. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  60. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  61. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  62. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  63. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  64. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  65. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  66. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  67. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  68. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  69. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  70. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  71. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  72. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  73. package/apps/client-cms-editor/shared/cms/package.json +31 -0
  74. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  75. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +37 -0
  76. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  77. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +90 -0
  78. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  79. package/apps/client-cms-editor/shared/cms/src/index.ts +9 -0
  80. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  81. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  82. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  83. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  84. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  85. package/bin/agentsam-rapid-rust +36 -0
  86. package/contracts/source-types.v1.json +353 -0
  87. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  88. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  89. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  90. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  91. package/docs/THEME_REFINERY.md +2 -2
  92. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  93. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  94. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +171 -0
  95. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
  96. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  97. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  98. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  99. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  100. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  101. package/docs/contracts/capability-install-planner.md +67 -0
  102. package/docs/contracts/environment-vocabulary.md +195 -0
  103. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  104. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  105. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  106. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  107. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  108. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  109. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  110. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  111. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  112. package/docs/plugins.md +2 -2
  113. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  114. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  115. package/docs/product/README.md +8 -0
  116. package/docs/rapid-rust-wasm.md +35 -0
  117. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  118. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  119. package/native/agentsam-machine/Cargo.lock +426 -0
  120. package/native/agentsam-machine/Cargo.toml +9 -0
  121. package/native/agentsam-machine/cli/Cargo.toml +14 -0
  122. package/native/agentsam-machine/cli/src/main.rs +77 -0
  123. package/native/agentsam-machine/core/Cargo.toml +15 -0
  124. package/native/agentsam-machine/core/src/assets.rs +790 -0
  125. package/native/agentsam-machine/core/src/bound.rs +298 -0
  126. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  127. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  128. package/native/agentsam-machine/core/src/lib.rs +1086 -0
  129. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  130. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  131. package/package.json +110 -21
  132. package/packages/agentsam-brand/README.md +107 -12
  133. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  134. package/packages/agentsam-brand/package.json +41 -9
  135. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  136. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  137. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  138. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  139. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  140. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  141. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  142. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  143. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  144. package/packages/agentsam-brand/src/core/errors.js +12 -0
  145. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  146. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  147. package/packages/agentsam-brand/src/core/keys.js +83 -0
  148. package/packages/agentsam-brand/src/core/naming.js +142 -0
  149. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  150. package/packages/agentsam-brand/src/core/pack.js +305 -0
  151. package/packages/agentsam-brand/src/core/plan.js +276 -0
  152. package/packages/agentsam-brand/src/core/preview.js +159 -0
  153. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  154. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  155. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  156. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  157. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  158. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  159. package/packages/agentsam-brand/src/core/promote.js +288 -0
  160. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  161. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  162. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  163. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  164. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  165. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  166. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  167. package/packages/agentsam-brand/src/index.js +193 -36
  168. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  169. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  170. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  171. package/packages/agentsam-brand/src/presets/index.js +40 -0
  172. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  173. package/packages/agentsam-brand/src/presets/model.json +8 -0
  174. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  175. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  176. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  177. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  178. package/packages/agentsam-contracts/package.json +13 -3
  179. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  180. package/packages/agentsam-contracts/src/tools.ts +22 -0
  181. package/packages/agentsam-errors/package.json +13 -3
  182. package/packages/agentsam-knowledge/package.json +18 -4
  183. package/packages/agentsam-knowledge/src/autorag/index.js +11 -4
  184. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  185. package/packages/agentsam-knowledge/src/providers/index.js +6 -4
  186. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  187. package/packages/agentsam-knowledge/test/autorag.test.mjs +81 -1
  188. package/packages/agentsam-nav/package.json +26 -8
  189. package/packages/agentsam-queue-control/README.md +1 -1
  190. package/packages/agentsam-queue-control/package.json +7 -2
  191. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  192. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  193. package/packages/agentsam-rapid-rust/README.md +5 -0
  194. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  195. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  196. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  197. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  198. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  199. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  200. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  201. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  202. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  203. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  204. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  205. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  206. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  207. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  208. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  209. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  210. package/packages/agentsam-repository/package.json +13 -3
  211. package/packages/agentsam-repository/src/index.js +1 -0
  212. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  213. package/packages/agentsam-repository/src/source-types.js +93 -0
  214. package/packages/agentsam-vault/README.md +96 -0
  215. package/packages/agentsam-vault/package.json +42 -0
  216. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  217. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  218. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  219. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  220. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  221. package/packages/agentsam-vault/src/index.d.ts +9 -0
  222. package/packages/agentsam-vault/src/index.js +27 -0
  223. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  224. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  225. package/packages/agentsam-workbench/README.md +24 -0
  226. package/packages/agentsam-workbench/package.json +49 -0
  227. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  228. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  229. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  230. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  231. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  232. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  233. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  234. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  235. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  236. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  237. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  238. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  239. package/packages/agentsam-workbench/src/agent/index.ts +12 -0
  240. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  241. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  242. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  243. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  244. package/packages/agentsam-workbench/src/index.ts +6 -0
  245. package/packages/agentsam-workbench/src/project-control.css +160 -0
  246. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  247. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  248. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  249. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  250. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  251. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  252. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  253. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  254. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  255. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  256. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  257. package/packages/agentsam-workbench/tsconfig.json +13 -0
  258. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  259. package/packages/connectors/cloudflare/package.json +16 -4
  260. package/packages/connectors/cloudflare/src/api-client.js +280 -0
  261. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  262. package/packages/connectors/cloudflare/src/credential.js +318 -0
  263. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  264. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  265. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  266. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  267. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  268. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  269. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  270. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  271. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  272. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  273. package/packages/connectors/cloudflare/src/index.js +103 -265
  274. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  275. package/packages/connectors/cloudflare/src/owner.js +42 -12
  276. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  277. package/packages/connectors/cloudflare/src/routes.js +309 -144
  278. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  279. package/packages/connectors/cloudflare/src/vault.js +2 -2
  280. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  281. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
  282. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  283. package/packages/heuristic-theme/README.md +2 -2
  284. package/packages/heuristic-theme/package.json +8 -3
  285. package/packages/heuristic-theme/src/registry.js +2 -2
  286. package/packages/heuristic-theme/src/theme.js +1 -1
  287. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  288. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  289. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +44 -4
  290. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  291. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
  292. package/packages/identity/README.md +2 -2
  293. package/packages/identity/backend/README.md +1 -1
  294. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -14
  295. package/packages/identity/migrations/apply-portable.js +109 -0
  296. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  297. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  298. package/packages/identity/package.json +27 -5
  299. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  300. package/packages/identity/scripts/local-identity-bridge.mjs +190 -0
  301. package/packages/identity/scripts/preview-auth-portal.mjs +8 -8
  302. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -372
  303. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  304. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  305. package/packages/identity/src/adapters/portable-store.js +479 -0
  306. package/packages/identity/src/adapters/sqlite/index.js +13 -309
  307. package/packages/identity/src/contracts/auth-config.js +27 -8
  308. package/packages/identity/src/contracts/external-identity.js +1 -1
  309. package/packages/identity/src/contracts/identity-store.js +56 -5
  310. package/packages/identity/src/contracts/provider.js +2 -0
  311. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  312. package/packages/identity/src/core/constants.js +1 -1
  313. package/packages/identity/src/core/session-policy.js +31 -0
  314. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  315. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -6
  316. package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
  317. package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
  318. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  319. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +176 -0
  320. package/packages/identity/src/index.js +44 -1
  321. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  322. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  323. package/packages/identity/src/migrations/README.md +23 -20
  324. package/packages/identity/src/oauth/README.md +10 -5
  325. package/packages/identity/src/oauth/consent-view.js +388 -0
  326. package/packages/identity/src/oauth/credentials.js +39 -20
  327. package/packages/identity/src/oauth/google-desktop-exchange.js +341 -0
  328. package/packages/identity/src/oauth/iam-platform.js +21 -9
  329. package/packages/identity/src/oauth/native-handoff.js +136 -0
  330. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  331. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  332. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  333. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  334. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  335. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  336. package/packages/identity/src/providers/github/oauth.js +1 -2
  337. package/packages/identity/src/providers/github/profile.js +16 -2
  338. package/packages/identity/src/providers/iam/index.js +27 -5
  339. package/packages/identity/src/providers/index.js +11 -3
  340. package/packages/identity/src/server/identity-service.js +33 -3
  341. package/packages/identity/src/server/worker-router.js +171 -88
  342. package/packages/identity/tests/auth-config.test.mjs +3 -2
  343. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  344. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  345. package/packages/identity/tests/identity-init-scaffold.test.mjs +17 -3
  346. package/packages/identity/tests/identity-service.test.mjs +16 -0
  347. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  348. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  349. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  350. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  351. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  352. package/packages/identity/tests/oauth-credentials.test.mjs +21 -8
  353. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  354. package/packages/identity/tests/preview-auth-portal.test.mjs +5 -3
  355. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  356. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  357. package/packages/providers/completeful/package.json +7 -2
  358. package/packages/runtime-protocol/src/index.js +154 -0
  359. package/packages/theme-church-site/package.json +17 -6
  360. package/packages/theme-church-site/src/harvest.json +4 -2
  361. package/packages/theme-church-site/src/index.js +7 -3
  362. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  363. package/packages/theme-companions-site/package.json +17 -6
  364. package/packages/theme-companions-site/src/harvest.json +4 -2
  365. package/packages/theme-companions-site/src/index.js +7 -3
  366. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  367. package/packages/theme-floors-site/package.json +17 -6
  368. package/packages/theme-floors-site/src/harvest.json +4 -2
  369. package/packages/theme-floors-site/src/index.js +7 -3
  370. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  371. package/packages/theme-fuelnfree-site/package.json +17 -6
  372. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  373. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  374. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  375. package/packages/theme-handyman-site/package.json +17 -6
  376. package/packages/theme-handyman-site/src/harvest.json +4 -2
  377. package/packages/theme-handyman-site/src/index.js +7 -3
  378. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  379. package/packages/theme-insurance-site/package.json +17 -6
  380. package/packages/theme-insurance-site/src/harvest.json +4 -2
  381. package/packages/theme-insurance-site/src/index.js +7 -3
  382. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  383. package/packages/theme-scenes/README.md +164 -0
  384. package/packages/theme-scenes/package.json +54 -0
  385. package/packages/theme-scenes/src/blocks/index.js +30 -0
  386. package/packages/theme-scenes/src/contracts/index.js +286 -0
  387. package/packages/theme-scenes/src/demos/index.js +65 -0
  388. package/packages/theme-scenes/src/index.js +75 -0
  389. package/packages/theme-scenes/src/presets/index.js +263 -0
  390. package/packages/theme-scenes/src/registry.js +187 -0
  391. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  392. package/packages/theme-scenes/src/scenes/index.js +146 -0
  393. package/packages/theme-scenes/src/shell/index.js +47 -0
  394. package/packages/theme-scenes/src/themes/index.js +129 -0
  395. package/packages/theme-scenes/src/visuals/index.js +41 -0
  396. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  397. package/packages/theme-shinshu-site/package.json +17 -6
  398. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  399. package/packages/theme-shinshu-site/src/index.js +7 -3
  400. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  401. package/packages/work-graph/package.json +14 -4
  402. package/packages/work-graph/src/index.js +34 -1
  403. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  404. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  405. package/protocol/FILEMETA_V1.md +2 -2
  406. package/protocol/README.md +15 -7
  407. package/protocol/apps/agentsam.app.v1.schema.json +89 -7
  408. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  409. package/protocol/assets/README.md +9 -0
  410. package/protocol/assets/asset-record.v1.schema.json +64 -0
  411. package/protocol/capabilities/manifest.json +1 -1
  412. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  413. package/protocol/presets/catalog.json +2 -2
  414. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  415. package/protocol/scoring/README.md +10 -0
  416. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  417. package/protocol/theme-refinery/lineage-registry.json +105 -0
  418. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  419. package/protocol/ui/icon-registry.mjs +1 -0
  420. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  421. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  422. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  423. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  424. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  425. package/scripts/build_rapid_rust_cli.py +83 -0
  426. package/skills/grok-auth/SKILL.md +110 -0
  427. package/skills/grok-auth/agentsam.skill.json +25 -0
  428. package/skills/grok-auth/references/grok-identity.md +64 -0
  429. package/skills/grok-auth/references/per-user-data.md +49 -0
  430. package/skills/grok-auth/references/prewired-and-env.md +54 -0
  431. package/skills/grok-auth/references/session-ui.md +133 -0
  432. package/skills/grok-auth/references/sign-in-methods.md +55 -0
  433. package/skills/grok-auth/references/wiring.md +71 -0
  434. package/skills/grok-building-games/SKILL.md +213 -0
  435. package/skills/grok-building-games/agentsam.skill.json +25 -0
  436. package/skills/grok-building-games/references/3d-libs.md +64 -0
  437. package/skills/grok-building-games/references/ai-pathfinding.md +122 -0
  438. package/skills/grok-building-games/references/audio.md +129 -0
  439. package/skills/grok-building-games/references/babylon.md +202 -0
  440. package/skills/grok-building-games/references/collision-physics.md +122 -0
  441. package/skills/grok-building-games/references/ecs-architecture.md +111 -0
  442. package/skills/grok-building-games/references/game-feel-juice.md +110 -0
  443. package/skills/grok-building-games/references/genres/board-card-chess.md +89 -0
  444. package/skills/grok-building-games/references/genres/endless-runner.md +83 -0
  445. package/skills/grok-building-games/references/genres/fps.md +105 -0
  446. package/skills/grok-building-games/references/genres/platformer-2d.md +97 -0
  447. package/skills/grok-building-games/references/genres/puzzle-match3-tetris.md +131 -0
  448. package/skills/grok-building-games/references/genres/racing-kart.md +106 -0
  449. package/skills/grok-building-games/references/genres/topdown-twin-stick.md +97 -0
  450. package/skills/grok-building-games/references/genres/tower-defense.md +84 -0
  451. package/skills/grok-building-games/references/genres/voxel-minecraft.md +89 -0
  452. package/skills/grok-building-games/references/input.md +139 -0
  453. package/skills/grok-building-games/references/phaser.md +277 -0
  454. package/skills/grok-building-games/references/procedural-generation.md +141 -0
  455. package/skills/grok-building-games/references/save-persistence.md +108 -0
  456. package/skills/grok-building-games/references/threejs-foundational.md +148 -0
  457. package/skills/grok-controls/SKILL.md +274 -0
  458. package/skills/grok-controls/agentsam.skill.json +25 -0
  459. package/skills/grok-design-ui/SKILL.md +122 -0
  460. package/skills/grok-design-ui/agentsam.skill.json +25 -0
  461. package/skills/grok-design-ui/references/animations.md +379 -0
  462. package/skills/grok-design-ui/references/performance.md +88 -0
  463. package/skills/grok-design-ui/references/refined-ui.md +384 -0
  464. package/skills/grok-design-ui/references/surfaces.md +247 -0
  465. package/skills/grok-design-ui/references/typography.md +123 -0
  466. package/skills/grok-game-animation-frames/SKILL.md +84 -0
  467. package/skills/grok-game-animation-frames/agentsam.skill.json +25 -0
  468. package/skills/grok-game-asset-core/SKILL.md +69 -0
  469. package/skills/grok-game-asset-core/agentsam.skill.json +25 -0
  470. package/skills/grok-game-character-consistency/SKILL.md +69 -0
  471. package/skills/grok-game-character-consistency/agentsam.skill.json +25 -0
  472. package/skills/grok-game-tilesets/SKILL.md +65 -0
  473. package/skills/grok-game-tilesets/agentsam.skill.json +25 -0
  474. package/skills/grok-game-ui-icons/SKILL.md +56 -0
  475. package/skills/grok-game-ui-icons/agentsam.skill.json +25 -0
  476. package/skills/grok-generate2dmap/LICENSE +21 -0
  477. package/skills/grok-generate2dmap/SKILL.md +120 -0
  478. package/skills/grok-generate2dmap/SOURCE.md +6 -0
  479. package/skills/grok-generate2dmap/agentsam.skill.json +25 -0
  480. package/skills/grok-generate2dmap/references/deliverables.md +101 -0
  481. package/skills/grok-generate2dmap/references/layered-map-contract.md +209 -0
  482. package/skills/grok-generate2dmap/references/map-strategies.md +341 -0
  483. package/skills/grok-generate2dmap/references/object-production-gate.md +24 -0
  484. package/skills/grok-generate2dmap/references/pipeline.md +149 -0
  485. package/skills/grok-generate2dmap/references/prop-pack-contract.md +174 -0
  486. package/skills/grok-generate2dmap/references/side-scroll-stages.md +29 -0
  487. package/skills/grok-generate2dmap/scripts/compose_layered_preview.py +157 -0
  488. package/skills/grok-generate2dmap/scripts/extract_prop_pack.py +369 -0
  489. package/skills/grok-generate2dsprite/LICENSE +21 -0
  490. package/skills/grok-generate2dsprite/SKILL.md +313 -0
  491. package/skills/grok-generate2dsprite/SOURCE.md +6 -0
  492. package/skills/grok-generate2dsprite/agentsam.skill.json +25 -0
  493. package/skills/grok-generate2dsprite/references/modes.md +124 -0
  494. package/skills/grok-generate2dsprite/references/prompt-rules.md +315 -0
  495. package/skills/grok-generate2dsprite/scripts/generate2dsprite.py +1031 -0
  496. package/skills/grok-generate2dsprite/scripts/make_layout_guide.py +109 -0
  497. package/skills/grok-imagine/SKILL.md +201 -0
  498. package/skills/grok-imagine/agentsam.skill.json +25 -0
  499. package/skills/grok-multiplayer-p2p/SKILL.md +111 -0
  500. package/skills/grok-multiplayer-p2p/agentsam.skill.json +25 -0
  501. package/skills/grok-multiplayer-p2p/references/react-binding.md +144 -0
  502. package/skills/grok-multiplayer-p2p/references/signaling-relay.md +269 -0
  503. package/skills/grok-neon/SKILL.md +157 -0
  504. package/skills/grok-neon/agentsam.skill.json +25 -0
  505. package/skills/grok-og/SKILL.md +102 -0
  506. package/skills/grok-og/agentsam.skill.json +25 -0
  507. package/skills/grok-og/references/brand-pass.md +53 -0
  508. package/skills/grok-og/references/custom-card.md +107 -0
  509. package/skills/grok-og/references/favicon-and-icons.md +48 -0
  510. package/skills/grok-og/references/og-type-contract.md +18 -0
  511. package/skills/grok-og/references/placeholder-card.md +21 -0
  512. package/skills/grok-og/references/x-banner.md +41 -0
  513. package/skills/grok-threejs/SKILL.md +67 -0
  514. package/skills/grok-threejs/agentsam.skill.json +25 -0
  515. package/skills/grok-threejs/references/llms-full.txt +2780 -0
  516. package/skills/grok-video2dsprite/LICENSE +21 -0
  517. package/skills/grok-video2dsprite/SKILL.md +236 -0
  518. package/skills/grok-video2dsprite/SOURCE.md +6 -0
  519. package/skills/grok-video2dsprite/agentsam.skill.json +25 -0
  520. package/skills/grok-video2dsprite/references/pipeline.md +90 -0
  521. package/skills/grok-video2dsprite/references/prompt-rules.md +63 -0
  522. package/skills/grok-video2dsprite/scripts/video2dsprite.py +490 -0
  523. package/skills/grok-xai-api/SKILL.md +152 -0
  524. package/skills/grok-xai-api/agentsam.skill.json +25 -0
  525. package/src/attachments/index.js +6 -0
  526. package/src/attachments/intake.js +235 -0
  527. package/src/capabilities/repository-snapshot.js +19 -2
  528. package/src/cli/command-catalog.js +53 -3
  529. package/src/cli/dispatch.js +1 -0
  530. package/src/cli.js +192 -26
  531. package/src/cloudflare/runtime-status.js +2 -1
  532. package/src/commands/account-auth.js +94 -8
  533. package/src/commands/app.js +307 -3
  534. package/src/commands/autorag.js +67 -13
  535. package/src/commands/billing.js +127 -0
  536. package/src/commands/brand.js +74 -60
  537. package/src/commands/cheat-sheet.js +179 -0
  538. package/src/commands/cloudflare-login.js +222 -0
  539. package/src/commands/cloudflare.js +453 -23
  540. package/src/commands/codebaseindex.js +51 -3
  541. package/src/commands/compute.js +4 -0
  542. package/src/commands/connections.js +11 -5
  543. package/src/commands/credentials.js +116 -0
  544. package/src/commands/gcloud-auth.js +427 -0
  545. package/src/commands/google-cloud.js +375 -0
  546. package/src/commands/identity-init.js +2 -2
  547. package/src/commands/knowledge.js +59 -2
  548. package/src/commands/machine-binary.js +103 -0
  549. package/src/commands/machine.js +137 -0
  550. package/src/commands/mcp.js +226 -33
  551. package/src/commands/ollama.js +3 -2
  552. package/src/commands/plugins.js +7 -2
  553. package/src/commands/product.js +36 -0
  554. package/src/commands/runtime-status.js +28 -9
  555. package/src/commands/runtime.js +313 -0
  556. package/src/commands/rust.js +24 -0
  557. package/src/commands/security.js +67 -4
  558. package/src/commands/setup.js +296 -0
  559. package/src/commands/shell.js +16 -3
  560. package/src/commands/start-local.js +2 -2
  561. package/src/commands/status.js +8 -1
  562. package/src/commands/terminal.js +171 -0
  563. package/src/commands/update.js +140 -0
  564. package/src/commands/whoami.js +329 -65
  565. package/src/features/resolve.js +2 -0
  566. package/src/index.js +4 -0
  567. package/src/indexing/ingest/inventory.js +254 -19
  568. package/src/indexing/ingest/materials.js +3 -9
  569. package/src/indexing/ingest/style-evidence.js +181 -0
  570. package/src/knowledge/engine.js +21 -2
  571. package/src/knowledge/runtime-discovery.js +127 -0
  572. package/src/knowledge/source.js +3 -3
  573. package/src/lib/account-session.js +11 -4
  574. package/src/lib/app-authority.js +172 -0
  575. package/src/lib/auth.js +94 -21
  576. package/src/lib/core-client.js +5 -6
  577. package/src/lib/credentials-audit.js +451 -0
  578. package/src/lib/deploy/health.js +24 -6
  579. package/src/lib/detect-context.js +7 -1
  580. package/src/lib/google-cloud-connection.js +270 -0
  581. package/src/lib/google-cloud-inventory.js +385 -0
  582. package/src/lib/google-desktop-oauth.js +372 -0
  583. package/src/lib/google-studio-brokered-oauth.js +158 -0
  584. package/src/lib/identity-scaffold.js +76 -18
  585. package/src/lib/init-options.js +192 -0
  586. package/src/lib/local-scaffold.js +48 -16
  587. package/src/lib/provider-command-remediation.js +308 -0
  588. package/src/lib/provider-credentials.js +8 -0
  589. package/src/lib/scaffold/index.js +8 -2
  590. package/src/lib/scaffold/mcp-server.js +43 -0
  591. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  592. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  593. package/src/lib/scaffold/wizards/cms.js +93 -0
  594. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  595. package/src/lib/setup/contract.js +26 -0
  596. package/src/lib/setup/discover.js +116 -0
  597. package/src/lib/setup/execute.js +205 -0
  598. package/src/lib/setup/planner.js +134 -0
  599. package/src/lib/setup/recipes.js +235 -0
  600. package/src/lib/setup/runtime-persist.js +197 -0
  601. package/src/lib/setup/runtime.js +394 -0
  602. package/src/lib/slash-commands.js +2 -0
  603. package/src/lib/terminal/machine-identity.js +95 -0
  604. package/src/lib/terminal-local.js +164 -0
  605. package/src/lib/terminal-scopes.js +52 -0
  606. package/src/lib/whoami-capabilities.js +184 -0
  607. package/src/local-pty/server.js +34 -5
  608. package/src/mcp/authority.js +58 -108
  609. package/src/mcp/client-adapters.js +68 -144
  610. package/src/mcp/client.js +142 -122
  611. package/src/mcp/cloudflare-bundles.js +225 -0
  612. package/src/mcp/index.js +12 -0
  613. package/src/models/discovery.js +40 -22
  614. package/src/models/inventory-core.d.ts +105 -0
  615. package/src/models/inventory-core.js +54 -6
  616. package/src/plugins/cloudflare.js +1 -1
  617. package/src/providers/ollama-chat.js +2 -1
  618. package/src/sam/types.js +27 -2
  619. package/src/security/inventory.js +12 -2
  620. package/src/security/local-vault.js +2 -0
  621. package/src/security/logs.js +3 -0
  622. package/src/security/scan.js +1 -1
  623. package/src/ui/cli/help.js +41 -0
  624. package/test/account-session.test.mjs +3 -3
  625. package/test/app-authority-context.test.mjs +32 -0
  626. package/test/apps-scaffold-contract.test.mjs +3 -2
  627. package/test/cli/api-key-env-whoami.test.mjs +2 -2
  628. package/test/cli/catalog-authority.test.mjs +64 -0
  629. package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
  630. package/test/cli/machine-command.test.mjs +34 -0
  631. package/test/cli/mcp-client.test.mjs +21 -10
  632. package/test/cli/runtime-persist.test.mjs +56 -0
  633. package/test/cli/rust-command.test.mjs +21 -0
  634. package/test/credentials-audit.test.mjs +113 -0
  635. package/test/deploy-health-scan.test.mjs +29 -1
  636. package/test/fixtures/project-authority/customer-app/.agentsam/app.json +5 -0
  637. package/test/fixtures/project-authority/customer-app/apps/my-product/index.ts +1 -0
  638. package/test/fixtures/project-authority/customer-app/wrangler.toml +17 -0
  639. package/test/gcloud-auth.test.mjs +111 -0
  640. package/test/google-cloud-connection.test.mjs +83 -0
  641. package/test/google-cloud-inventory.test.mjs +64 -0
  642. package/test/init-options.test.mjs +35 -0
  643. package/test/integration/app-command.test.mjs +30 -0
  644. package/test/integration/autorag-project-authority.integration.test.mjs +51 -0
  645. package/test/integration/autorag-runtime-discovery.test.mjs +107 -0
  646. package/test/integration/cad-project.test.mjs +4 -1
  647. package/test/integration/cms-app-scaffold.test.mjs +77 -0
  648. package/test/integration/cms-site-tenancy-contract.test.mjs +31 -19
  649. package/test/integration/codebaseindex-ingest.test.mjs +89 -0
  650. package/test/integration/database-hosted-honesty.test.mjs +49 -0
  651. package/test/integration/desktop-keychain-boundary.test.mjs +45 -0
  652. package/test/integration/features-resolve.test.mjs +30 -11
  653. package/test/integration/hosted-work-host-authority.test.mjs +47 -0
  654. package/test/integration/inspect-path-cli.test.mjs +46 -0
  655. package/test/integration/inventory-eligibility.test.mjs +59 -0
  656. package/test/integration/inventory-evidence.test.mjs +125 -0
  657. package/test/integration/local-provider-bridge.test.mjs +65 -0
  658. package/test/integration/local-studio-settings-production.test.mjs +40 -0
  659. package/test/integration/lockfile-sync.test.mjs +26 -0
  660. package/test/integration/provider-env-cli.test.mjs +13 -3
  661. package/test/integration/runtime-status.integration.test.mjs +17 -1
  662. package/test/integration/theme-package-registry.test.mjs +31 -0
  663. package/test/knowledge.test.mjs +35 -1
  664. package/test/loopback-oauth.test.mjs +53 -0
  665. package/test/ollama.test.mjs +22 -0
  666. package/test/repository-snapshot-view.test.mjs +2 -2
  667. package/test/security.test.mjs +37 -0
  668. package/test/setup-planner.test.mjs +74 -0
  669. package/test/setup-runtime.test.mjs +51 -0
  670. package/test/terminal/local-pty.mock.test.mjs +3 -1
  671. package/test/terminal-machine-identity.test.mjs +88 -0
  672. package/test/whoami-resume.test.mjs +27 -6
  673. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  674. package/packages/agentsam-nav/dist/Nav.d.ts +0 -43
  675. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +0 -10
  676. package/packages/agentsam-nav/dist/NavContent.d.ts +0 -2
  677. package/packages/agentsam-nav/dist/NavFooter.d.ts +0 -2
  678. package/packages/agentsam-nav/dist/NavGroup.d.ts +0 -3
  679. package/packages/agentsam-nav/dist/NavHeader.d.ts +0 -2
  680. package/packages/agentsam-nav/dist/NavMenu.d.ts +0 -22
  681. package/packages/agentsam-nav/dist/NavProvider.d.ts +0 -35
  682. package/packages/agentsam-nav/dist/NavTrigger.d.ts +0 -2
  683. package/packages/agentsam-nav/dist/Surfaces.d.ts +0 -41
  684. package/packages/agentsam-nav/dist/browser.d.ts +0 -11
  685. package/packages/agentsam-nav/dist/browser.global.js +0 -132
  686. package/packages/agentsam-nav/dist/browser.js +0 -613
  687. package/packages/agentsam-nav/dist/contracts.d.ts +0 -76
  688. package/packages/agentsam-nav/dist/index.d.ts +0 -11
  689. package/packages/agentsam-nav/dist/index.js +0 -614
  690. package/packages/agentsam-nav/dist/legacy.css +0 -83
  691. package/packages/agentsam-nav/dist/shell.css +0 -113
  692. package/packages/agentsam-nav/dist/theme.css +0 -113
  693. package/packages/agentsam-nav/dist/utils.d.ts +0 -1
  694. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +0 -670
  695. package/packages/work-graph/prototype/README.md +0 -32
  696. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  697. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  698. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  699. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env python3
2
+ """Create a layout-only guide image for sprite sheet generation."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ from pathlib import Path
8
+
9
+ from PIL import Image, ImageDraw
10
+
11
+
12
+ def draw_dashed_line(
13
+ draw: ImageDraw.ImageDraw,
14
+ start: tuple[int, int],
15
+ end: tuple[int, int],
16
+ *,
17
+ fill: str,
18
+ width: int,
19
+ dash: int,
20
+ gap: int,
21
+ ) -> None:
22
+ x1, y1 = start
23
+ x2, y2 = end
24
+ if x1 == x2:
25
+ for y in range(min(y1, y2), max(y1, y2), dash + gap):
26
+ draw.line((x1, y, x2, min(y + dash, max(y1, y2))), fill=fill, width=width)
27
+ return
28
+ if y1 == y2:
29
+ for x in range(min(x1, x2), max(x1, x2), dash + gap):
30
+ draw.line((x, y1, min(x + dash, max(x1, x2)), y2), fill=fill, width=width)
31
+ return
32
+ raise ValueError("draw_dashed_line only supports horizontal or vertical lines")
33
+
34
+
35
+ def parse_args() -> argparse.Namespace:
36
+ parser = argparse.ArgumentParser(description=__doc__)
37
+ parser.add_argument("--rows", type=int, required=True)
38
+ parser.add_argument("--cols", type=int, required=True)
39
+ parser.add_argument("--cell-width", type=int, default=384)
40
+ parser.add_argument("--cell-height", type=int, default=384)
41
+ parser.add_argument("--safe-margin-x", type=int, default=52)
42
+ parser.add_argument("--safe-margin-y", type=int, default=52)
43
+ parser.add_argument("--output", type=Path, required=True)
44
+ parser.add_argument(
45
+ "--label-cells",
46
+ action="store_true",
47
+ help="Draw small row,column labels. Leave off for normal imagegen references.",
48
+ )
49
+ return parser.parse_args()
50
+
51
+
52
+ def main() -> None:
53
+ args = parse_args()
54
+ if args.rows <= 0 or args.cols <= 0:
55
+ raise SystemExit("--rows and --cols must be positive")
56
+ if args.cell_width <= 0 or args.cell_height <= 0:
57
+ raise SystemExit("--cell-width and --cell-height must be positive")
58
+
59
+ width = args.cols * args.cell_width
60
+ height = args.rows * args.cell_height
61
+ image = Image.new("RGB", (width, height), "#f8f8f8")
62
+ draw = ImageDraw.Draw(image)
63
+
64
+ for row in range(args.rows):
65
+ for col in range(args.cols):
66
+ left = col * args.cell_width
67
+ top = row * args.cell_height
68
+ right = left + args.cell_width - 1
69
+ bottom = top + args.cell_height - 1
70
+ safe_left = left + args.safe_margin_x
71
+ safe_top = top + args.safe_margin_y
72
+ safe_right = right - args.safe_margin_x
73
+ safe_bottom = bottom - args.safe_margin_y
74
+
75
+ draw.rectangle((left, top, right, bottom), outline="#111111", width=4)
76
+ draw.rectangle(
77
+ (safe_left, safe_top, safe_right, safe_bottom), outline="#2f80ed", width=3
78
+ )
79
+
80
+ center_x = left + args.cell_width // 2
81
+ center_y = top + args.cell_height // 2
82
+ draw_dashed_line(
83
+ draw,
84
+ (center_x, safe_top),
85
+ (center_x, safe_bottom),
86
+ fill="#b8b8b8",
87
+ width=2,
88
+ dash=14,
89
+ gap=16,
90
+ )
91
+ draw_dashed_line(
92
+ draw,
93
+ (safe_left, center_y),
94
+ (safe_right, center_y),
95
+ fill="#b8b8b8",
96
+ width=2,
97
+ dash=14,
98
+ gap=16,
99
+ )
100
+
101
+ if args.label_cells:
102
+ draw.text((left + 12, top + 10), f"{row + 1},{col + 1}", fill="#777777")
103
+
104
+ args.output.parent.mkdir(parents=True, exist_ok=True)
105
+ image.save(args.output)
106
+
107
+
108
+ if __name__ == "__main__":
109
+ main()
@@ -0,0 +1,201 @@
1
+ ---
2
+ name: imagine
3
+ description: >
4
+ How to use the Imagine tools in Grok Build: imagine_text_to_image,
5
+ imagine_image_to_image, imagine_reference_to_image, imagine_text_to_video,
6
+ imagine_image_to_video, imagine_reference_to_video, and render_file for chat
7
+ previews. When to build a visual with code instead of generating it,
8
+ prompt-craft, reference-first handling of real people, factual grounding, and
9
+ asset-consistency. Load this whenever generating or editing an image or video
10
+ is on the table. Tool-usage-driven, not triggered by a user merely mentioning
11
+ images.
12
+ metadata:
13
+ short-description: "Prompting and workflow guidance for Imagine image/video tools"
14
+ user-invocable: false
15
+ ---
16
+
17
+ # Imagine
18
+
19
+ Grok Build uses the **split Imagine computer stack** (`grok_computer` variants).
20
+ There is **no** consolidated `imagine_image` or `imagine_video` tool — always
21
+ call the modality-specific name from the table below.
22
+
23
+ | Tool | Role |
24
+ |------|------|
25
+ | `imagine_text_to_image` | New image from a text prompt only (no source). |
26
+ | `imagine_image_to_image` | Edit / restyle **one** existing image (sandbox path). |
27
+ | `imagine_reference_to_image` | Combine **2+** reference images (sandbox paths). |
28
+ | `imagine_text_to_video` | New video from a text prompt only (no source). |
29
+ | `imagine_image_to_video` | Animate **one** still (sandbox path) into a video. |
30
+ | `imagine_reference_to_video` | Video from **1+** reference images (sandbox paths). |
31
+ | `render_file` | Show a sandbox image/video path to the user in chat. |
32
+
33
+ **Path-based handles.** These tools read/write the shared sandbox:
34
+
35
+ - Generation returns a sandbox **`file_path`** (under artifacts). Open it with
36
+ `read_file` / shell; show the user with **`render_file`**.
37
+ - Edit / animate tools take that path (or paths) as input — match the live
38
+ schema (`image`, `images`, etc.). Never invent paths.
39
+ - Never call `imagine_image` / `imagine_video`. Asset-id helpers
40
+ (`imagine_create_asset` / `imagine_view_media` / `render_imagine_media`) are
41
+ **not** on this stack.
42
+
43
+ Apply this whenever you're considering or about to call any of these tools.
44
+
45
+ ## Handle flow (mandatory mental model)
46
+
47
+ ```text
48
+ generate → file_path → render_file (show user) / read_file or scripts (QC)
49
+ edit / animate → pass prior file_path(s) into image_to_* / reference_to_*
50
+ ```
51
+
52
+ - **Use the path the tool actually returned** — do not invent filesystem paths.
53
+ - **Show the user media** with `render_file`, not ad-hoc markdown image links.
54
+
55
+ ## Build accurate visuals with code, not the image tools
56
+
57
+ 1. **Image models are unreliable at exact text, numbers, and structure.** They can handle short text or a simple layout, but they often garble words, invent numbers, draw chart bars that match no data, or point diagram arrows nowhere, and the more that has to be exact, the worse they do. A detailed prompt doesn't make it dependable, and another `imagine_image_to_image` edit usually won't fix it. So when a result needs specific text, data, or structure to be correct (charts from real numbers, labeled or technical diagrams, math explainers, tables, screens with real copy), construct the asset with code, where you control the exact content. Prefer HTML and CSS, which give much better layout, typography, and polish than Python plotting. When only the look matters (photos, illustrations, characters, scenes, decorative art), the image tools are the right choice. Which one fits depends on what the output needs to get right, not on how the request is worded.
58
+
59
+ ## Verifying discrete accuracy (loop)
60
+
61
+ When the output must get specific text, numbers, data, or structure right, don't trust the first result - verify it in a loop:
62
+
63
+ 1. Produce the result (generate, or per *Build accurate visuals with code*, construct it in code).
64
+ 2. Inspect the actual output - use `read_file` (image understanding) on the result path - and confirm every word, number, label, and structural detail matches the requirement, and that nothing overlaps, clips, or runs off-canvas.
65
+ 3. If anything is wrong, fix and re-verify:
66
+ - Garbled text, invented numbers, or broken layout from an image model? Don't just re-prompt - it will likely garble it again. Rebuild it with code.
67
+ - Overlapping or clipped elements in code-built output? Re-lay-out with auto-layout (HTML/CSS) rather than nudging coordinates by hand.
68
+ - Otherwise make one targeted edit via `imagine_image_to_image` with the prior path.
69
+ 4. Only finish when the discrete content is exactly correct. If it can't be made accurate, tell the user instead of shipping something wrong.
70
+
71
+ ## Core Principles
72
+
73
+ 1. **You own the prompt.** If the user gives a detailed prompt or asks you to use theirs, use it verbatim. Otherwise craft the final prompt: front-load the subject, give strong high-level direction for mood, composition, lighting, and style without over-specifying every detail, write natural prose rather than keyword tags, and describe positively instead of using negative prompts. For edits, describe only what changes. Target 2-5 sentences.
74
+ 2. **Reference-first for real people.** Never use pure text-to-image for a named real person or group, including face swaps, posters, cartoons, and cinematic or editorial depictions. Use `imagine_image_to_image` **with a real reference path** instead, and never produce non-consensual, sexualized, or minor-involving likenesses. See Real People and References for the procedure.
75
+ 3. **Ground facts with search first.** If any part of the request depends on a real-world fact, identity, brand or product, place, event, or top/latest/current result, search the web before generating and put the actual verified details into the prompt. Don't rely on memory, and don't write vague placeholders like "the current president"; write the verified name.
76
+ 4. **Reuse a base for consistency.** When the same character, object, or setting must appear across multiple images, generate one base with `imagine_text_to_image`, keep its `file_path`, then pass that path to `imagine_image_to_image` for every variation. Don't re-run text-to-image from scratch for a recurring subject.
77
+ 5. **Handle failures gracefully.** On a moderation or safety block, stop; don't retry and don't paraphrase the prompt to evade the filter. Tell the user it was blocked and offer a different direction. If a reference is weak or a result looks off-target, say so and ask for an upload or redirect rather than silently iterating.
78
+ 6. **Plan multi-step workflows.** Sequence the steps; only parallelize generations that belong to the same step.
79
+ 7. **Review at the end.** Confirm the generations you intended actually executed and match what was asked. Render final assets with `render_file`.
80
+ 8. **Don't assume tool behavior.** Don't invent tool parameters, return values, or environment capabilities that aren't actually provided; verify rather than guess.
81
+
82
+ ## Choosing the tool
83
+
84
+ | Situation | Call |
85
+ |-----------|------|
86
+ | New image, no source | `imagine_text_to_image` with `prompt` (+ `aspect_ratio`) |
87
+ | Edit / restyle / recolor one existing image | `imagine_image_to_image` with `prompt` + source path |
88
+ | Combine 2+ reference images into one | `imagine_reference_to_image` with `prompt` + source paths |
89
+ | Iterate on a previous result | `imagine_image_to_image` with prior path |
90
+ | Named real person or group | `imagine_image_to_image` with a real reference path after web search |
91
+ | Generic / invented subject from scratch | `imagine_text_to_image` |
92
+ | New video, no source | `imagine_text_to_video` with `prompt` |
93
+ | Animate one still | `imagine_image_to_video` with that still's path |
94
+ | Multi-ref video | `imagine_reference_to_video` with image path(s) |
95
+
96
+ Rule of thumb: **no refs → text_to_*; one ref → image_to_*; 2+ refs → reference_to_*.**
97
+
98
+ ## `imagine_text_to_image`
99
+
100
+ Generate a new image from a text prompt.
101
+
102
+ Inputs:
103
+
104
+ - `prompt` (required) - full description of the desired image.
105
+ - `aspect_ratio` - one of `1:1`, `3:4`, `4:3`, `2:3`, `3:2`, `9:16`, `16:9`, `21:9`, `5:2`, `50:11`, or `unknown`. Use `16:9` for OG share cards and `50:11` for the X feed banner when generating a custom `public/x-banner.jpg` for **games** (every app wires `x:game:image`; only games call Imagine for it — see the `og` skill); for a true 2:1 canvas, call the xAI Images API.
106
+
107
+ To produce multiple variations, make multiple `imagine_text_to_image` calls with distinct prompts. The tool does not expose `n` or `count` parameters.
108
+
109
+ ## `imagine_image_to_image`
110
+
111
+ Edit one existing image.
112
+
113
+ Inputs (names follow the live schema — typically a singular sandbox path):
114
+
115
+ - `prompt` (required) - what to change (describe only the edit).
116
+ - Source path field (required) - sandbox path returned by a prior generation or download.
117
+ - `aspect_ratio` - only set when the user explicitly wants a ratio change.
118
+
119
+ ## `imagine_reference_to_image`
120
+
121
+ Compose one image from 2+ reference paths.
122
+
123
+ Inputs:
124
+
125
+ - `prompt` (required).
126
+ - Source paths (required) - 2+ sandbox paths.
127
+ - `aspect_ratio` - optional.
128
+
129
+ For a single source edit, use `imagine_image_to_image` instead.
130
+
131
+ ## `imagine_text_to_video`
132
+
133
+ Generate a new video from a text prompt only (no source frame).
134
+
135
+ Inputs:
136
+
137
+ - `prompt` (required) - short present-tense shot description.
138
+ - `duration` / `aspect_ratio` / resolution fields as exposed by the live schema.
139
+
140
+ Prefer short shots; same prompt-craft rules as image-to-video below.
141
+
142
+ ## `imagine_image_to_video`
143
+
144
+ Animate one still into a video.
145
+
146
+ Inputs:
147
+
148
+ - Singular source still path (required).
149
+ - `prompt` - short present-tense shot (recommended; required by some variants).
150
+ - `duration` - `6` (default), `10`, or `15` when exposed.
151
+ - `aspect_ratio` - optional; omit to keep the source ratio when animating one image.
152
+
153
+ **Prefer short shots.** Build video as a planned sequence of short clips, not one long take:
154
+
155
+ 1. Plan the story as shots - one beat each.
156
+ 2. Prefer more 6s shots over fewer long ones.
157
+ 3. Create each shot's source still with `imagine_text_to_image` / `imagine_image_to_image` (keep character paths consistent).
158
+ 4. Animate with `imagine_image_to_video` + that still path.
159
+
160
+ Key behaviors:
161
+
162
+ - **Prompt-craft:** one short, vivid moment in present tense with a clear camera movement, in 1-2 sentences.
163
+ - **Minimal but interesting:** one clear subject and a single simple motion or camera move.
164
+ - **Complex source?** Keep the subject fixed and move only the camera, or break into simpler shots.
165
+ - **Real people:** reference-first - drive from a verified reference; never animate a named person without one.
166
+ - Don't loop the same clip unless asked.
167
+ - Assemble multi-shot timelines with FFmpeg stream copy on the returned video paths.
168
+
169
+ ## `imagine_reference_to_video`
170
+
171
+ Video from one or more reference image paths guided by a prompt. Prefer composing a single still with `imagine_reference_to_image` first, then `imagine_image_to_video`, when the goal is a clean first frame.
172
+
173
+ ## Writing Strong Prompts
174
+
175
+ Describe, roughly in this order: **subject -> action/pose -> setting -> style -> composition -> lighting/mood -> key details.**
176
+
177
+ - Be specific and concrete; lead with the most important elements.
178
+ - State what to include rather than what to exclude.
179
+ - Use one coherent scene per prompt.
180
+ - Match `aspect_ratio` to the use case: `9:16` for phone/story, `16:9` for banner/video frame or OG share cards, `1:1` for avatar/icon.
181
+
182
+ ## Real People and References
183
+
184
+ 1. Search the web first to confirm identity, role, relationship, or event, even when it seems obvious.
185
+ 2. Obtain a strong reference image on disk (user upload or search → sandbox path), then call `imagine_image_to_image` with that path. A user-uploaded photo is best.
186
+ 3. If no suitable reference exists, ask the user to upload one rather than generating from a weak base.
187
+
188
+ ## Showing results
189
+
190
+ - Call `render_file` with the sandbox `file_path` so the user sees the image/video in chat.
191
+ - For your own QC and scripts, `read_file` / shell on that path.
192
+
193
+ Game sprites and maps have their own pipelines — follow `generate2dsprite`,
194
+ `video2dsprite`, and `generate2dmap` for those.
195
+
196
+ ## Failure modes to avoid
197
+
198
+ - Calling consolidated names `imagine_image` or `imagine_video` (they are not available).
199
+ - Passing a list to `imagine_image_to_image` / `imagine_image_to_video` (singular source only).
200
+ - Inventing a filesystem path that the tool never returned.
201
+ - Running chroma/ffmpeg on a path you made up without a real generation/`file_path`.
@@ -0,0 +1,25 @@
1
+ {
2
+ "schema": "agentsam.skill.v1",
3
+ "id": "grok-imagine",
4
+ "name": "Grok \u00b7 imagine",
5
+ "description": "Prompting and workflow guidance for Imagine image/video tools",
6
+ "icon": "skill",
7
+ "slash": {
8
+ "suggested": "/grok-imagine"
9
+ },
10
+ "instructions": {
11
+ "source": "local_file",
12
+ "ref": "SKILL.md"
13
+ },
14
+ "execution": {
15
+ "mode": "turn",
16
+ "tools": [],
17
+ "operations": [],
18
+ "capabilities": []
19
+ },
20
+ "provenance": {
21
+ "source": "apps/local-studio/.grok/skills",
22
+ "vendor": "grok",
23
+ "status": "imported"
24
+ }
25
+ }
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: multiplayer-p2p
3
+ description: >
4
+ Peer-to-peer realtime multiplayer over WebRTC data channels: every user of
5
+ the deployed app connects directly to every other user (full mesh), the
6
+ server only brokers the handshake at /api/rtc. Lowest possible latency, zero
7
+ per-message server cost. Use for 2-8 player co-op/casual realtime: shared
8
+ cursors, drawing, party games, casual action. Triggers: p2p, peer to peer,
9
+ webrtc, low latency multiplayer, direct connection.
10
+ metadata:
11
+ short-description: "WebRTC P2P mesh, signaled at /api/rtc"
12
+ user-invocable: false
13
+ ---
14
+
15
+ # Multiplayer (WebRTC peer-to-peer)
16
+
17
+ All visitors on the same deployed domain join one default room, opening a
18
+ native WebRTC data channel directly to every other visitor — game traffic
19
+ itself never touches a server. A tiny relay at `/api/rtc` handles only the
20
+ routing of the connection handshake (SDP/ICE) while peers connect. What you
21
+ use from the kit is client-side only; the relay is yours.
22
+
23
+ Latency is browser↔browser (often 5–40ms) with zero per-tick server cost.
24
+
25
+ | Piece | Path |
26
+ |---|---|
27
+ | Mesh primitive (start here) | `P2PRoom` from `@/lib/multiplayer` |
28
+ | React room binding (optional, you create) | `src/lib/multiplayer/use-p2p-room.ts` |
29
+ | Signaling relay (you create) | `src/lib/multiplayer/signaling.server.ts` |
30
+ | HTTP mount (you create) | `src/routes/api/rtc.ts` |
31
+
32
+ **Trust model — read before choosing P2P.** There is no server authority:
33
+ every peer runs its own copy of the rules and can lie (position, score,
34
+ anything). Peers also learn each other's IP addresses during ICE. P2P is for
35
+ **co-op and casual play among people who choose to play together** — never for
36
+ competitive ranking, cheat-sensitive, or anonymous-stranger matchmaking.
37
+ Competitive or cheat-sensitive play is not supported in this template: push
38
+ back in product terms rather than shipping it on P2P.
39
+
40
+ Practical limits: a full mesh is O(N²) connections — cap rooms at ~8 peers.
41
+ Roughly 10–20% of peer pairs sit behind strict NATs and cannot connect; the
42
+ kit surfaces this per peer as `connectionState: "failed"` — show it in the
43
+ UI rather than hanging.
44
+
45
+ ## Setup (once)
46
+
47
+ Create the two server files — nothing works without them:
48
+
49
+ 1. `src/lib/multiplayer/signaling.server.ts` — the DB-backed signaling relay
50
+ (Neon deployed, PGLite in preview).
51
+ 2. `src/routes/api/rtc.ts` — mounts it at `/api/rtc` (GET poll, POST
52
+ signal/leave).
53
+
54
+ **Copy both from `references/signaling-relay.md`**, which also carries the
55
+ schema note: the relay creates its own two tables on first use
56
+ (`CREATE TABLE IF NOT EXISTS`), so **nothing goes in `migrations/`** unless you
57
+ deliberately want to own the schema.
58
+
59
+ ## Using the primitive
60
+
61
+ `P2PRoom` is framework-free, and a "room" is just a rendezvous key — a lobby
62
+ code, a 1:1 call id, a shared-document id, any string (≤64 chars). Any
63
+ architecture sits on top of the same three calls:
64
+
65
+ ```ts
66
+ import { P2PRoom } from "@/lib/multiplayer";
67
+
68
+ const p2p = new P2PRoom({
69
+ room: "doc-42",
70
+ selfId: myId,
71
+ name: "ani",
72
+ onPeersChanged: (peers) => render(peers),
73
+ onMessage: (from, data, channel) => apply(from, data, channel),
74
+ });
75
+ await p2p.join();
76
+ p2p.broadcast(state); // unreliable "state" channel — game-rate, stale drops
77
+ p2p.send(event, to); // reliable channel — exactly-once events (to optional)
78
+ p2p.close();
79
+ ```
80
+
81
+ For the common "everyone on this app plays together" shape in React, copy the
82
+ `useP2PRoom` hook (plus a worked component: game-rate broadcast loop at ~20
83
+ sends/s, reliable one-shot events) from `references/react-binding.md`.
84
+
85
+ Patterns:
86
+
87
+ 1. `broadcast()` = unreliable/unordered, for continuously-refreshed state
88
+ (positions, cursors). `send()` = reliable/ordered, for events that must
89
+ arrive exactly once. Never stream game-rate state on `send()`; interpolate
90
+ between broadcasts for smooth motion.
91
+ 2. Late joiners know nothing: on a new peer appearing in `p2p.peers`, an
92
+ existing peer should `send()` it the current shared state. Exactly one
93
+ peer must answer: compare ids among the peers that were ALREADY in the
94
+ room (your `selfId` plus `p2p.peers` minus the newcomer) and answer only
95
+ if your `selfId` is the smallest — so two simultaneous joiners neither
96
+ double-answer nor go unanswered.
97
+ 3. Room ids: omit for "everyone on this app plays together"; pass
98
+ `room: code` for private lobbies (generate a short code, put it in the URL).
99
+ 4. Peers disappear without goodbye (tab close, sleep): treat a peer missing
100
+ from `p2p.peers` as gone and drop its entities.
101
+ 5. A React binding that captures `room`/`name` on first render (the one in
102
+ `references/react-binding.md` does) needs a remount to change them — key the
103
+ component on the room code.
104
+
105
+ ## Diagnostics
106
+
107
+ Each entry in `p2p.peers` carries `connectionState`, `rttMs` (data-channel
108
+ ping), and `candidateType` (`host`/`srflx` = direct). To override STUN, add
109
+ `VITE_STUN_URLS` (comma-separated) to `.grok/app-env.json` and **restart the dev
110
+ server** (Vite reads env at startup; HMR will not pick it up) — never write a
111
+ `.env` in this sandbox.
@@ -0,0 +1,25 @@
1
+ {
2
+ "schema": "agentsam.skill.v1",
3
+ "id": "grok-multiplayer-p2p",
4
+ "name": "Grok \u00b7 multiplayer-p2p",
5
+ "description": "WebRTC P2P mesh, signaled at /api/rtc",
6
+ "icon": "skill",
7
+ "slash": {
8
+ "suggested": "/grok-multiplayer-p2p"
9
+ },
10
+ "instructions": {
11
+ "source": "local_file",
12
+ "ref": "SKILL.md"
13
+ },
14
+ "execution": {
15
+ "mode": "turn",
16
+ "tools": [],
17
+ "operations": [],
18
+ "capabilities": []
19
+ },
20
+ "provenance": {
21
+ "source": "apps/local-studio/.grok/skills",
22
+ "vendor": "grok",
23
+ "status": "imported"
24
+ }
25
+ }
@@ -0,0 +1,144 @@
1
+ # React room binding (optional — copy if it fits your app)
2
+
3
+ For the common "everyone on this app plays together" shape, copy this hook to
4
+ `src/lib/multiplayer/use-p2p-room.ts` and adapt it freely — it is yours, not
5
+ part of the kit. It captures `room`/`name` on first render, so changing them
6
+ later requires remounting the component (key it on the room code).
7
+
8
+
9
+ ```ts
10
+ /**
11
+ * React binding for P2PRoom. Identity and room id are captured once on mount
12
+ * (useState initializers) so re-renders never tear down the mesh: the P2PRoom
13
+ * instance lives exactly as long as the component that mounted it, and
14
+ * changing `room`/`name` requires a remount (key the component on them).
15
+ */
16
+ import { useCallback, useEffect, useRef, useState } from "react";
17
+ import { P2PRoom, type PeerInfo } from "./p2p";
18
+
19
+ export interface UseP2PRoomOptions {
20
+ /** Defaults to a per-deployment room derived from the hostname. */
21
+ room?: string;
22
+ name?: string;
23
+ }
24
+
25
+ export interface P2PRoomHandle {
26
+ selfId: string;
27
+ room: string;
28
+ /** Remote peers only (self excluded), with live connection diagnostics. */
29
+ peers: PeerInfo[];
30
+ joined: boolean;
31
+ /** Unreliable game-state fanout to every connected peer. */
32
+ broadcast: (data: unknown) => void;
33
+ /** Reliable ordered send to one peer (or all when peerId is omitted). */
34
+ send: (data: unknown, peerId?: string) => void;
35
+ /** Subscribe to incoming messages; returns an unsubscribe function. */
36
+ onMessage: (
37
+ fn: (from: string, data: unknown, channel: "state" | "reliable") => void,
38
+ ) => () => void;
39
+ }
40
+
41
+ function defaultRoom(): string {
42
+ if (typeof window === "undefined") return "room-ssr";
43
+ // DNS labels can be 63 chars; the signaling ID regex caps room ids at 64 —
44
+ // truncate so `room-` + label always fits.
45
+ return `room-${window.location.hostname.split(".")[0]}`.slice(0, 64);
46
+ }
47
+
48
+ export function useP2PRoom(options: UseP2PRoomOptions = {}): P2PRoomHandle {
49
+ const [selfId] = useState(() => `p-${Math.random().toString(36).slice(2, 10)}`);
50
+ const [room] = useState(() => options.room ?? defaultRoom());
51
+ const [name] = useState(() => options.name ?? selfId);
52
+ const [peers, setPeers] = useState<PeerInfo[]>([]);
53
+ const [joined, setJoined] = useState(false);
54
+ const roomRef = useRef<P2PRoom | null>(null);
55
+ const listeners = useRef(
56
+ new Set<(from: string, data: unknown, channel: "state" | "reliable") => void>(),
57
+ );
58
+
59
+ useEffect(() => {
60
+ const p2p = new P2PRoom({
61
+ room,
62
+ selfId,
63
+ name,
64
+ onPeersChanged: setPeers,
65
+ onMessage: (from, data, channel) => {
66
+ for (const fn of listeners.current) fn(from, data, channel);
67
+ },
68
+ // `joined` flips on the FIRST successful poll — join() itself resolves
69
+ // even when the first poll fails (the loop keeps retrying).
70
+ onConnected: () => setJoined(true),
71
+ });
72
+ roomRef.current = p2p;
73
+ void p2p.join();
74
+ return () => {
75
+ roomRef.current = null;
76
+ p2p.close();
77
+ };
78
+ }, [room, selfId, name]);
79
+
80
+ // Stable identities (both close over refs) so consumers can safely list
81
+ // these in effect deps without re-subscribing every render.
82
+ const broadcast = useCallback((data: unknown) => roomRef.current?.broadcast(data), []);
83
+ const send = useCallback(
84
+ (data: unknown, peerId?: string) => roomRef.current?.send(data, peerId),
85
+ [],
86
+ );
87
+ const onMessage = useCallback(
88
+ (fn: (from: string, data: unknown, channel: "state" | "reliable") => void) => {
89
+ listeners.current.add(fn);
90
+ return () => {
91
+ listeners.current.delete(fn);
92
+ };
93
+ },
94
+ [],
95
+ );
96
+
97
+ return { selfId, room, peers, joined, broadcast, send, onMessage };
98
+ }
99
+ ```
100
+
101
+
102
+ Used in a component:
103
+
104
+
105
+ ```tsx
106
+ import { useP2PRoom } from "@/lib/multiplayer";
107
+
108
+ function Game() {
109
+ const p2p = useP2PRoom({ name: "ani" }); // room defaults per deployment
110
+ const [positions, setPositions] = useState<Record<string, Pos>>({});
111
+
112
+ useEffect(
113
+ () =>
114
+ p2p.onMessage((from, data, channel) => {
115
+ if (channel === "state") {
116
+ setPositions((p) => ({ ...p, [from]: data as Pos }));
117
+ }
118
+ }),
119
+ [p2p.onMessage],
120
+ );
121
+
122
+ // Game-rate state: broadcast on the unreliable channel (stale packets drop).
123
+ // 20-30 sends/s is plenty; interpolate between updates for smooth motion.
124
+ useEffect(() => {
125
+ let raf = 0;
126
+ let lastSent = 0;
127
+ const loop = (now: number) => {
128
+ if (now - lastSent >= 50) {
129
+ // ~20 sends/s
130
+ p2p.broadcast(myPositionRef.current);
131
+ lastSent = now;
132
+ }
133
+ raf = requestAnimationFrame(loop);
134
+ };
135
+ raf = requestAnimationFrame(loop);
136
+ return () => cancelAnimationFrame(raf);
137
+ }, [p2p.broadcast]);
138
+
139
+ // One-shot actions (chat, "start game"): reliable + ordered.
140
+ const sendChat = (text: string) => p2p.send({ chat: text });
141
+
142
+ return <Board peers={p2p.peers} positions={positions} />;
143
+ }
144
+ ```