@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/AGENTSAM.md +11 -0
  2. package/README.md +15 -9
  3. package/apps/client-cms-editor/AGENTS.md +12 -0
  4. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  5. package/apps/client-cms-editor/README.md +72 -0
  6. package/apps/client-cms-editor/agentsam.app.json +57 -0
  7. package/apps/client-cms-editor/backend/README.md +5 -0
  8. package/apps/client-cms-editor/backend/package.json +22 -0
  9. package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
  10. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
  11. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  12. package/apps/client-cms-editor/backend/src/model.ts +115 -0
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  14. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  15. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  16. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  17. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  18. package/apps/client-cms-editor/backend/tsconfig.json +15 -0
  19. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  20. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  21. package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
  22. package/apps/client-cms-editor/frontend/index.html +12 -0
  23. package/apps/client-cms-editor/frontend/package.json +33 -0
  24. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
  25. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
  26. package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
  27. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +8 -0
  29. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
  35. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  36. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  37. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  38. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  39. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  40. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  41. package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
  42. package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
  43. package/apps/client-cms-editor/package-lock.json +3832 -0
  44. package/apps/client-cms-editor/package.json +23 -0
  45. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  46. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  47. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  48. package/apps/client-cms-editor/shared/cms/package.json +21 -0
  49. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
  50. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  51. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
  52. package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
  53. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  54. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  55. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  56. package/bin/agentsam-rapid-rust +36 -0
  57. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  58. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  59. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  60. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  61. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  62. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
  63. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  64. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  65. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  66. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  68. package/docs/contracts/capability-install-planner.md +67 -0
  69. package/docs/contracts/environment-vocabulary.md +195 -0
  70. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  71. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  72. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  73. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  74. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  75. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  76. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  77. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  78. package/docs/plugins.md +2 -2
  79. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  80. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  81. package/docs/product/README.md +8 -0
  82. package/docs/rapid-rust-wasm.md +35 -0
  83. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  84. package/package.json +73 -14
  85. package/packages/agentsam-brand/README.md +106 -11
  86. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  87. package/packages/agentsam-brand/package.json +39 -7
  88. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  89. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  90. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  91. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  92. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  93. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  94. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  95. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  96. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  97. package/packages/agentsam-brand/src/core/errors.js +12 -0
  98. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  99. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  100. package/packages/agentsam-brand/src/core/keys.js +83 -0
  101. package/packages/agentsam-brand/src/core/naming.js +142 -0
  102. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  103. package/packages/agentsam-brand/src/core/pack.js +305 -0
  104. package/packages/agentsam-brand/src/core/plan.js +276 -0
  105. package/packages/agentsam-brand/src/core/preview.js +159 -0
  106. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  107. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  108. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  109. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  110. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  111. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  112. package/packages/agentsam-brand/src/core/promote.js +288 -0
  113. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  114. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  115. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  116. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  117. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  118. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  119. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  120. package/packages/agentsam-brand/src/index.js +193 -36
  121. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  122. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  123. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  124. package/packages/agentsam-brand/src/presets/index.js +40 -0
  125. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  126. package/packages/agentsam-brand/src/presets/model.json +8 -0
  127. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  128. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  129. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  130. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  131. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  132. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  133. package/packages/agentsam-knowledge/src/providers/index.js +6 -4
  134. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  135. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  136. package/packages/agentsam-nav/package.json +2 -2
  137. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  138. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  139. package/packages/agentsam-rapid-rust/README.md +5 -0
  140. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  141. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  142. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  143. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  144. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  145. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  146. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  147. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  148. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  149. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  150. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  151. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  152. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  153. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  154. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  155. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  156. package/packages/agentsam-repository/src/index.js +1 -0
  157. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  158. package/packages/agentsam-repository/src/source-types.js +85 -0
  159. package/packages/agentsam-vault/README.md +96 -0
  160. package/packages/agentsam-vault/package.json +32 -0
  161. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  162. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  163. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  164. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  165. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  166. package/packages/agentsam-vault/src/index.d.ts +9 -0
  167. package/packages/agentsam-vault/src/index.js +27 -0
  168. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  169. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  170. package/packages/agentsam-workbench/README.md +24 -0
  171. package/packages/agentsam-workbench/package.json +38 -0
  172. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  173. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  174. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  175. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  176. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  177. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  178. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  179. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  180. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  181. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  182. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  183. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  184. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  185. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  186. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  187. package/packages/agentsam-workbench/src/index.ts +6 -0
  188. package/packages/agentsam-workbench/src/project-control.css +160 -0
  189. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  190. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  191. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  192. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  193. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  194. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  195. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  196. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  197. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  198. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  199. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  200. package/packages/agentsam-workbench/tsconfig.json +13 -0
  201. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  202. package/packages/connectors/cloudflare/package.json +3 -1
  203. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  204. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  205. package/packages/connectors/cloudflare/src/credential.js +318 -0
  206. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  207. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  208. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  209. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  210. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  211. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  212. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  213. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  214. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  215. package/packages/connectors/cloudflare/src/index.js +102 -265
  216. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  217. package/packages/connectors/cloudflare/src/owner.js +42 -12
  218. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  219. package/packages/connectors/cloudflare/src/routes.js +309 -144
  220. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  221. package/packages/connectors/cloudflare/src/vault.js +2 -2
  222. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  223. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
  224. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  225. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  226. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  227. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
  228. package/packages/identity/README.md +1 -1
  229. package/packages/identity/backend/README.md +1 -1
  230. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
  231. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  232. package/packages/identity/package.json +4 -3
  233. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  234. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  235. package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
  236. package/packages/identity/src/adapters/sqlite/index.js +4 -1
  237. package/packages/identity/src/contracts/auth-config.js +28 -8
  238. package/packages/identity/src/contracts/external-identity.js +1 -1
  239. package/packages/identity/src/contracts/provider.js +1 -0
  240. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  241. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
  242. package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
  243. package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
  244. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  245. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  246. package/packages/identity/src/index.js +16 -0
  247. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  248. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  249. package/packages/identity/src/migrations/README.md +5 -2
  250. package/packages/identity/src/oauth/README.md +10 -5
  251. package/packages/identity/src/oauth/consent-view.js +388 -0
  252. package/packages/identity/src/oauth/credentials.js +31 -11
  253. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  254. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  255. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  256. package/packages/identity/src/providers/iam/index.js +27 -5
  257. package/packages/identity/src/server/identity-service.js +31 -2
  258. package/packages/identity/src/server/worker-router.js +111 -81
  259. package/packages/identity/tests/auth-config.test.mjs +3 -2
  260. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  261. package/packages/identity/tests/identity-service.test.mjs +16 -0
  262. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  263. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  264. package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
  265. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  266. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  267. package/packages/runtime-protocol/src/index.js +154 -0
  268. package/packages/theme-scenes/README.md +164 -0
  269. package/packages/theme-scenes/package.json +53 -0
  270. package/packages/theme-scenes/src/blocks/index.js +30 -0
  271. package/packages/theme-scenes/src/contracts/index.js +286 -0
  272. package/packages/theme-scenes/src/demos/index.js +65 -0
  273. package/packages/theme-scenes/src/index.js +75 -0
  274. package/packages/theme-scenes/src/presets/index.js +263 -0
  275. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  276. package/packages/theme-scenes/src/scenes/index.js +146 -0
  277. package/packages/theme-scenes/src/shell/index.js +47 -0
  278. package/packages/theme-scenes/src/themes/index.js +129 -0
  279. package/packages/theme-scenes/src/visuals/index.js +41 -0
  280. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  281. package/packages/work-graph/src/index.js +34 -1
  282. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  283. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  284. package/protocol/README.md +15 -7
  285. package/protocol/apps/agentsam.app.v1.schema.json +89 -7
  286. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  287. package/protocol/assets/README.md +9 -0
  288. package/protocol/assets/asset-record.v1.schema.json +64 -0
  289. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  290. package/protocol/scoring/README.md +10 -0
  291. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  292. package/protocol/ui/icon-registry.mjs +1 -0
  293. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  294. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  295. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  296. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  297. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  298. package/scripts/build_rapid_rust_cli.py +83 -0
  299. package/src/attachments/index.js +6 -0
  300. package/src/attachments/intake.js +235 -0
  301. package/src/capabilities/repository-snapshot.js +19 -2
  302. package/src/cli/command-catalog.js +8 -0
  303. package/src/cli.js +182 -26
  304. package/src/commands/account-auth.js +94 -8
  305. package/src/commands/app.js +307 -3
  306. package/src/commands/billing.js +127 -0
  307. package/src/commands/brand.js +74 -60
  308. package/src/commands/cheat-sheet.js +154 -0
  309. package/src/commands/cloudflare-login.js +222 -0
  310. package/src/commands/cloudflare.js +453 -23
  311. package/src/commands/codebaseindex.js +6 -1
  312. package/src/commands/compute.js +4 -0
  313. package/src/commands/connections.js +11 -5
  314. package/src/commands/credentials.js +116 -0
  315. package/src/commands/gcloud-auth.js +427 -0
  316. package/src/commands/google-cloud.js +375 -0
  317. package/src/commands/identity-init.js +2 -2
  318. package/src/commands/mcp.js +226 -33
  319. package/src/commands/ollama.js +3 -2
  320. package/src/commands/plugins.js +7 -2
  321. package/src/commands/product.js +36 -0
  322. package/src/commands/runtime-status.js +28 -9
  323. package/src/commands/runtime.js +313 -0
  324. package/src/commands/rust.js +24 -0
  325. package/src/commands/setup.js +279 -0
  326. package/src/commands/shell.js +16 -3
  327. package/src/commands/start-local.js +2 -2
  328. package/src/commands/terminal.js +171 -0
  329. package/src/commands/update.js +140 -0
  330. package/src/commands/whoami.js +329 -65
  331. package/src/features/resolve.js +1 -0
  332. package/src/index.js +4 -0
  333. package/src/indexing/ingest/inventory.js +254 -19
  334. package/src/indexing/ingest/materials.js +3 -9
  335. package/src/indexing/ingest/style-evidence.js +181 -0
  336. package/src/knowledge/source.js +3 -3
  337. package/src/lib/account-session.js +11 -4
  338. package/src/lib/app-authority.js +172 -0
  339. package/src/lib/auth.js +94 -21
  340. package/src/lib/core-client.js +5 -6
  341. package/src/lib/credentials-audit.js +451 -0
  342. package/src/lib/deploy/health.js +24 -6
  343. package/src/lib/detect-context.js +7 -1
  344. package/src/lib/google-cloud-connection.js +270 -0
  345. package/src/lib/google-cloud-inventory.js +385 -0
  346. package/src/lib/google-desktop-oauth.js +372 -0
  347. package/src/lib/google-studio-brokered-oauth.js +158 -0
  348. package/src/lib/identity-scaffold.js +24 -6
  349. package/src/lib/init-options.js +192 -0
  350. package/src/lib/local-scaffold.js +48 -16
  351. package/src/lib/provider-command-remediation.js +308 -0
  352. package/src/lib/provider-credentials.js +8 -0
  353. package/src/lib/scaffold/index.js +8 -2
  354. package/src/lib/scaffold/mcp-server.js +43 -0
  355. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  356. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  357. package/src/lib/scaffold/wizards/cms.js +93 -0
  358. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  359. package/src/lib/setup/contract.js +26 -0
  360. package/src/lib/setup/discover.js +116 -0
  361. package/src/lib/setup/execute.js +205 -0
  362. package/src/lib/setup/planner.js +134 -0
  363. package/src/lib/setup/recipes.js +235 -0
  364. package/src/lib/setup/runtime-persist.js +197 -0
  365. package/src/lib/setup/runtime.js +394 -0
  366. package/src/lib/slash-commands.js +2 -0
  367. package/src/lib/terminal/machine-identity.js +95 -0
  368. package/src/lib/terminal-local.js +164 -0
  369. package/src/lib/terminal-scopes.js +52 -0
  370. package/src/lib/whoami-capabilities.js +184 -0
  371. package/src/local-pty/server.js +34 -5
  372. package/src/mcp/authority.js +58 -108
  373. package/src/mcp/client-adapters.js +68 -144
  374. package/src/mcp/client.js +142 -122
  375. package/src/mcp/cloudflare-bundles.js +225 -0
  376. package/src/mcp/index.js +12 -0
  377. package/src/plugins/cloudflare.js +1 -1
  378. package/src/providers/ollama-chat.js +2 -1
  379. package/src/sam/types.js +27 -2
  380. package/src/security/inventory.js +12 -2
  381. package/src/security/local-vault.js +2 -0
  382. package/src/security/scan.js +1 -1
  383. package/test/account-session.test.mjs +3 -3
  384. package/test/app-authority-context.test.mjs +32 -0
  385. package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
  386. package/test/cli/mcp-client.test.mjs +21 -10
  387. package/test/cli/runtime-persist.test.mjs +56 -0
  388. package/test/cli/rust-command.test.mjs +21 -0
  389. package/test/credentials-audit.test.mjs +113 -0
  390. package/test/deploy-health-scan.test.mjs +29 -1
  391. package/test/gcloud-auth.test.mjs +111 -0
  392. package/test/google-cloud-connection.test.mjs +83 -0
  393. package/test/google-cloud-inventory.test.mjs +64 -0
  394. package/test/init-options.test.mjs +35 -0
  395. package/test/integration/app-command.test.mjs +30 -0
  396. package/test/integration/cad-project.test.mjs +4 -1
  397. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  398. package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
  399. package/test/integration/codebaseindex-ingest.test.mjs +48 -0
  400. package/test/integration/features-resolve.test.mjs +30 -11
  401. package/test/integration/inspect-path-cli.test.mjs +46 -0
  402. package/test/integration/inventory-evidence.test.mjs +125 -0
  403. package/test/integration/runtime-status.integration.test.mjs +2 -1
  404. package/test/knowledge.test.mjs +35 -1
  405. package/test/loopback-oauth.test.mjs +53 -0
  406. package/test/ollama.test.mjs +22 -0
  407. package/test/security.test.mjs +23 -0
  408. package/test/setup-planner.test.mjs +74 -0
  409. package/test/setup-runtime.test.mjs +51 -0
  410. package/test/terminal/local-pty.mock.test.mjs +3 -1
  411. package/test/terminal-machine-identity.test.mjs +88 -0
  412. package/test/whoami-resume.test.mjs +27 -6
  413. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  414. package/packages/work-graph/prototype/README.md +0 -32
  415. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  416. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  417. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  418. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -1,655 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>AgentSam Timeline Demo</title>
7
- <style>
8
- :root{
9
- --bg:#090b12;
10
- --panel:#111522;
11
- --panel-2:#151a29;
12
- --panel-3:#1a2031;
13
- --line:#252c40;
14
- --text:#f5f7ff;
15
- --muted:#8f98ad;
16
- --accent:#7c5cff;
17
- --accent-2:#c15cff;
18
- --cyan:#5de1da;
19
- --pink:#ff5ca8;
20
- --orange:#ff9b63;
21
- --blue:#5fa8ff;
22
- --green:#45d99c;
23
- --danger:#ff6173;
24
- --shadow:0 20px 70px rgba(0,0,0,.45);
25
- --radius:18px;
26
- --sidebar:248px;
27
- --rail:64px;
28
- }
29
- *{box-sizing:border-box}
30
- html,body{height:100%}
31
- body{
32
- margin:0;
33
- font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
34
- background:
35
- radial-gradient(circle at 70% 10%,rgba(124,92,255,.18),transparent 35%),
36
- radial-gradient(circle at 10% 90%,rgba(255,92,168,.12),transparent 32%),
37
- #080a10;
38
- color:var(--text);
39
- overflow:hidden;
40
- }
41
- button,input{font:inherit}
42
- button{color:inherit}
43
- .app{display:grid;grid-template-columns:var(--rail) var(--sidebar) 1fr;height:100vh}
44
- .rail{
45
- border-right:1px solid var(--line);background:#0c0f18;padding:14px 10px;
46
- display:flex;flex-direction:column;align-items:center;gap:12px
47
- }
48
- .logo{
49
- width:40px;height:40px;border-radius:13px;display:grid;place-items:center;font-weight:900;
50
- background:linear-gradient(145deg,#4b8dff,#7a5cff 52%,#d65cff);box-shadow:0 10px 30px rgba(100,90,255,.28)
51
- }
52
- .rail-btn{
53
- width:42px;height:42px;border:0;background:transparent;border-radius:12px;color:#7f8799;
54
- cursor:pointer;display:grid;place-items:center;transition:.2s
55
- }
56
- .rail-btn:hover,.rail-btn.active{background:#171c2a;color:white;transform:translateY(-1px)}
57
- .rail-spacer{flex:1}
58
- .avatar{width:34px;height:34px;border-radius:50%;background:linear-gradient(145deg,#ffc17d,#8e5cff);border:2px solid #23293a}
59
- .sidebar{
60
- background:linear-gradient(180deg,#111522,#0f131e);border-right:1px solid var(--line);
61
- padding:16px 14px;overflow:auto
62
- }
63
- .search{
64
- display:flex;align-items:center;gap:10px;background:#171c2a;border:1px solid #222a3d;
65
- border-radius:12px;padding:10px 12px;color:var(--muted);margin-bottom:16px
66
- }
67
- .search input{width:100%;border:0;outline:0;background:transparent;color:white}
68
- .side-link,.project-row{
69
- width:100%;border:0;background:transparent;color:#9da6ba;display:flex;align-items:center;gap:10px;
70
- padding:9px 10px;border-radius:10px;cursor:pointer;text-align:left
71
- }
72
- .side-link:hover,.project-row:hover{background:#171d2b;color:white}
73
- .side-link.active,.project-row.active{background:linear-gradient(90deg,rgba(124,92,255,.26),rgba(124,92,255,.06));color:white}
74
- .badge{margin-left:auto;background:#2778ff;color:#fff;font-size:11px;padding:2px 6px;border-radius:999px}
75
- .section-title{
76
- font-size:10px;font-weight:800;letter-spacing:.12em;color:#60697e;margin:18px 10px 7px;text-transform:uppercase
77
- }
78
- .dot{width:9px;height:9px;border-radius:3px;flex:none}
79
- .subprojects{margin-left:18px;border-left:1px solid #252c3f;padding-left:7px}
80
- .main{display:flex;flex-direction:column;min-width:0;background:#0b0e16}
81
- .topbar{
82
- height:70px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:14px;padding:0 20px;
83
- background:rgba(12,15,24,.88);backdrop-filter:blur(16px);z-index:20
84
- }
85
- .title-wrap{display:flex;align-items:center;gap:10px;min-width:220px}
86
- .project-icon{width:28px;height:28px;border-radius:8px;background:linear-gradient(145deg,#7d5cff,#c15cff);display:grid;place-items:center}
87
- .title{font-weight:800}
88
- .team{display:flex;margin-left:4px}
89
- .team span{width:26px;height:26px;border-radius:50%;border:2px solid #111522;margin-left:-7px;background:linear-gradient(145deg,#4fe0ca,#805cff)}
90
- .team span:nth-child(2){background:linear-gradient(145deg,#ffbc64,#ff5ca8)}
91
- .team span:nth-child(3){background:linear-gradient(145deg,#6ea9ff,#685cff)}
92
- .member-count{font-size:12px;color:#ff708f}
93
- .view-tabs{margin:auto;display:flex;background:#151a28;border:1px solid #2a3145;border-radius:10px;padding:3px}
94
- .view-tab{border:0;background:transparent;color:#8e97ab;padding:8px 15px;border-radius:8px;cursor:pointer}
95
- .view-tab.active{background:linear-gradient(135deg,#266eff,#6d5cff);color:white;box-shadow:0 6px 18px rgba(66,101,255,.25)}
96
- .top-actions{display:flex;gap:8px}
97
- .ghost,.primary{
98
- border:1px solid #293148;background:#151a28;border-radius:10px;padding:9px 12px;cursor:pointer
99
- }
100
- .ghost:hover{background:#1b2233}
101
- .primary{border-color:transparent;background:linear-gradient(135deg,#296dff,#755cff)}
102
- .toolbar{
103
- height:54px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;padding:0 18px;background:#101420
104
- }
105
- .toolbar .spacer{flex:1}
106
- .toggle{width:36px;height:20px;border-radius:999px;background:#252d42;padding:2px;cursor:pointer}
107
- .toggle::after{content:"";display:block;width:16px;height:16px;border-radius:50%;background:#73809a;transition:.2s}
108
- .toggle.on{background:#5d58ff}.toggle.on::after{transform:translateX(16px);background:white}
109
- .workspace{position:relative;flex:1;overflow:auto}
110
- .gantt{min-width:1220px;display:grid;grid-template-columns:280px 1fr;position:relative}
111
- .task-col{
112
- position:sticky;left:0;z-index:7;background:#101420;border-right:1px solid var(--line);
113
- box-shadow:12px 0 28px rgba(0,0,0,.18)
114
- }
115
- .timeline{position:relative;background:#0c1019}
116
- .timeline::before{
117
- content:"";position:absolute;inset:74px 0 0 0;
118
- background-image:
119
- linear-gradient(to right,rgba(255,255,255,.045) 1px,transparent 1px),
120
- linear-gradient(to bottom,rgba(255,255,255,.045) 1px,transparent 1px);
121
- background-size:48px 100%,100% 54px;pointer-events:none
122
- }
123
- .head{height:74px;border-bottom:1px solid var(--line);background:#111522;position:sticky;top:0;z-index:8}
124
- .task-head{padding:16px 14px;font-size:12px;color:#7d879c;display:flex;justify-content:space-between;align-items:center}
125
- .month-row{height:25px;display:flex;align-items:center;color:#697287;font-size:10px;font-weight:800;text-transform:uppercase}
126
- .month-row span{padding-left:12px}
127
- .day-row{height:49px;display:grid;grid-template-columns:repeat(var(--day-count,28),48px)}
128
- .day{
129
- border-left:1px solid #262d40;display:flex;flex-direction:column;align-items:center;justify-content:center;
130
- color:#8d96a9;font-size:10px;gap:4px
131
- }
132
- .day b{font-size:12px;color:#cbd1df}
133
- .day.today{background:linear-gradient(180deg,rgba(61,111,255,.55),rgba(61,111,255,.06));color:white}
134
- .day.today b{color:white}
135
- .task-row{height:54px;border-bottom:1px solid #202638;display:flex;align-items:center;padding:0 12px;gap:10px}
136
- .task-row.group{background:#131827;font-weight:800}
137
- .chev{color:#626d83}
138
- .task-name{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
139
- .task-meta{font-size:11px;color:#687186;margin-left:auto}
140
- .track-row{height:54px;border-bottom:1px solid #202638;position:relative}
141
- .bar{
142
- position:absolute;top:12px;height:30px;border-radius:8px;padding:0 10px;display:flex;align-items:center;
143
- gap:7px;font-size:11px;font-weight:700;cursor:pointer;box-shadow:0 8px 20px rgba(0,0,0,.25);
144
- border:1px solid rgba(255,255,255,.15);overflow:hidden;white-space:nowrap;transition:.18s
145
- }
146
- .bar:hover{transform:translateY(-2px);filter:brightness(1.12)}
147
- .bar .mini{width:18px;height:18px;border-radius:50%;background:rgba(255,255,255,.35);display:grid;place-items:center;font-size:9px}
148
- .bar.purple{background:linear-gradient(90deg,#8f54ff,#c356e8)}
149
- .bar.cyan{background:linear-gradient(90deg,#28bfc9,#68e6d8);color:#072b2c}
150
- .bar.pink{background:linear-gradient(90deg,#ff4c9d,#ff74c8)}
151
- .bar.orange{background:linear-gradient(90deg,#ff8d4c,#ffb06f);color:#3b1a08}
152
- .bar.blue{background:linear-gradient(90deg,#397fff,#67b4ff)}
153
- .bar.green{background:linear-gradient(90deg,#2ec788,#62e7b2);color:#083326}
154
- .bar.gray{background:linear-gradient(90deg,#5a6478,#8a93a8);color:#0e121c}
155
- .bar.red{background:linear-gradient(90deg,#ff4d6d,#ff7a8a)}
156
- .bar.blocked::after{content:"Blocked";margin-left:auto;background:rgba(65,0,12,.35);padding:2px 5px;border-radius:5px}
157
- .today-line{position:absolute;top:0;bottom:0;left:0;width:1px;background:#377dff;z-index:6;box-shadow:0 0 14px #377dff;display:none}
158
- .today-line.visible{display:block}
159
- .today-line::before{content:"";position:absolute;top:67px;left:-4px;width:9px;height:9px;border-radius:50%;background:#377dff}
160
- .event-marker{
161
- position:absolute;top:78px;bottom:8px;width:2px;background:rgba(255,201,92,.75);z-index:5;pointer-events:none
162
- }
163
- .event-marker span{
164
- position:absolute;top:0;left:6px;white-space:nowrap;font-size:10px;color:#ffc95c;background:rgba(18,22,34,.85);
165
- border:1px solid rgba(255,201,92,.35);border-radius:6px;padding:2px 6px
166
- }
167
- .fab{
168
- position:fixed;right:24px;bottom:24px;width:54px;height:54px;border-radius:50%;border:0;
169
- background:linear-gradient(145deg,#ff6a74,#ff4fb0);font-size:26px;cursor:pointer;box-shadow:0 15px 34px rgba(255,79,148,.35);z-index:30
170
- }
171
- .drawer{
172
- position:fixed;top:0;right:-420px;width:400px;height:100vh;background:#121725;border-left:1px solid #293046;
173
- z-index:50;box-shadow:-24px 0 70px rgba(0,0,0,.45);transition:.28s;padding:22px;overflow:auto
174
- }
175
- .drawer.open{right:0}
176
- .drawer-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}
177
- .close{border:0;background:#1b2131;border-radius:10px;width:36px;height:36px;cursor:pointer}
178
- .drawer h2{font-size:22px;margin:8px 0}
179
- .label{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:#6f7890;margin:20px 0 8px}
180
- .status-pill{display:inline-flex;gap:7px;align-items:center;padding:7px 10px;border-radius:999px;background:rgba(69,217,156,.12);color:#68e6b5;border:1px solid rgba(69,217,156,.24)}
181
- .detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
182
- .card{background:#191f2f;border:1px solid #282f44;border-radius:12px;padding:12px}
183
- .card small{color:#748097}.card b{display:block;margin-top:6px}
184
- .activity{display:flex;gap:10px;padding:12px 0;border-bottom:1px solid #242b3e}
185
- .activity i{width:9px;height:9px;border-radius:50%;background:#755cff;margin-top:5px}
186
- .modal-backdrop{position:fixed;inset:0;background:rgba(3,5,10,.68);backdrop-filter:blur(6px);z-index:60;display:none;place-items:center}
187
- .modal-backdrop.open{display:grid}
188
- .modal{width:min(520px,92vw);background:#131827;border:1px solid #2a3247;border-radius:18px;padding:22px;box-shadow:var(--shadow)}
189
- .modal input,.modal select{
190
- width:100%;background:#0e121c;border:1px solid #283047;border-radius:10px;color:white;padding:12px;margin-top:7px
191
- }
192
- .modal-actions{display:flex;justify-content:flex-end;gap:9px;margin-top:20px}
193
- .board,.list-view{display:none;padding:22px;overflow:auto;height:100%}
194
- .board.active,.list-view.active{display:block}.gantt.hidden{display:none}
195
- .columns{display:grid;grid-template-columns:repeat(4,minmax(250px,1fr));gap:14px;min-width:1100px}
196
- .column{background:#111522;border:1px solid #252c40;border-radius:16px;padding:12px}
197
- .column h3{font-size:13px;color:#aab2c5;margin:4px 4px 12px}
198
- .ticket{background:#191f2f;border:1px solid #293149;border-radius:12px;padding:13px;margin-bottom:10px;cursor:pointer}
199
- .ticket:hover{transform:translateY(-1px);border-color:#4f5c82}
200
- .ticket p{font-size:13px;margin:8px 0;color:#d6dbea}.ticket small{color:#727d94}
201
- .list-table{width:100%;border-collapse:collapse;background:#111522;border:1px solid #252c40;border-radius:16px;overflow:hidden}
202
- .list-table th,.list-table td{padding:13px;border-bottom:1px solid #242b3d;text-align:left;font-size:13px}
203
- .list-table th{color:#7d879c;background:#151a28}
204
- @media(max-width:900px){
205
- :root{--sidebar:210px;--rail:54px}
206
- .member-count,.team,.top-actions .ghost{display:none}
207
- .title-wrap{min-width:auto}
208
- }
209
- @media(max-width:680px){
210
- .app{grid-template-columns:54px 1fr}
211
- .sidebar{display:none}
212
- .main{grid-column:2}
213
- .view-tab{padding:7px 10px}
214
- .topbar{padding:0 10px}
215
- .drawer{width:100%}
216
- }
217
- </style>
218
- </head>
219
- <body>
220
- <div class="app">
221
- <aside class="rail">
222
- <div class="logo">S</div>
223
- <button class="rail-btn active" title="Workspace">⌂</button>
224
- <button class="rail-btn" title="Tasks">▣</button>
225
- <button class="rail-btn" title="Runs">⌘</button>
226
- <button class="rail-btn" title="Agents">◉</button>
227
- <button class="rail-btn" title="Analytics">⌁</button>
228
- <div class="rail-spacer"></div>
229
- <button class="rail-btn">?</button>
230
- <div class="avatar"></div>
231
- </aside>
232
-
233
- <aside class="sidebar">
234
- <div class="search">⌕ <input placeholder="Quick Find" /></div>
235
- <button class="side-link">◌ My Tasks <span class="badge" id="myTasksBadge">0</span></button>
236
- <button class="side-link">▦ Everything <span class="badge" id="everythingBadge">0</span></button>
237
-
238
- <div class="section-title">Favorites</div>
239
- <button class="side-link">◇ Platform Roadmap</button>
240
- <button class="side-link">◈ Deployments</button>
241
-
242
- <div class="section-title">Projects</div>
243
- <button class="project-row active"><span class="dot" style="background:#b356e8"></span><span id="sidebarProjectName">WorkGraph</span> <span class="badge" id="sidebarProjectCount">0</span></button>
244
- <div class="subprojects">
245
- <button class="project-row active" data-project="timeline">Timeline</button>
246
- </div>
247
-
248
- <div class="section-title">Actors</div>
249
- <div id="actorList"></div>
250
- </aside>
251
-
252
- <main class="main">
253
- <header class="topbar">
254
- <div class="title-wrap">
255
- <div class="project-icon">▦</div>
256
- <div class="title" id="projectTitle">WorkGraph</div>
257
- </div>
258
- <div class="team" id="teamAvatars"></div>
259
- <div class="member-count" id="memberCount">+ 0 agents</div>
260
- <div class="view-tabs">
261
- <button class="view-tab" data-view="list">List</button>
262
- <button class="view-tab active" data-view="gantt">Gantt</button>
263
- <button class="view-tab" data-view="board">Board</button>
264
- </div>
265
- <div class="top-actions">
266
- <button class="ghost" id="jumpToday">Today</button>
267
- <button class="primary">Share</button>
268
- <button class="ghost">•••</button>
269
- </div>
270
- </header>
271
-
272
- <div class="toolbar">
273
- <button class="ghost">⌁ Filter</button>
274
- <button class="ghost">All Tasks ▾</button>
275
- <span style="font-size:12px;color:#8b95a9">Assigned to me</span>
276
- <div class="toggle" id="assignedToggle"></div>
277
- <div class="spacer"></div>
278
- <button class="ghost" id="zoomOut">−</button>
279
- <span style="font-size:12px;color:#818ba0" id="zoomLabel">100%</span>
280
- <button class="ghost" id="zoomIn">+</button>
281
- </div>
282
-
283
- <section class="workspace">
284
- <div class="gantt" id="gantt">
285
- <div class="task-col">
286
- <div class="head task-head"><span>Workstream</span><span>Owner</span></div>
287
- <div id="taskRows"></div>
288
- </div>
289
-
290
- <div class="timeline" id="timeline">
291
- <div class="head">
292
- <div class="month-row" id="monthRow"></div>
293
- <div class="day-row" id="dayRow"></div>
294
- </div>
295
- <div class="today-line" id="todayLine"></div>
296
- <div id="eventMarkers"></div>
297
- <div id="trackRows"></div>
298
- </div>
299
- </div>
300
-
301
- <div class="board" id="board">
302
- <div class="columns" id="boardColumns"></div>
303
- </div>
304
-
305
- <div class="list-view" id="listView">
306
- <table class="list-table">
307
- <thead><tr><th>Task</th><th>Status</th><th>Owner</th><th>Start</th><th>Due</th><th>Artifacts</th></tr></thead>
308
- <tbody id="listBody"></tbody>
309
- </table>
310
- </div>
311
- </section>
312
- </main>
313
- </div>
314
-
315
- <button class="fab" id="addTask">+</button>
316
-
317
- <aside class="drawer" id="drawer">
318
- <div class="drawer-head"><strong>Task details</strong><button class="close" id="closeDrawer">×</button></div>
319
- <div class="status-pill" id="drawerStatus">● queued</div>
320
- <h2 id="drawerTitle">Select a task</h2>
321
- <p id="drawerSummary" style="color:#8e98ad;line-height:1.6">WorkGraph projection — open a bar or ticket to inspect evidence.</p>
322
- <div class="label">Overview</div>
323
- <div class="detail-grid">
324
- <div class="card"><small>Owner</small><b id="drawerOwner">—</b></div>
325
- <div class="card"><small>Status</small><b id="drawerStatusText">—</b></div>
326
- <div class="card"><small>Start</small><b id="drawerStart">—</b></div>
327
- <div class="card"><small>Due</small><b id="drawerEnd">—</b></div>
328
- </div>
329
- <div class="label">Artifacts / evidence</div>
330
- <div class="card"><small>Artifacts</small><b id="drawerArtifacts">—</b></div>
331
- <div class="card" style="margin-top:8px"><small>Evidence</small><b id="drawerEvidence">—</b></div>
332
- <div class="label">Dependencies</div>
333
- <div class="card"><small>Depends on</small><b id="drawerDeps">—</b></div>
334
- </aside>
335
-
336
- <div class="modal-backdrop" id="modal">
337
- <div class="modal">
338
- <h2 style="margin-top:0">Create task</h2>
339
- <label>Task name<input id="newTaskName" value="New platform task" /></label>
340
- <label style="display:block;margin-top:14px">Owner
341
- <select id="newTaskOwner"></select>
342
- </label>
343
- <div class="modal-actions"><button class="ghost" id="cancelModal">Cancel</button><button class="primary" id="createTask">Create task</button></div>
344
- </div>
345
- </div>
346
-
347
- <script type="module">
348
- import { demoWorkGraph } from './prototype/data/demo-workgraph.js';
349
- import {
350
- buildTimelineBars,
351
- buildEventMarkers,
352
- getWorkItemDetails,
353
- } from './prototype/renderers/workgraph-runtime.js';
354
- import { buildTimelineModel, getStatusClass } from './prototype/renderers/timeline-model.js';
355
-
356
- const DAY_W = 48;
357
- const DAY_NAMES = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
358
- const STATUS_BOARD = {
359
- queued: 'Backlog',
360
- running: 'In progress',
361
- blocked: 'Blocked',
362
- complete: 'Done',
363
- };
364
-
365
- const graph = demoWorkGraph;
366
- const model = buildTimelineModel(graph);
367
- const bars = buildTimelineBars(graph);
368
- const events = buildEventMarkers(graph);
369
- const actorsById = Object.fromEntries((graph.actors || []).map((a) => [a.id, a]));
370
-
371
- function parseDay(value) {
372
- return new Date(`${value}T00:00:00`);
373
- }
374
-
375
- function formatShort(value) {
376
- const d = parseDay(value);
377
- return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
378
- }
379
-
380
- function initials(name = '') {
381
- return String(name)
382
- .split(/\s+/)
383
- .filter(Boolean)
384
- .slice(0, 2)
385
- .map((p) => p[0]?.toUpperCase() || '')
386
- .join('') || '?';
387
- }
388
-
389
- function dayIndex(date, rangeStart) {
390
- return Math.round((date - rangeStart) / 86400000);
391
- }
392
-
393
- function computeRange() {
394
- const starts = bars.map((b) => parseDay(b.start).getTime());
395
- const ends = bars.map((b) => parseDay(b.end).getTime());
396
- const min = Math.min(...starts);
397
- const max = Math.max(...ends);
398
- const start = new Date(min - 1 * 86400000);
399
- const end = new Date(max + 2 * 86400000);
400
- const days = Math.max(14, dayIndex(end, start) + 1);
401
- return { start, days };
402
- }
403
-
404
- const range = computeRange();
405
-
406
- function renderChrome() {
407
- document.getElementById('projectTitle').textContent = graph.title;
408
- document.getElementById('sidebarProjectName').textContent = graph.title;
409
- document.getElementById('sidebarProjectCount').textContent = String(bars.length);
410
- document.getElementById('myTasksBadge').textContent = String(bars.filter((b) => b.owner === 'sam').length);
411
- document.getElementById('everythingBadge').textContent = String(bars.length);
412
-
413
- const agents = (graph.actors || []).filter((a) => a.type === 'agent');
414
- document.getElementById('memberCount').textContent = `+ ${agents.length} agents`;
415
- document.getElementById('teamAvatars').innerHTML = (graph.actors || [])
416
- .slice(0, 3)
417
- .map(() => '<span></span>')
418
- .join('');
419
-
420
- document.getElementById('actorList').innerHTML = (graph.actors || [])
421
- .map((actor) => {
422
- const count = bars.filter((b) => b.owner === actor.id).length;
423
- return `<button class="side-link">${actor.type === 'agent' ? '◉' : '◇'} ${actor.name} <span class="badge">${count}</span></button>`;
424
- })
425
- .join('');
426
-
427
- const ownerSelect = document.getElementById('newTaskOwner');
428
- ownerSelect.innerHTML = (graph.actors || [])
429
- .map((a) => `<option value="${a.id}">${a.name}</option>`)
430
- .join('');
431
- }
432
-
433
- function renderDays() {
434
- const dayRow = document.getElementById('dayRow');
435
- const monthRow = document.getElementById('monthRow');
436
- dayRow.style.setProperty('--day-count', String(range.days));
437
- dayRow.innerHTML = '';
438
-
439
- const months = [];
440
- const today = new Date();
441
- today.setHours(0, 0, 0, 0);
442
-
443
- for (let i = 0; i < range.days; i++) {
444
- const d = new Date(range.start.getTime() + i * 86400000);
445
- const el = document.createElement('div');
446
- const isToday = d.getTime() === today.getTime();
447
- el.className = 'day' + (isToday ? ' today' : '');
448
- el.innerHTML = `<b>${d.getDate()}</b><span>${DAY_NAMES[d.getDay()]}</span>`;
449
- dayRow.appendChild(el);
450
-
451
- const key = `${d.getFullYear()}-${d.getMonth()}`;
452
- const last = months[months.length - 1];
453
- if (!last || last.key !== key) {
454
- months.push({
455
- key,
456
- label: d.toLocaleDateString('en-US', { month: 'long', year: 'numeric' }),
457
- width: DAY_W,
458
- });
459
- } else {
460
- last.width += DAY_W;
461
- }
462
- }
463
-
464
- monthRow.innerHTML = months
465
- .map((m) => `<span style="width:${m.width}px">${m.label}</span>`)
466
- .join('');
467
-
468
- const todayOffset = dayIndex(today, range.start);
469
- const todayLine = document.getElementById('todayLine');
470
- if (todayOffset >= 0 && todayOffset < range.days) {
471
- todayLine.style.left = `${todayOffset * DAY_W + DAY_W / 2}px`;
472
- todayLine.classList.add('visible');
473
- }
474
- }
475
-
476
- function openDrawer(itemId) {
477
- const item = getWorkItemDetails(graph, itemId);
478
- if (!item) return;
479
- const owner = actorsById[item.owner];
480
- document.getElementById('drawerTitle').textContent = item.title;
481
- document.getElementById('drawerStatus').textContent = `● ${item.status}`;
482
- document.getElementById('drawerStatusText').textContent = item.status;
483
- document.getElementById('drawerOwner').textContent = owner?.name || item.owner;
484
- document.getElementById('drawerStart').textContent = formatShort(item.start);
485
- document.getElementById('drawerEnd').textContent = formatShort(item.end);
486
- document.getElementById('drawerArtifacts').textContent = (item.artifacts || []).join(', ') || '—';
487
- document.getElementById('drawerEvidence').textContent = (item.evidence || []).join(', ') || '—';
488
- document.getElementById('drawerDeps').textContent = (item.dependencies || []).join(', ') || 'none';
489
- document.getElementById('drawerSummary').textContent =
490
- `Projection of WorkGraph item "${item.id}". Timeline is not the source of truth.`;
491
- document.getElementById('drawer').classList.add('open');
492
- }
493
-
494
- function renderGantt() {
495
- const taskRows = document.getElementById('taskRows');
496
- const trackRows = document.getElementById('trackRows');
497
- const eventHost = document.getElementById('eventMarkers');
498
-
499
- taskRows.innerHTML = '';
500
- trackRows.innerHTML = '';
501
- eventHost.innerHTML = '';
502
-
503
- const group = document.createElement('div');
504
- group.className = 'task-row group';
505
- group.innerHTML = `<span class="chev">▾</span><span class="task-name">${graph.title}</span><span class="task-meta">${bars.length}</span>`;
506
- taskRows.appendChild(group);
507
-
508
- const groupTrack = document.createElement('div');
509
- groupTrack.className = 'track-row';
510
- trackRows.appendChild(groupTrack);
511
-
512
- for (const item of bars) {
513
- const owner = actorsById[item.owner];
514
- const statusClass = getStatusClass(item.status);
515
- const start = parseDay(item.start);
516
- const end = parseDay(item.end);
517
- const left = dayIndex(start, range.start) * DAY_W;
518
- const width = Math.max(DAY_W, (dayIndex(end, range.start) - dayIndex(start, range.start) + 1) * DAY_W);
519
-
520
- const row = document.createElement('div');
521
- row.className = 'task-row';
522
- row.innerHTML = `<span class="dot" style="background:#b356e8"></span><span class="task-name">${item.label}</span><span class="task-meta">${owner?.name || item.owner}</span>`;
523
- taskRows.appendChild(row);
524
-
525
- const track = document.createElement('div');
526
- track.className = 'track-row';
527
- const bar = document.createElement('div');
528
- bar.className = `bar ${statusClass}` + (item.status === 'blocked' ? ' blocked' : '');
529
- bar.style.left = `${left}px`;
530
- bar.style.width = `${width}px`;
531
- bar.dataset.taskId = item.id;
532
- bar.innerHTML = `<span class="mini">${initials(owner?.name || item.owner)}</span>${item.label}`;
533
- bar.addEventListener('click', () => openDrawer(item.id));
534
- track.appendChild(bar);
535
- trackRows.appendChild(track);
536
- }
537
-
538
- for (const event of events) {
539
- const stamp = event.timestamp.slice(0, 10);
540
- const idx = dayIndex(parseDay(stamp), range.start);
541
- if (idx < 0 || idx >= range.days) continue;
542
- const marker = document.createElement('div');
543
- marker.className = 'event-marker';
544
- marker.style.left = `${idx * DAY_W + DAY_W / 2}px`;
545
- marker.innerHTML = `<span>${event.label}</span>`;
546
- eventHost.appendChild(marker);
547
- }
548
- }
549
-
550
- function renderBoard() {
551
- const columns = ['queued', 'running', 'blocked', 'complete'];
552
- const host = document.getElementById('boardColumns');
553
- host.innerHTML = columns
554
- .map((status) => {
555
- const items = bars.filter((b) => b.status === status);
556
- const tickets = items
557
- .map((item) => {
558
- const owner = actorsById[item.owner];
559
- return `<div class="ticket" data-task-id="${item.id}"><small>${item.id}</small><p>${item.label}</p><small>${owner?.name || item.owner} · ${formatShort(item.start)} → ${formatShort(item.end)}</small></div>`;
560
- })
561
- .join('');
562
- return `<div class="column"><h3>${STATUS_BOARD[status]} · ${items.length}</h3>${tickets || '<div class="ticket"><small>empty</small><p>No items</p></div>'}</div>`;
563
- })
564
- .join('');
565
-
566
- host.querySelectorAll('.ticket[data-task-id]').forEach((el) => {
567
- el.addEventListener('click', () => openDrawer(el.dataset.taskId));
568
- });
569
- }
570
-
571
- function renderList() {
572
- const body = document.getElementById('listBody');
573
- body.innerHTML = bars
574
- .map((item) => {
575
- const owner = actorsById[item.owner];
576
- return `<tr data-task-id="${item.id}" style="cursor:pointer"><td>${item.label}</td><td>${item.status}</td><td>${owner?.name || item.owner}</td><td>${formatShort(item.start)}</td><td>${formatShort(item.end)}</td><td>${(item.artifacts || []).length}</td></tr>`;
577
- })
578
- .join('');
579
- body.querySelectorAll('tr[data-task-id]').forEach((row) => {
580
- row.addEventListener('click', () => openDrawer(row.dataset.taskId));
581
- });
582
- }
583
-
584
- function bindChrome() {
585
- const gantt = document.getElementById('gantt');
586
- const board = document.getElementById('board');
587
- const listView = document.getElementById('listView');
588
- document.querySelectorAll('.view-tab').forEach((btn) => {
589
- btn.addEventListener('click', () => {
590
- document.querySelectorAll('.view-tab').forEach((b) => b.classList.remove('active'));
591
- btn.classList.add('active');
592
- gantt.classList.toggle('hidden', btn.dataset.view !== 'gantt');
593
- board.classList.toggle('active', btn.dataset.view === 'board');
594
- listView.classList.toggle('active', btn.dataset.view === 'list');
595
- });
596
- });
597
-
598
- document.getElementById('closeDrawer').onclick = () => document.getElementById('drawer').classList.remove('open');
599
- const modal = document.getElementById('modal');
600
- document.getElementById('addTask').onclick = () => modal.classList.add('open');
601
- document.getElementById('cancelModal').onclick = () => modal.classList.remove('open');
602
- document.getElementById('createTask').onclick = () => {
603
- modal.classList.remove('open');
604
- const name = document.getElementById('newTaskName').value.trim() || 'New task';
605
- alert(`Demo only — would append "${name}" to WorkGraph (not persisted).`);
606
- };
607
- modal.addEventListener('click', (e) => {
608
- if (e.target === modal) modal.classList.remove('open');
609
- });
610
- document.getElementById('assignedToggle').onclick = function () {
611
- this.classList.toggle('on');
612
- };
613
-
614
- let zoom = 100;
615
- const timeline = document.getElementById('timeline');
616
- function setZoom() {
617
- document.getElementById('zoomLabel').textContent = `${zoom}%`;
618
- timeline.style.transformOrigin = 'top left';
619
- timeline.style.zoom = zoom / 100;
620
- }
621
- document.getElementById('zoomIn').onclick = () => {
622
- zoom = Math.min(140, zoom + 10);
623
- setZoom();
624
- };
625
- document.getElementById('zoomOut').onclick = () => {
626
- zoom = Math.max(70, zoom - 10);
627
- setZoom();
628
- };
629
- document.getElementById('jumpToday').onclick = () => {
630
- const line = document.getElementById('todayLine');
631
- if (line.classList.contains('visible')) {
632
- line.scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' });
633
- }
634
- };
635
-
636
- document.addEventListener('keydown', (e) => {
637
- if (e.key === 'Escape') {
638
- document.getElementById('drawer').classList.remove('open');
639
- modal.classList.remove('open');
640
- }
641
- });
642
-
643
- // Keep model in scope for console inspection during prototype work.
644
- window.__workgraph = { graph, model, bars, events };
645
- }
646
-
647
- renderChrome();
648
- renderDays();
649
- renderGantt();
650
- renderBoard();
651
- renderList();
652
- bindChrome();
653
- </script>
654
- </body>
655
- </html>