@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.
- package/AGENTSAM.md +11 -0
- package/README.md +15 -9
- package/apps/client-cms-editor/AGENTS.md +12 -0
- package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
- package/apps/client-cms-editor/README.md +72 -0
- package/apps/client-cms-editor/agentsam.app.json +57 -0
- package/apps/client-cms-editor/backend/README.md +5 -0
- package/apps/client-cms-editor/backend/package.json +22 -0
- package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
- package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
- package/apps/client-cms-editor/backend/src/index.ts +6 -0
- package/apps/client-cms-editor/backend/src/model.ts +115 -0
- package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
- package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
- package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
- package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
- package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
- package/apps/client-cms-editor/backend/tsconfig.json +15 -0
- package/apps/client-cms-editor/backend/worker/index.js +34 -0
- package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
- package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
- package/apps/client-cms-editor/frontend/index.html +12 -0
- package/apps/client-cms-editor/frontend/package.json +33 -0
- package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
- package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
- package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
- package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
- package/apps/client-cms-editor/frontend/src/index.ts +8 -0
- package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
- package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
- package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
- package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
- package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
- package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
- package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
- package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
- package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
- package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
- package/apps/client-cms-editor/package-lock.json +3832 -0
- package/apps/client-cms-editor/package.json +23 -0
- package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
- package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
- package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
- package/apps/client-cms-editor/shared/cms/package.json +21 -0
- package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
- package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
- package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
- package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
- package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
- package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
- package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
- package/bin/agentsam-rapid-rust +36 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
- package/docs/MACHINE_INTELLIGENCE.md +120 -0
- package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
- package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
- package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
- package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
- package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
- package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
- package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
- package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
- package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
- package/docs/contracts/capability-install-planner.md +67 -0
- package/docs/contracts/environment-vocabulary.md +195 -0
- package/docs/contracts/google-cloud-oauth-setup.md +199 -0
- package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
- package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
- package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
- package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
- package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
- package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
- package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
- package/docs/plugins.md +2 -2
- package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
- package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
- package/docs/product/README.md +8 -0
- package/docs/rapid-rust-wasm.md +35 -0
- package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
- package/package.json +73 -14
- package/packages/agentsam-brand/README.md +106 -11
- package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
- package/packages/agentsam-brand/package.json +39 -7
- package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
- package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
- package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
- package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
- package/packages/agentsam-brand/src/adapters/memory.js +31 -0
- package/packages/agentsam-brand/src/cli/controller.js +503 -0
- package/packages/agentsam-brand/src/cli/wizard.js +526 -0
- package/packages/agentsam-brand/src/core/capabilities.js +201 -0
- package/packages/agentsam-brand/src/core/derivatives.js +211 -0
- package/packages/agentsam-brand/src/core/errors.js +12 -0
- package/packages/agentsam-brand/src/core/ingest.js +195 -0
- package/packages/agentsam-brand/src/core/inspect.js +109 -0
- package/packages/agentsam-brand/src/core/keys.js +83 -0
- package/packages/agentsam-brand/src/core/naming.js +142 -0
- package/packages/agentsam-brand/src/core/optimize.js +316 -0
- package/packages/agentsam-brand/src/core/pack.js +305 -0
- package/packages/agentsam-brand/src/core/plan.js +276 -0
- package/packages/agentsam-brand/src/core/preview.js +159 -0
- package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
- package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
- package/packages/agentsam-brand/src/core/processors/index.js +148 -0
- package/packages/agentsam-brand/src/core/processors/native.js +82 -0
- package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
- package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
- package/packages/agentsam-brand/src/core/promote.js +288 -0
- package/packages/agentsam-brand/src/core/receipts.js +155 -0
- package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
- package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
- package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
- package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
- package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
- package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
- package/packages/agentsam-brand/src/index.js +193 -36
- package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
- package/packages/agentsam-brand/src/presets/favicon.json +17 -0
- package/packages/agentsam-brand/src/presets/hero.json +12 -0
- package/packages/agentsam-brand/src/presets/index.js +40 -0
- package/packages/agentsam-brand/src/presets/logo.json +12 -0
- package/packages/agentsam-brand/src/presets/model.json +8 -0
- package/packages/agentsam-brand/src/presets/og-image.json +10 -0
- package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
- package/packages/agentsam-brand/src/presets/social-image.json +10 -0
- package/packages/agentsam-brand/src/presets/web-image.json +10 -0
- package/packages/agentsam-contracts/src/artifacts.ts +41 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
- package/packages/agentsam-knowledge/src/providers/index.js +6 -4
- package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
- package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
- package/packages/agentsam-nav/package.json +2 -2
- package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
- package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
- package/packages/agentsam-rapid-rust/README.md +5 -0
- package/packages/agentsam-rapid-rust/src/main.rs +718 -0
- package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
- package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
- package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-repository/src/index.js +1 -0
- package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
- package/packages/agentsam-repository/src/source-types.js +85 -0
- package/packages/agentsam-vault/README.md +96 -0
- package/packages/agentsam-vault/package.json +32 -0
- package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
- package/packages/agentsam-vault/src/contracts/credential.js +132 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
- package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
- package/packages/agentsam-vault/src/index.d.ts +9 -0
- package/packages/agentsam-vault/src/index.js +27 -0
- package/packages/agentsam-vault/src/providers/registry.js +90 -0
- package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
- package/packages/agentsam-workbench/README.md +24 -0
- package/packages/agentsam-workbench/package.json +38 -0
- package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
- package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
- package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
- package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
- package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
- package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
- package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
- package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
- package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
- package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
- package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
- package/packages/agentsam-workbench/src/agent/index.ts +10 -0
- package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
- package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
- package/packages/agentsam-workbench/src/browser/index.ts +1 -0
- package/packages/agentsam-workbench/src/index.ts +6 -0
- package/packages/agentsam-workbench/src/project-control.css +160 -0
- package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
- package/packages/agentsam-workbench/src/projects/index.ts +1 -0
- package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
- package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
- package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
- package/packages/agentsam-workbench/src/shell/index.ts +4 -0
- package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
- package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
- package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
- package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
- package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
- package/packages/agentsam-workbench/tsconfig.json +13 -0
- package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
- package/packages/connectors/cloudflare/package.json +3 -1
- package/packages/connectors/cloudflare/src/api-client.js +279 -0
- package/packages/connectors/cloudflare/src/capabilities.js +585 -0
- package/packages/connectors/cloudflare/src/credential.js +318 -0
- package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
- package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
- package/packages/connectors/cloudflare/src/families/pages.js +151 -0
- package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
- package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
- package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
- package/packages/connectors/cloudflare/src/families/tags.js +124 -0
- package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
- package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
- package/packages/connectors/cloudflare/src/index.js +102 -265
- package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
- package/packages/connectors/cloudflare/src/owner.js +42 -12
- package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
- package/packages/connectors/cloudflare/src/routes.js +309 -144
- package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
- package/packages/connectors/cloudflare/src/vault.js +2 -2
- package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
- package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
- package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
- package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
- package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
- package/packages/identity/README.md +1 -1
- package/packages/identity/backend/README.md +1 -1
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
- package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
- package/packages/identity/package.json +4 -3
- package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
- package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
- package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
- package/packages/identity/src/adapters/sqlite/index.js +4 -1
- package/packages/identity/src/contracts/auth-config.js +28 -8
- package/packages/identity/src/contracts/external-identity.js +1 -1
- package/packages/identity/src/contracts/provider.js +1 -0
- package/packages/identity/src/frontend/auth-portal/README.md +2 -1
- package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
- package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
- package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
- package/packages/identity/src/index.js +16 -0
- package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
- package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
- package/packages/identity/src/migrations/README.md +5 -2
- package/packages/identity/src/oauth/README.md +10 -5
- package/packages/identity/src/oauth/consent-view.js +388 -0
- package/packages/identity/src/oauth/credentials.js +31 -11
- package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
- package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
- package/packages/identity/src/providers/cloudflare/profile.js +49 -14
- package/packages/identity/src/providers/iam/index.js +27 -5
- package/packages/identity/src/server/identity-service.js +31 -2
- package/packages/identity/src/server/worker-router.js +111 -81
- package/packages/identity/tests/auth-config.test.mjs +3 -2
- package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
- package/packages/identity/tests/identity-service.test.mjs +16 -0
- package/packages/identity/tests/native-session-worker.test.mjs +64 -0
- package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
- package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
- package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
- package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
- package/packages/runtime-protocol/src/index.js +154 -0
- package/packages/theme-scenes/README.md +164 -0
- package/packages/theme-scenes/package.json +53 -0
- package/packages/theme-scenes/src/blocks/index.js +30 -0
- package/packages/theme-scenes/src/contracts/index.js +286 -0
- package/packages/theme-scenes/src/demos/index.js +65 -0
- package/packages/theme-scenes/src/index.js +75 -0
- package/packages/theme-scenes/src/presets/index.js +263 -0
- package/packages/theme-scenes/src/runtime/compile.js +119 -0
- package/packages/theme-scenes/src/scenes/index.js +146 -0
- package/packages/theme-scenes/src/shell/index.js +47 -0
- package/packages/theme-scenes/src/themes/index.js +129 -0
- package/packages/theme-scenes/src/visuals/index.js +41 -0
- package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
- package/packages/work-graph/src/index.js +34 -1
- package/packages/work-graph/src/renderers/gantt-model.js +24 -0
- package/packages/work-graph/test/work-graph.test.mjs +27 -7
- package/protocol/README.md +15 -7
- package/protocol/apps/agentsam.app.v1.schema.json +89 -7
- package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
- package/protocol/assets/README.md +9 -0
- package/protocol/assets/asset-record.v1.schema.json +64 -0
- package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
- package/protocol/scoring/README.md +10 -0
- package/protocol/scoring/scorecard.v1.schema.json +65 -0
- package/protocol/ui/icon-registry.mjs +1 -0
- package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
- package/registry/cms-rust-machine-20260928/manifest.json +22 -0
- package/registry/cms-rust-machine-20260928/migration.sql +237 -0
- package/registry/cms-rust-machine-20260928/receipt.json +21 -0
- package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
- package/scripts/build_rapid_rust_cli.py +83 -0
- package/src/attachments/index.js +6 -0
- package/src/attachments/intake.js +235 -0
- package/src/capabilities/repository-snapshot.js +19 -2
- package/src/cli/command-catalog.js +8 -0
- package/src/cli.js +182 -26
- package/src/commands/account-auth.js +94 -8
- package/src/commands/app.js +307 -3
- package/src/commands/billing.js +127 -0
- package/src/commands/brand.js +74 -60
- package/src/commands/cheat-sheet.js +154 -0
- package/src/commands/cloudflare-login.js +222 -0
- package/src/commands/cloudflare.js +453 -23
- package/src/commands/codebaseindex.js +6 -1
- package/src/commands/compute.js +4 -0
- package/src/commands/connections.js +11 -5
- package/src/commands/credentials.js +116 -0
- package/src/commands/gcloud-auth.js +427 -0
- package/src/commands/google-cloud.js +375 -0
- package/src/commands/identity-init.js +2 -2
- package/src/commands/mcp.js +226 -33
- package/src/commands/ollama.js +3 -2
- package/src/commands/plugins.js +7 -2
- package/src/commands/product.js +36 -0
- package/src/commands/runtime-status.js +28 -9
- package/src/commands/runtime.js +313 -0
- package/src/commands/rust.js +24 -0
- package/src/commands/setup.js +279 -0
- package/src/commands/shell.js +16 -3
- package/src/commands/start-local.js +2 -2
- package/src/commands/terminal.js +171 -0
- package/src/commands/update.js +140 -0
- package/src/commands/whoami.js +329 -65
- package/src/features/resolve.js +1 -0
- package/src/index.js +4 -0
- package/src/indexing/ingest/inventory.js +254 -19
- package/src/indexing/ingest/materials.js +3 -9
- package/src/indexing/ingest/style-evidence.js +181 -0
- package/src/knowledge/source.js +3 -3
- package/src/lib/account-session.js +11 -4
- package/src/lib/app-authority.js +172 -0
- package/src/lib/auth.js +94 -21
- package/src/lib/core-client.js +5 -6
- package/src/lib/credentials-audit.js +451 -0
- package/src/lib/deploy/health.js +24 -6
- package/src/lib/detect-context.js +7 -1
- package/src/lib/google-cloud-connection.js +270 -0
- package/src/lib/google-cloud-inventory.js +385 -0
- package/src/lib/google-desktop-oauth.js +372 -0
- package/src/lib/google-studio-brokered-oauth.js +158 -0
- package/src/lib/identity-scaffold.js +24 -6
- package/src/lib/init-options.js +192 -0
- package/src/lib/local-scaffold.js +48 -16
- package/src/lib/provider-command-remediation.js +308 -0
- package/src/lib/provider-credentials.js +8 -0
- package/src/lib/scaffold/index.js +8 -2
- package/src/lib/scaffold/mcp-server.js +43 -0
- package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
- package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
- package/src/lib/scaffold/wizards/cms.js +93 -0
- package/src/lib/scaffold/wizards/mcp-server.js +61 -0
- package/src/lib/setup/contract.js +26 -0
- package/src/lib/setup/discover.js +116 -0
- package/src/lib/setup/execute.js +205 -0
- package/src/lib/setup/planner.js +134 -0
- package/src/lib/setup/recipes.js +235 -0
- package/src/lib/setup/runtime-persist.js +197 -0
- package/src/lib/setup/runtime.js +394 -0
- package/src/lib/slash-commands.js +2 -0
- package/src/lib/terminal/machine-identity.js +95 -0
- package/src/lib/terminal-local.js +164 -0
- package/src/lib/terminal-scopes.js +52 -0
- package/src/lib/whoami-capabilities.js +184 -0
- package/src/local-pty/server.js +34 -5
- package/src/mcp/authority.js +58 -108
- package/src/mcp/client-adapters.js +68 -144
- package/src/mcp/client.js +142 -122
- package/src/mcp/cloudflare-bundles.js +225 -0
- package/src/mcp/index.js +12 -0
- package/src/plugins/cloudflare.js +1 -1
- package/src/providers/ollama-chat.js +2 -1
- package/src/sam/types.js +27 -2
- package/src/security/inventory.js +12 -2
- package/src/security/local-vault.js +2 -0
- package/src/security/scan.js +1 -1
- package/test/account-session.test.mjs +3 -3
- package/test/app-authority-context.test.mjs +32 -0
- package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
- package/test/cli/mcp-client.test.mjs +21 -10
- package/test/cli/runtime-persist.test.mjs +56 -0
- package/test/cli/rust-command.test.mjs +21 -0
- package/test/credentials-audit.test.mjs +113 -0
- package/test/deploy-health-scan.test.mjs +29 -1
- package/test/gcloud-auth.test.mjs +111 -0
- package/test/google-cloud-connection.test.mjs +83 -0
- package/test/google-cloud-inventory.test.mjs +64 -0
- package/test/init-options.test.mjs +35 -0
- package/test/integration/app-command.test.mjs +30 -0
- package/test/integration/cad-project.test.mjs +4 -1
- package/test/integration/cms-app-scaffold.test.mjs +71 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
- package/test/integration/codebaseindex-ingest.test.mjs +48 -0
- package/test/integration/features-resolve.test.mjs +30 -11
- package/test/integration/inspect-path-cli.test.mjs +46 -0
- package/test/integration/inventory-evidence.test.mjs +125 -0
- package/test/integration/runtime-status.integration.test.mjs +2 -1
- package/test/knowledge.test.mjs +35 -1
- package/test/loopback-oauth.test.mjs +53 -0
- package/test/ollama.test.mjs +22 -0
- package/test/security.test.mjs +23 -0
- package/test/setup-planner.test.mjs +74 -0
- package/test/setup-runtime.test.mjs +51 -0
- package/test/terminal/local-pty.mock.test.mjs +3 -1
- package/test/terminal-machine-identity.test.mjs +88 -0
- package/test/whoami-resume.test.mjs +27 -6
- package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
- package/packages/work-graph/prototype/README.md +0 -32
- package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
- package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
- package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
- package/packages/work-graph/prototype-gnantt.html +0 -655
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentsam runtime — local machine runtime (agentsamd) install / doctor / status.
|
|
3
|
+
* Distinct from agentsam go (cloud service agentsam-go-worker).
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import { spawn, execFile } from 'node:child_process';
|
|
9
|
+
import { promisify } from 'node:util';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import {
|
|
12
|
+
discoverRuntimeFacts,
|
|
13
|
+
ensureRuntimeStateDir,
|
|
14
|
+
runtimeStateDir,
|
|
15
|
+
writeRuntimeInstallReceipt,
|
|
16
|
+
RUNTIME_SETUP_SCHEMA,
|
|
17
|
+
} from '../lib/setup/runtime.js';
|
|
18
|
+
import {
|
|
19
|
+
DARWIN_LAUNCH_LABEL,
|
|
20
|
+
writeLaunchAgent,
|
|
21
|
+
writeWindowsScheduledTask,
|
|
22
|
+
startWindowsScheduledTask,
|
|
23
|
+
stopWindowsScheduledTask,
|
|
24
|
+
bootstrapDarwinLaunchAgent,
|
|
25
|
+
unloadDarwinLaunchAgent,
|
|
26
|
+
} from '../lib/setup/runtime-persist.js';
|
|
27
|
+
import { RUNTIME_PROTOCOL_SCHEMA } from '../../packages/runtime-protocol/src/index.js';
|
|
28
|
+
|
|
29
|
+
const execFileAsync = promisify(execFile);
|
|
30
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
31
|
+
const REPO_ROOT = path.resolve(__dirname, '../..');
|
|
32
|
+
const GO_RUNTIME_ROOT = path.join(REPO_ROOT, 'apps/agentsam-go-worker/runtime');
|
|
33
|
+
const AGENTSAMD_MAIN = path.join(GO_RUNTIME_ROOT, 'cmd/agentsamd');
|
|
34
|
+
|
|
35
|
+
function writeLine(write, value = '') {
|
|
36
|
+
write(`${value}\n`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function printHelp(write) {
|
|
40
|
+
writeLine(write, '');
|
|
41
|
+
writeLine(write, ' Agent Sam · runtime (agentsamd)');
|
|
42
|
+
writeLine(write, '');
|
|
43
|
+
writeLine(write, ' agentsam runtime status [--json]');
|
|
44
|
+
writeLine(write, ' agentsam runtime doctor [--json]');
|
|
45
|
+
writeLine(write, ' agentsam runtime install [--yes] build agentsamd + install persistence/bin');
|
|
46
|
+
writeLine(write, ' agentsam runtime start');
|
|
47
|
+
writeLine(write, ' agentsam runtime stop');
|
|
48
|
+
writeLine(write, ' agentsam runtime probe');
|
|
49
|
+
writeLine(write, '');
|
|
50
|
+
writeLine(write, ' Persistence: LaunchAgent (Mac) · Scheduled Task (Windows) · spawn+pid (Linux).');
|
|
51
|
+
writeLine(write, ' Machine daemon ≠ agentsam-go-worker (Cloudflare service).');
|
|
52
|
+
writeLine(write, ' Setup planner: agentsam setup runtime');
|
|
53
|
+
writeLine(write, '');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function binDir(home = os.homedir()) {
|
|
57
|
+
return path.join(home, '.agentsam', 'bin');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function agentsamdPath(home = os.homedir()) {
|
|
61
|
+
return path.join(binDir(home), process.platform === 'win32' ? 'agentsamd.exe' : 'agentsamd');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function pidPath(home = os.homedir()) {
|
|
65
|
+
return path.join(runtimeStateDir(home), 'agentsamd.pid');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function listenAddr() {
|
|
69
|
+
return process.env.AGENTSAMD_LISTEN || '127.0.0.1:18765';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function darwinPlistPath(home) {
|
|
73
|
+
return path.join(home, 'Library', 'LaunchAgents', `${DARWIN_LAUNCH_LABEL}.plist`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function buildAgentsamd(write) {
|
|
77
|
+
if (!fs.existsSync(path.join(AGENTSAMD_MAIN, 'main.go'))) {
|
|
78
|
+
throw new Error(`agentsamd source missing at ${AGENTSAMD_MAIN}`);
|
|
79
|
+
}
|
|
80
|
+
const out = agentsamdPath();
|
|
81
|
+
fs.mkdirSync(path.dirname(out), { recursive: true });
|
|
82
|
+
writeLine(write, ` Building agentsamd → ${out}`);
|
|
83
|
+
await execFileAsync('go', ['build', '-o', out, './cmd/agentsamd'], {
|
|
84
|
+
cwd: GO_RUNTIME_ROOT,
|
|
85
|
+
env: { ...process.env, CGO_ENABLED: '0' },
|
|
86
|
+
timeout: 120000,
|
|
87
|
+
});
|
|
88
|
+
try { fs.chmodSync(out, 0o755); } catch { /* ignore */ }
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function probeAgentsamd() {
|
|
93
|
+
const addr = listenAddr();
|
|
94
|
+
const url = addr.startsWith('http') ? `${addr}/health` : `http://${addr}/health`;
|
|
95
|
+
try {
|
|
96
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(3000) });
|
|
97
|
+
const body = await res.json().catch(() => ({}));
|
|
98
|
+
return { ok: res.ok, status: res.status, body, url };
|
|
99
|
+
} catch (err) {
|
|
100
|
+
return { ok: false, error: String(err?.message || err), url };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function startAgentsamd(home, write) {
|
|
105
|
+
const bin = agentsamdPath(home);
|
|
106
|
+
if (!fs.existsSync(bin)) throw new Error('agentsamd_not_installed');
|
|
107
|
+
|
|
108
|
+
if (process.platform === 'win32') {
|
|
109
|
+
try {
|
|
110
|
+
await startWindowsScheduledTask();
|
|
111
|
+
writeLine(write, ` Started Scheduled Task · ${listenAddr()}`);
|
|
112
|
+
await new Promise((r) => setTimeout(r, 600));
|
|
113
|
+
return probeAgentsamd();
|
|
114
|
+
} catch (err) {
|
|
115
|
+
writeLine(write, ` ○ Scheduled Task start failed (${err.message || err}); falling back to spawn`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (process.platform === 'darwin') {
|
|
120
|
+
const plist = darwinPlistPath(home);
|
|
121
|
+
if (fs.existsSync(plist)) {
|
|
122
|
+
const boot = await bootstrapDarwinLaunchAgent(plist);
|
|
123
|
+
if (boot.ok) {
|
|
124
|
+
writeLine(write, ` Loaded LaunchAgent ${DARWIN_LAUNCH_LABEL}`);
|
|
125
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
126
|
+
return probeAgentsamd();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const child = spawn(bin, ['--listen', listenAddr()], {
|
|
132
|
+
detached: true,
|
|
133
|
+
stdio: 'ignore',
|
|
134
|
+
env: { ...process.env, AGENTSAMD_ROLE: 'machine' },
|
|
135
|
+
windowsHide: true,
|
|
136
|
+
});
|
|
137
|
+
child.unref();
|
|
138
|
+
ensureRuntimeStateDir(home);
|
|
139
|
+
fs.writeFileSync(pidPath(home), String(child.pid));
|
|
140
|
+
writeLine(write, ` Started agentsamd pid ${child.pid} · ${listenAddr()}`);
|
|
141
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
142
|
+
return probeAgentsamd();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function stopAgentsamd(home, write) {
|
|
146
|
+
if (process.platform === 'win32') {
|
|
147
|
+
try {
|
|
148
|
+
await stopWindowsScheduledTask();
|
|
149
|
+
writeLine(write, ' Ended Windows Scheduled Task');
|
|
150
|
+
} catch (err) {
|
|
151
|
+
writeLine(write, ` ○ Scheduled Task end: ${err.message || err}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (process.platform === 'darwin') {
|
|
156
|
+
const plist = darwinPlistPath(home);
|
|
157
|
+
if (fs.existsSync(plist)) {
|
|
158
|
+
await unloadDarwinLaunchAgent(plist);
|
|
159
|
+
writeLine(write, ` Unloaded LaunchAgent ${DARWIN_LAUNCH_LABEL}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const file = pidPath(home);
|
|
164
|
+
if (!fs.existsSync(file)) {
|
|
165
|
+
if (process.platform !== 'win32' && process.platform !== 'darwin') {
|
|
166
|
+
writeLine(write, ' No pid file — nothing to stop');
|
|
167
|
+
}
|
|
168
|
+
return { ok: true, stopped: false };
|
|
169
|
+
}
|
|
170
|
+
const pid = Number(fs.readFileSync(file, 'utf8').trim());
|
|
171
|
+
try {
|
|
172
|
+
if (Number.isFinite(pid) && pid > 0) process.kill(pid, 'SIGTERM');
|
|
173
|
+
} catch {
|
|
174
|
+
/* already dead */
|
|
175
|
+
}
|
|
176
|
+
try { fs.unlinkSync(file); } catch { /* ignore */ }
|
|
177
|
+
writeLine(write, ` Stopped agentsamd${pid ? ` pid ${pid}` : ''}`);
|
|
178
|
+
return { ok: true, stopped: true, pid };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export async function runRuntime(argv = [], options = {}) {
|
|
182
|
+
const write = options.write || ((s) => process.stdout.write(s));
|
|
183
|
+
const env = options.env || process.env;
|
|
184
|
+
const home = options.home || os.homedir();
|
|
185
|
+
const json = argv.includes('--json');
|
|
186
|
+
const yes = argv.includes('--yes') || argv.includes('-y');
|
|
187
|
+
const args = argv.filter((a) => !['--json', '--yes', '-y', 'help', '--help', '-h'].includes(a));
|
|
188
|
+
const sub = args[0] || 'status';
|
|
189
|
+
|
|
190
|
+
if (argv.includes('help') || argv.includes('--help') || argv.includes('-h')) {
|
|
191
|
+
printHelp(write);
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (sub === 'status' || sub === 'doctor') {
|
|
196
|
+
const facts = await discoverRuntimeFacts({ env, home });
|
|
197
|
+
const probe = await probeAgentsamd();
|
|
198
|
+
const out = {
|
|
199
|
+
schema: RUNTIME_SETUP_SCHEMA,
|
|
200
|
+
protocol: RUNTIME_PROTOCOL_SCHEMA,
|
|
201
|
+
role: 'machine_daemon',
|
|
202
|
+
product: 'agentsamd',
|
|
203
|
+
distinct_from: 'agentsam-go-worker',
|
|
204
|
+
facts,
|
|
205
|
+
listen: listenAddr(),
|
|
206
|
+
probe,
|
|
207
|
+
};
|
|
208
|
+
if (json) {
|
|
209
|
+
write(`${JSON.stringify(out, null, 2)}\n`);
|
|
210
|
+
} else {
|
|
211
|
+
writeLine(write, '');
|
|
212
|
+
writeLine(write, ' Agent Sam · runtime');
|
|
213
|
+
writeLine(write, ` Protocol ${RUNTIME_PROTOCOL_SCHEMA}`);
|
|
214
|
+
writeLine(write, ` Binary ${facts.agentsamd.installed ? facts.agentsamd.binary : '(not installed)'}`);
|
|
215
|
+
writeLine(write, ` Listen ${listenAddr()}`);
|
|
216
|
+
writeLine(write, ` Health ${probe.ok ? '✓' : '○'} ${probe.ok ? probe.url : (probe.error || 'unreachable')}`);
|
|
217
|
+
if (probe.ok && probe.body?.implementation) {
|
|
218
|
+
writeLine(write, ` Impl ${probe.body.implementation}`);
|
|
219
|
+
}
|
|
220
|
+
writeLine(write, '');
|
|
221
|
+
writeLine(write, ' Next');
|
|
222
|
+
writeLine(write, ' agentsam setup runtime');
|
|
223
|
+
writeLine(write, ' agentsam runtime install --yes');
|
|
224
|
+
writeLine(write, '');
|
|
225
|
+
}
|
|
226
|
+
return probe.ok || facts.agentsamd.installed ? 0 : (sub === 'doctor' ? 2 : 0);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (sub === 'probe') {
|
|
230
|
+
const probe = await probeAgentsamd();
|
|
231
|
+
if (json) write(`${JSON.stringify(probe, null, 2)}\n`);
|
|
232
|
+
else writeLine(write, probe.ok ? ` ✓ ${probe.url}` : ` ✕ ${probe.error || probe.url}`);
|
|
233
|
+
return probe.ok ? 0 : 2;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (sub === 'stop') {
|
|
237
|
+
const result = await stopAgentsamd(home, write);
|
|
238
|
+
if (json) write(`${JSON.stringify(result, null, 2)}\n`);
|
|
239
|
+
return 0;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (sub === 'start') {
|
|
243
|
+
const probe = await startAgentsamd(home, write);
|
|
244
|
+
if (json) write(`${JSON.stringify(probe, null, 2)}\n`);
|
|
245
|
+
else writeLine(write, probe.ok ? ' ✓ agentsamd healthy' : ` ✕ probe failed: ${probe.error || probe.status}`);
|
|
246
|
+
return probe.ok ? 0 : 2;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (sub === 'install') {
|
|
250
|
+
if (!yes && process.stdin.isTTY) {
|
|
251
|
+
writeLine(write, ' Pass --yes to build and install agentsamd into ~/.agentsam/bin');
|
|
252
|
+
}
|
|
253
|
+
if (!yes && !process.stdin.isTTY) {
|
|
254
|
+
writeLine(write, ' Non-interactive: pass --yes');
|
|
255
|
+
return 1;
|
|
256
|
+
}
|
|
257
|
+
if (!yes) {
|
|
258
|
+
writeLine(write, ' Re-run: agentsam runtime install --yes');
|
|
259
|
+
return 1;
|
|
260
|
+
}
|
|
261
|
+
let binary;
|
|
262
|
+
try {
|
|
263
|
+
binary = await buildAgentsamd(write);
|
|
264
|
+
} catch (err) {
|
|
265
|
+
writeLine(write, ` ✕ build failed: ${err.message || err}`);
|
|
266
|
+
return 2;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const listen = listenAddr();
|
|
270
|
+
let persistence = writeLaunchAgent(home, binary, listen);
|
|
271
|
+
if (persistence) {
|
|
272
|
+
writeLine(write, ` LaunchAgent ${persistence.plist}`);
|
|
273
|
+
const boot = await bootstrapDarwinLaunchAgent(persistence.plist);
|
|
274
|
+
if (!boot.ok && boot.error) writeLine(write, ` ○ launchctl: ${boot.error}`);
|
|
275
|
+
} else if (process.platform === 'win32') {
|
|
276
|
+
persistence = await writeWindowsScheduledTask(home, binary, listen);
|
|
277
|
+
if (persistence?.xmlPath) writeLine(write, ` Task XML ${persistence.xmlPath}`);
|
|
278
|
+
if (persistence?.registered) writeLine(write, ` Scheduled ${persistence.taskName}`);
|
|
279
|
+
else if (persistence?.error) writeLine(write, ` ○ schtasks: ${persistence.error}`);
|
|
280
|
+
} else {
|
|
281
|
+
writeLine(write, ' Persistence spawn+pid (Linux — no systemd unit in this cut)');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const probe = await startAgentsamd(home, write);
|
|
285
|
+
const receiptPath = writeRuntimeInstallReceipt({
|
|
286
|
+
profile_id: 'my_computer',
|
|
287
|
+
product: 'agentsamd',
|
|
288
|
+
protocol: RUNTIME_PROTOCOL_SCHEMA,
|
|
289
|
+
runtime_adapter: 'agentsamd',
|
|
290
|
+
binary,
|
|
291
|
+
listen,
|
|
292
|
+
persistence,
|
|
293
|
+
launch_agent: persistence?.kind === 'launch_agent' ? persistence : null,
|
|
294
|
+
scheduled_task: persistence?.kind === 'scheduled_task' ? persistence : null,
|
|
295
|
+
probe,
|
|
296
|
+
host: {
|
|
297
|
+
platform: process.platform,
|
|
298
|
+
arch: process.arch,
|
|
299
|
+
hostname: os.hostname(),
|
|
300
|
+
},
|
|
301
|
+
}, home);
|
|
302
|
+
writeLine(write, ` Receipt ${receiptPath}`);
|
|
303
|
+
writeLine(write, probe.ok ? ' ✓ agentsamd installed and healthy' : ' ○ installed; start/probe manually');
|
|
304
|
+
if (json) {
|
|
305
|
+
write(`${JSON.stringify({ binary, persistence, probe, receiptPath }, null, 2)}\n`);
|
|
306
|
+
}
|
|
307
|
+
return probe.ok ? 0 : 2;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
printHelp(write);
|
|
311
|
+
writeLine(write, ` Unknown subcommand: ${sub}`);
|
|
312
|
+
return 1;
|
|
313
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
|
|
5
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const entry = path.resolve(here, '../../bin/agentsam-rapid-rust');
|
|
7
|
+
|
|
8
|
+
export async function runRust(argv = [], options = {}) {
|
|
9
|
+
const node = options.node || process.execPath;
|
|
10
|
+
const stdio = options.stdio || 'inherit';
|
|
11
|
+
return await new Promise((resolve, reject) => {
|
|
12
|
+
const child = spawn(node, [entry, ...argv], { stdio, env: process.env });
|
|
13
|
+
child.on('error', reject);
|
|
14
|
+
child.on('exit', (code, signal) => {
|
|
15
|
+
if (signal) return reject(new Error(`agentsam rust terminated by ${signal}`));
|
|
16
|
+
if (code && code !== 0) {
|
|
17
|
+
const error = new Error(`agentsam rust exited with code ${code}`);
|
|
18
|
+
error.exitCode = code;
|
|
19
|
+
return reject(error);
|
|
20
|
+
}
|
|
21
|
+
resolve(code ?? 0);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Agent Sam setup — discover → plan → approve → execute → verify + receipt.
|
|
3
|
+
*/
|
|
4
|
+
import readline from 'node:readline/promises';
|
|
5
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
6
|
+
import { discoverEnvironment, renderEnvironment } from '../lib/setup/discover.js';
|
|
7
|
+
import { buildSetupPlan, renderSetupPlan } from '../lib/setup/planner.js';
|
|
8
|
+
import {
|
|
9
|
+
collectGooglePermissionInventory,
|
|
10
|
+
executeSetupPlan,
|
|
11
|
+
} from '../lib/setup/execute.js';
|
|
12
|
+
import { listCapabilityRecipes } from '../lib/setup/recipes.js';
|
|
13
|
+
import {
|
|
14
|
+
planRuntimeSetup,
|
|
15
|
+
renderRuntimePlan,
|
|
16
|
+
writeRuntimePlanReceipt,
|
|
17
|
+
writeRuntimeInstallReceipt,
|
|
18
|
+
RUNTIME_PROFILES,
|
|
19
|
+
} from '../lib/setup/runtime.js';
|
|
20
|
+
import { runRuntime } from './runtime.js';
|
|
21
|
+
|
|
22
|
+
function writeLine(write, value = '') {
|
|
23
|
+
write(`${value}\n`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function printHelp(write) {
|
|
27
|
+
writeLine(write, '');
|
|
28
|
+
writeLine(write, ' Agent Sam · setup');
|
|
29
|
+
writeLine(write, '');
|
|
30
|
+
writeLine(write, ' agentsam setup interactive discover + plan');
|
|
31
|
+
writeLine(write, ' agentsam setup --yes approve plan non-interactively');
|
|
32
|
+
writeLine(write, ' agentsam setup --dry-run plan only');
|
|
33
|
+
writeLine(write, ' agentsam setup runtime Discover → profiles → GOAP → receipts');
|
|
34
|
+
writeLine(write, ' agentsam setup runtime --profile my_computer --yes');
|
|
35
|
+
writeLine(write, ' agentsam setup image.vectorize specific capability');
|
|
36
|
+
writeLine(write, ' agentsam setup google.cloud');
|
|
37
|
+
writeLine(write, ' agentsam setup google.cloud --inventory');
|
|
38
|
+
writeLine(write, ' agentsam setup --list');
|
|
39
|
+
writeLine(write, ' agentsam setup --json');
|
|
40
|
+
writeLine(write, '');
|
|
41
|
+
writeLine(write, ' Stages: discover → plan → explain → approve → execute → verify + receipt');
|
|
42
|
+
writeLine(write, ' Native installers: Homebrew / apt / winget / npm — Agent Sam does not replace them.');
|
|
43
|
+
writeLine(write, '');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function confirmProceed(write, { yes = false } = {}) {
|
|
47
|
+
if (yes) return true;
|
|
48
|
+
if (!input.isTTY || !output.isTTY) {
|
|
49
|
+
writeLine(write, ' Non-interactive shell — pass --yes to execute, or --dry-run to plan only.');
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const rl = readline.createInterface({ input, output });
|
|
53
|
+
try {
|
|
54
|
+
const answer = String(await rl.question(' Proceed? [y/N] ')).trim().toLowerCase();
|
|
55
|
+
return answer === 'y' || answer === 'yes';
|
|
56
|
+
} finally {
|
|
57
|
+
rl.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function runSetupRuntime(argv = [], options = {}) {
|
|
62
|
+
const write = options.write || ((s) => process.stdout.write(s));
|
|
63
|
+
const home = options.home;
|
|
64
|
+
const json = argv.includes('--json');
|
|
65
|
+
const yes = argv.includes('--yes') || argv.includes('-y');
|
|
66
|
+
const dryRun = argv.includes('--dry-run');
|
|
67
|
+
const profileIdx = argv.findIndex((a) => a === '--profile' || a === '-p');
|
|
68
|
+
const profileId =
|
|
69
|
+
profileIdx >= 0 && argv[profileIdx + 1]
|
|
70
|
+
? argv[profileIdx + 1]
|
|
71
|
+
: argv.find((a) => a.startsWith('--profile='))?.slice('--profile='.length) || null;
|
|
72
|
+
|
|
73
|
+
if (argv.includes('help') || argv.includes('--help') || argv.includes('-h')) {
|
|
74
|
+
writeLine(write, '');
|
|
75
|
+
writeLine(write, ' agentsam setup runtime');
|
|
76
|
+
writeLine(write, ' Profiles:');
|
|
77
|
+
for (const p of RUNTIME_PROFILES) {
|
|
78
|
+
writeLine(write, ` ${p.id.padEnd(18)} ${p.label} — ${p.description}`);
|
|
79
|
+
}
|
|
80
|
+
writeLine(write, '');
|
|
81
|
+
writeLine(write, ' agentsam setup runtime --dry-run');
|
|
82
|
+
writeLine(write, ' agentsam setup runtime --profile my_computer --yes');
|
|
83
|
+
writeLine(write, ' Receipts under ~/.agentsam/runtime/');
|
|
84
|
+
writeLine(write, '');
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (argv.includes('--list')) {
|
|
89
|
+
if (json) {
|
|
90
|
+
write(`${JSON.stringify(RUNTIME_PROFILES, null, 2)}\n`);
|
|
91
|
+
} else {
|
|
92
|
+
writeLine(write, '');
|
|
93
|
+
writeLine(write, ' Runtime profiles');
|
|
94
|
+
for (const p of RUNTIME_PROFILES) {
|
|
95
|
+
writeLine(write, ` ${p.id.padEnd(18)} ${p.label} — ${p.description}`);
|
|
96
|
+
}
|
|
97
|
+
writeLine(write, '');
|
|
98
|
+
}
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const plan = await planRuntimeSetup({ home, profileId });
|
|
103
|
+
const planPath = writeRuntimePlanReceipt(plan, home);
|
|
104
|
+
write(renderRuntimePlan(plan));
|
|
105
|
+
|
|
106
|
+
if (json && (dryRun || !yes)) {
|
|
107
|
+
write(JSON.stringify({ plan, plan_receipt: planPath, executed: false }, null, 2) + '\n');
|
|
108
|
+
return plan.recommended?.eligible ? 0 : 2;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (dryRun || !yes) {
|
|
112
|
+
writeLine(write, ` Plan receipt ${planPath}`);
|
|
113
|
+
if (!yes) {
|
|
114
|
+
writeLine(write, ' Pass --yes to install agentsamd (when profile needs it) and write install receipt.');
|
|
115
|
+
}
|
|
116
|
+
writeLine(write, '');
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const recommended = plan.recommended;
|
|
121
|
+
if (!recommended?.eligible) {
|
|
122
|
+
writeLine(write, ' ✕ No eligible profile — resolve missing tools/capabilities first.');
|
|
123
|
+
writeLine(write, '');
|
|
124
|
+
return 2;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
let installResult = null;
|
|
128
|
+
if (recommended.target.runtime_adapter === 'agentsamd') {
|
|
129
|
+
const code = await runRuntime(['install', '--yes'], { write, home });
|
|
130
|
+
installResult = { code, adapter: 'agentsamd' };
|
|
131
|
+
if (code !== 0) return code;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const receiptPath = writeRuntimeInstallReceipt({
|
|
135
|
+
product: 'agentsam-setup-runtime',
|
|
136
|
+
profile_id: recommended.profile.id,
|
|
137
|
+
target: recommended.target,
|
|
138
|
+
goap: recommended.goap,
|
|
139
|
+
install: installResult,
|
|
140
|
+
plan_receipt: planPath,
|
|
141
|
+
}, home);
|
|
142
|
+
|
|
143
|
+
writeLine(write, ` ✓ Runtime setup receipt ${receiptPath}`);
|
|
144
|
+
writeLine(write, '');
|
|
145
|
+
if (json) {
|
|
146
|
+
write(JSON.stringify({
|
|
147
|
+
plan,
|
|
148
|
+
plan_receipt: planPath,
|
|
149
|
+
install_receipt: receiptPath,
|
|
150
|
+
executed: true,
|
|
151
|
+
}, null, 2) + '\n');
|
|
152
|
+
}
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export async function runSetup(argv = [], options = {}) {
|
|
157
|
+
const write = options.write || ((s) => process.stdout.write(s));
|
|
158
|
+
const env = options.env || process.env;
|
|
159
|
+
const json = argv.includes('--json');
|
|
160
|
+
const yes = argv.includes('--yes') || argv.includes('-y');
|
|
161
|
+
const dryRun = argv.includes('--dry-run');
|
|
162
|
+
const inventory = argv.includes('--inventory');
|
|
163
|
+
const args = argv.filter(
|
|
164
|
+
(a) => !['--json', '--yes', '-y', '--dry-run', '--inventory', '--list', 'help', '--help', '-h', '--profile', '-p'].includes(a)
|
|
165
|
+
&& !String(a).startsWith('--profile='),
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
if (argv.includes('help') || argv.includes('--help') || argv.includes('-h')) {
|
|
169
|
+
printHelp(write);
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (args[0] === 'runtime') {
|
|
174
|
+
return runSetupRuntime(argv.filter((a) => a !== 'runtime'), options);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (argv.includes('--list')) {
|
|
178
|
+
const recipes = listCapabilityRecipes();
|
|
179
|
+
if (json) {
|
|
180
|
+
write(JSON.stringify(recipes.map((r) => ({
|
|
181
|
+
id: r.id,
|
|
182
|
+
displayName: r.displayName,
|
|
183
|
+
description: r.description,
|
|
184
|
+
risk: r.risk,
|
|
185
|
+
})), null, 2) + '\n');
|
|
186
|
+
} else {
|
|
187
|
+
writeLine(write, '');
|
|
188
|
+
writeLine(write, ' Installable capabilities');
|
|
189
|
+
for (const r of recipes) {
|
|
190
|
+
writeLine(write, ` ${r.id.padEnd(22)} ${r.displayName}`);
|
|
191
|
+
}
|
|
192
|
+
writeLine(write, '');
|
|
193
|
+
}
|
|
194
|
+
return 0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (args[0] === 'google.cloud' && inventory) {
|
|
198
|
+
const inv = await collectGooglePermissionInventory({ env });
|
|
199
|
+
if (json) write(JSON.stringify(inv, null, 2) + '\n');
|
|
200
|
+
else {
|
|
201
|
+
writeLine(write, '');
|
|
202
|
+
writeLine(write, ' Agent Sam · Google Cloud permission inventory');
|
|
203
|
+
writeLine(write, '');
|
|
204
|
+
const active = inv.config?.core?.account || '(unset)';
|
|
205
|
+
const project = inv.config?.core?.project || '(unset)';
|
|
206
|
+
writeLine(write, ` active account ${active}`);
|
|
207
|
+
writeLine(write, ` project ${project}`);
|
|
208
|
+
writeLine(write, ` auth accounts ${(inv.auth_list || []).length}`);
|
|
209
|
+
const scopes = String(inv.user_token_scopes?.scope || '').split(/\s+/).filter(Boolean);
|
|
210
|
+
writeLine(write, ` token scopes ${scopes.length ? scopes.length : 'unknown'}`);
|
|
211
|
+
for (const s of scopes.slice(0, 12)) writeLine(write, ` • ${s}`);
|
|
212
|
+
const roles = inv.iam_roles_for_active_user?.roles || [];
|
|
213
|
+
writeLine(write, ` IAM roles ${roles.length ? roles.join(', ') : '—'}`);
|
|
214
|
+
writeLine(write, ` projects visible ${(inv.projects || []).length}`);
|
|
215
|
+
writeLine(write, ` billing accts ${(inv.billing_accounts || []).length}`);
|
|
216
|
+
if (inv.errors?.length) {
|
|
217
|
+
writeLine(write, '');
|
|
218
|
+
writeLine(write, ' Errors');
|
|
219
|
+
for (const e of inv.errors) writeLine(write, ` ✕ ${e}`);
|
|
220
|
+
}
|
|
221
|
+
writeLine(write, '');
|
|
222
|
+
writeLine(write, ' Next');
|
|
223
|
+
writeLine(write, ' agentsam gcloud auth login');
|
|
224
|
+
writeLine(write, ' agentsam google-cloud connection set --identity EMAIL --project PROJECT');
|
|
225
|
+
writeLine(write, ' agentsam google-cloud doctor');
|
|
226
|
+
writeLine(write, '');
|
|
227
|
+
}
|
|
228
|
+
return inv.errors?.length ? 2 : 0;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const capabilityIds = args.length ? args : listCapabilityRecipes().map((r) => r.id);
|
|
232
|
+
const environment = await discoverEnvironment({ env });
|
|
233
|
+
const plan = await buildSetupPlan({ environment, capabilityIds });
|
|
234
|
+
|
|
235
|
+
if (json && dryRun) {
|
|
236
|
+
write(JSON.stringify({ environment, plan }, null, 2) + '\n');
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
write(renderEnvironment(environment));
|
|
241
|
+
write(renderSetupPlan(plan));
|
|
242
|
+
|
|
243
|
+
if (dryRun || !plan.would_install.length) {
|
|
244
|
+
if (!plan.would_install.length) {
|
|
245
|
+
writeLine(write, ' ✓ setup complete — requested capabilities already satisfied');
|
|
246
|
+
writeLine(write, ' Next: agentsam doctor · agentsam capabilities · agentsam google-cloud doctor');
|
|
247
|
+
writeLine(write, '');
|
|
248
|
+
}
|
|
249
|
+
if (json) write(JSON.stringify({ environment, plan, executed: false }, null, 2) + '\n');
|
|
250
|
+
return 0;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const approved = await confirmProceed(write, { yes });
|
|
254
|
+
if (!approved) {
|
|
255
|
+
writeLine(write, ' Cancelled. Re-run with --yes to install, or --dry-run to plan only.');
|
|
256
|
+
writeLine(write, '');
|
|
257
|
+
return 1;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const receipt = await executeSetupPlan(plan, { env, write, home: options.home });
|
|
261
|
+
writeLine(write, '');
|
|
262
|
+
writeLine(write, receipt.ok ? ' ✓ Agent Sam setup complete' : ' ✕ Setup finished with failures');
|
|
263
|
+
writeLine(write, ` Receipt ${receipt.path}`);
|
|
264
|
+
writeLine(write, '');
|
|
265
|
+
writeLine(write, ' Next');
|
|
266
|
+
writeLine(write, ' agentsam doctor');
|
|
267
|
+
writeLine(write, ' agentsam capabilities');
|
|
268
|
+
if (capabilityIds.includes('google.cloud')) {
|
|
269
|
+
writeLine(write, ' agentsam setup google.cloud --inventory');
|
|
270
|
+
writeLine(write, ' agentsam gcloud auth login');
|
|
271
|
+
}
|
|
272
|
+
if (capabilityIds.includes('image.vectorize')) {
|
|
273
|
+
writeLine(write, ' agentsam image optimize ./logo.png # when image command ships');
|
|
274
|
+
}
|
|
275
|
+
writeLine(write, '');
|
|
276
|
+
|
|
277
|
+
if (json) write(JSON.stringify({ environment, plan, receipt }, null, 2) + '\n');
|
|
278
|
+
return receipt.ok ? 0 : 2;
|
|
279
|
+
}
|
package/src/commands/shell.js
CHANGED
|
@@ -31,6 +31,9 @@ import { createLocalSession, saveLocalSession, localSessionElapsedMs, loadSessio
|
|
|
31
31
|
import { runtimeDatabasePath } from '../local/runtime-store.js';
|
|
32
32
|
import { grantExecutionApproval, isExecutionApproved, toolApprovalKey } from '../lib/execution-approvals.js';
|
|
33
33
|
import { runWhoami } from './whoami.js';
|
|
34
|
+
import { runCredentials } from './credentials.js';
|
|
35
|
+
import { runCheatSheet } from './cheat-sheet.js';
|
|
36
|
+
import pkg from '../../package.json' with { type: 'json' };
|
|
34
37
|
import { runLogin, runLogout } from './account-auth.js';
|
|
35
38
|
import { runHelp } from '../ui/cli/help.js';
|
|
36
39
|
import { hydrateSecureCredentials } from '../security/local-vault.js';
|
|
@@ -598,7 +601,7 @@ async function runInteractiveModelTurn(prompt, state) {
|
|
|
598
601
|
const provider = createProviderAdapter({
|
|
599
602
|
modelRecord: model,
|
|
600
603
|
credential,
|
|
601
|
-
endpoint: model.provider === 'ollama' ? process.env.OLLAMA_BASE_URL : undefined,
|
|
604
|
+
endpoint: model.provider === 'ollama' ? (process.env.AGENTSAM_OLLAMA_ENDPOINT || process.env.OLLAMA_BASE_URL || process.env.OLLAMA_HOST) : undefined,
|
|
602
605
|
fetchImpl: state.providerFetchImpl,
|
|
603
606
|
});
|
|
604
607
|
const capabilityAdapter = createCapabilityAdapter();
|
|
@@ -789,12 +792,14 @@ export async function dispatchShellLine(line, state = {}) {
|
|
|
789
792
|
const commonVerbs = [
|
|
790
793
|
'help', 'exit', 'quit', 'clear', 'status', 'models', 'model',
|
|
791
794
|
'whoami', 'cf', 'cloudflare', 'db', 'tunnel', 'connections',
|
|
792
|
-
'connect', 'usage', 'session', 'providers', '
|
|
795
|
+
'connect', 'usage', 'session', 'providers', 'credentials', 'cheatsheet',
|
|
796
|
+
'settings', 'logs',
|
|
793
797
|
'git', 'diff', 'pwd', 'cd', 'fast', 'flex', 'standard', 'reasoning',
|
|
794
798
|
];
|
|
795
799
|
if (commonVerbs.includes(bare)) {
|
|
796
|
-
tokens[0] = `/${bare}`;
|
|
800
|
+
tokens[0] = bare === 'cheatsheet' ? '/cheat-sheet' : `/${bare}`;
|
|
797
801
|
}
|
|
802
|
+
if (bare === 'cheat-sheet') tokens[0] = '/cheat-sheet';
|
|
798
803
|
}
|
|
799
804
|
|
|
800
805
|
const [command, ...args] = tokens;
|
|
@@ -866,6 +871,14 @@ export async function dispatchShellLine(line, state = {}) {
|
|
|
866
871
|
state.rl?.resume?.();
|
|
867
872
|
}
|
|
868
873
|
break;
|
|
874
|
+
case '/credentials':
|
|
875
|
+
case '/credential':
|
|
876
|
+
await runCredentials(args.length ? args : ['audit'], { write, home: state.home });
|
|
877
|
+
break;
|
|
878
|
+
case '/cheat-sheet':
|
|
879
|
+
case '/cheatsheet':
|
|
880
|
+
runCheatSheet(args, { write, version: pkg.version });
|
|
881
|
+
break;
|
|
869
882
|
case '/login':
|
|
870
883
|
await runLogin(args, { write, home: state.home });
|
|
871
884
|
break;
|
|
@@ -32,8 +32,8 @@ export async function runStartLocal(opts = {}) {
|
|
|
32
32
|
const port = opts.port ?? config?.pty_port ?? 3099;
|
|
33
33
|
|
|
34
34
|
console.log(`
|
|
35
|
-
Agent Sam — local PTY
|
|
36
|
-
|
|
35
|
+
Agent Sam — local Studio plane (PTY + FS)
|
|
36
|
+
Loopback only · no tunnel · not ExecOS enroll
|
|
37
37
|
`);
|
|
38
38
|
if (!config) {
|
|
39
39
|
console.log(` ⚠ No .agentsam/config.json found; using current repository/directory as the PTY root.`);
|