@inneranimalmedia/agentsam-sdk 2.6.3 → 2.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTSAM.md +17 -0
- package/README.md +31 -10
- 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 +16 -1
- package/bin/agentsam-rapid-rust +36 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
- package/docs/BRAND_INTELLIGENCE.md +1 -1
- 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_DISTRIBUTION_OWNERSHIP.md +176 -0
- package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
- package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
- package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
- package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
- package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
- package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +36 -0
- package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
- package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
- package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
- package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
- package/docs/architecture/SAM_KERNEL.md +181 -0
- package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
- package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
- package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
- package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
- package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
- package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -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/0010_portable_tickets_memory.sql +140 -0
- package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
- package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
- package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
- package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
- package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
- package/migrations/d1/0013_identity_oauth_states.sql +15 -0
- package/migrations/d1/0014_auth_event_log.sql +20 -0
- package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
- package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
- package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
- package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
- package/package.json +88 -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-contracts/src/errors.ts +16 -0
- package/packages/agentsam-errors/src/envelope.js +53 -0
- package/packages/agentsam-errors/src/index.js +1 -0
- package/packages/agentsam-errors/src/recovery.js +301 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
- package/packages/agentsam-knowledge/src/providers/index.js +20 -6
- 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 +318 -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 +51 -30
- package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
- 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 +31 -2
- package/packages/identity/README.md +1 -1
- package/packages/identity/backend/README.md +1 -1
- package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +32 -0
- package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
- package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
- package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
- package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
- package/packages/identity/package.json +3 -2
- 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 +153 -24
- package/packages/identity/src/adapters/sqlite/index.js +322 -0
- package/packages/identity/src/app/verify-app.js +95 -0
- 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/identity-store.js +115 -0
- package/packages/identity/src/contracts/provider.js +1 -0
- package/packages/identity/src/contracts/route-ids.js +30 -0
- package/packages/identity/src/contracts/route-projection.js +218 -0
- package/packages/identity/src/contracts/routes.js +11 -0
- package/packages/identity/src/core/browser-paths.js +4 -5
- package/packages/identity/src/core/constants.js +13 -8
- package/packages/identity/src/core/session-policy.js +32 -0
- package/packages/identity/src/frontend/auth-portal/README.md +2 -1
- package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -15
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +9 -8
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +9 -8
- package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
- 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 +41 -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 +19 -8
- package/packages/identity/src/oauth/consent-view.js +388 -0
- package/packages/identity/src/oauth/credentials.js +46 -19
- package/packages/identity/src/oauth/finalize-inbound.js +1 -1
- package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
- package/packages/identity/src/oauth/iam-platform.js +8 -7
- package/packages/identity/src/oauth/redirect-paths.js +27 -36
- 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 +61 -15
- package/packages/identity/src/server/mount-policy.js +30 -0
- package/packages/identity/src/server/post-auth.js +79 -0
- package/packages/identity/src/server/worker-router.js +208 -146
- package/packages/identity/tests/auth-config.test.mjs +3 -2
- package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
- package/packages/identity/tests/iam-provider.test.mjs +1 -1
- package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
- package/packages/identity/tests/identity-service.test.mjs +52 -5
- 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 +20 -5
- package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
- package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
- package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
- package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
- package/packages/runtime-protocol/src/index.js +154 -0
- package/packages/theme-church-site/package.json +2 -1
- package/packages/theme-church-site/src/index.js +1 -0
- package/packages/theme-companions-site/package.json +2 -1
- package/packages/theme-companions-site/src/index.js +1 -0
- package/packages/theme-floors-site/package.json +2 -1
- package/packages/theme-floors-site/src/index.js +1 -0
- package/packages/theme-fuelnfree-site/package.json +2 -1
- package/packages/theme-fuelnfree-site/src/index.js +1 -0
- package/packages/theme-handyman-site/package.json +2 -1
- package/packages/theme-handyman-site/src/index.js +1 -0
- package/packages/theme-insurance-site/package.json +2 -1
- package/packages/theme-insurance-site/src/index.js +1 -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/theme-shinshu-site/package.json +2 -1
- package/packages/theme-shinshu-site/src/index.js +1 -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 +133 -0
- 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/brand/brandpack.v1.schema.json +43 -0
- package/protocol/credentials/issue.v1.schema.json +38 -0
- package/protocol/database/connection.v1.schema.json +41 -0
- package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
- package/protocol/errors/error-envelope.schema.json +135 -1
- package/protocol/errors/recovery.v1.schema.json +50 -0
- package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
- package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
- package/protocol/sam/activity.v1.schema.json +48 -0
- package/protocol/sam/answer.v1.schema.json +35 -0
- package/protocol/sam/calibration.v1.schema.json +21 -0
- package/protocol/sam/decision-receipt.v1.schema.json +29 -0
- package/protocol/sam/evaluation.v1.schema.json +19 -0
- package/protocol/sam/operation.schema.json +66 -0
- package/protocol/sam/outcome.v1.schema.json +36 -0
- package/protocol/sam/question.v1.schema.json +26 -0
- package/protocol/sam/registry.seed.json +153 -0
- package/protocol/sam/result.schema.json +53 -0
- package/protocol/sam/state.v1.schema.json +23 -0
- package/protocol/scoring/README.md +10 -0
- package/protocol/scoring/scorecard.v1.schema.json +65 -0
- package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
- package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
- package/protocol/ui/icon-registry.mjs +227 -0
- package/protocol/ui/icon.v1.schema.json +51 -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/skills/README.md +22 -9
- package/skills/agentsam-codebaseindex/SKILL.md +225 -0
- package/skills/catalog.json +14 -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 +138 -0
- package/src/cli/dispatch.js +48 -0
- package/src/cli.js +225 -27
- package/src/commands/account-auth.js +94 -8
- package/src/commands/api-key.js +244 -0
- package/src/commands/app.js +365 -29
- package/src/commands/billing.js +127 -0
- package/src/commands/brand.js +86 -74
- 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 +693 -0
- package/src/commands/compute.js +4 -0
- package/src/commands/connections.js +11 -5
- package/src/commands/credentials.js +116 -0
- package/src/commands/env.js +152 -25
- package/src/commands/gcloud-auth.js +427 -0
- package/src/commands/go.js +366 -53
- package/src/commands/google-cloud.js +375 -0
- package/src/commands/identity-init.js +2 -2
- package/src/commands/interaction-clack.js +115 -0
- package/src/commands/mcp.js +226 -33
- package/src/commands/models.js +1 -1
- package/src/commands/ollama.js +3 -2
- package/src/commands/plugins.js +7 -2
- package/src/commands/product.js +36 -0
- package/src/commands/providers.js +62 -14
- 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 +59 -5
- package/src/commands/skill.js +248 -0
- package/src/commands/skills.js +1 -1
- package/src/commands/start-local.js +6 -2
- package/src/commands/terminal.js +171 -0
- package/src/commands/update.js +140 -0
- package/src/commands/whoami.js +392 -56
- package/src/features/resolve.js +1 -0
- package/src/go/build.js +229 -39
- package/src/go/cloudflare.js +506 -105
- package/src/go/container.js +120 -0
- package/src/go/contract.js +9 -4
- package/src/go/discover.js +149 -33
- package/src/go/index.js +15 -3
- package/src/go/native-probe-runner.mjs +119 -0
- package/src/go/{registry.js → official-registry.js} +64 -7
- package/src/go/official-release.js +10 -0
- package/src/go/receipts.js +77 -10
- package/src/go/verify.js +9 -2
- package/src/index.js +31 -0
- package/src/indexing/ingest/discover-models.js +298 -0
- package/src/indexing/ingest/inventory.js +478 -0
- package/src/indexing/ingest/job-graph.js +181 -0
- package/src/indexing/ingest/materials.js +204 -0
- 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 +71 -21
- 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 +3 -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-fs/capability.js +121 -0
- package/src/local-fs/freshness.js +75 -0
- package/src/local-fs/index.js +385 -0
- package/src/local-fs/paths.js +100 -0
- package/src/local-pty/server.js +326 -21
- 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/models/ai-access-onboarding.js +112 -0
- package/src/models/discovery.js +10 -2
- package/src/models/inventory-core.js +9 -1
- package/src/plugins/cloudflare.js +1 -1
- package/src/providers/ollama-chat.js +2 -1
- package/src/sam/activity/index.js +183 -0
- package/src/sam/client.js +252 -0
- package/src/sam/decision/calibration.js +109 -0
- package/src/sam/decision/confidence.js +126 -0
- package/src/sam/decision/evaluate.js +157 -0
- package/src/sam/decision/evaluators/deterministic.js +341 -0
- package/src/sam/decision/evaluators/heuristic.js +61 -0
- package/src/sam/decision/evaluators/select.js +50 -0
- package/src/sam/decision/evaluators/semantic.js +149 -0
- package/src/sam/decision/hierarchical.js +61 -0
- package/src/sam/decision/index.js +53 -0
- package/src/sam/decision/policy.js +86 -0
- package/src/sam/decision/questions.js +120 -0
- package/src/sam/decision/receipt.js +148 -0
- package/src/sam/decision/state.js +117 -0
- package/src/sam/decision/types.js +22 -0
- package/src/sam/decision/validate.js +200 -0
- package/src/sam/define.js +51 -0
- package/src/sam/index.js +65 -0
- package/src/sam/operations/brand-scan.js +62 -0
- package/src/sam/operations/cad-blender-inspect.js +36 -0
- package/src/sam/operations/codebaseindex-ingest.js +49 -0
- package/src/sam/operations/decision-evaluate.js +59 -0
- package/src/sam/operations/planning-astar.js +77 -0
- package/src/sam/operations/planning-goap.js +60 -0
- package/src/sam/operations/repository-inspect.js +72 -0
- package/src/sam/operations/security-scan.js +33 -0
- package/src/sam/operations/terminal-exec.js +29 -0
- package/src/sam/planning/astar.js +311 -0
- package/src/sam/planning/goap.js +177 -0
- package/src/sam/planning/index.js +21 -0
- package/src/sam/planning/state.js +84 -0
- package/src/sam/registry.js +48 -0
- package/src/sam/result.js +77 -0
- package/src/sam/seed.js +44 -0
- package/src/sam/types.js +116 -0
- package/src/security/inventory.js +12 -2
- package/src/security/local-vault.js +2 -0
- package/src/security/scan.js +1 -1
- package/src/skills/catalog.js +64 -0
- package/src/skills/content-resolver.js +124 -0
- package/src/skills/hosted-store.js +37 -0
- package/src/skills/index.js +29 -64
- package/src/skills/interaction.js +102 -0
- package/src/skills/local-store.js +228 -0
- package/src/skills/manifest.js +104 -0
- package/src/skills/metrics.js +31 -0
- package/src/skills/registry.js +184 -0
- package/src/skills/runtime.js +287 -0
- package/src/skills/slash.js +44 -0
- package/src/ui/cli/help.js +94 -101
- package/test/account-session.test.mjs +3 -3
- package/test/app-authority-context.test.mjs +32 -0
- package/test/cli/api-key-env-whoami.test.mjs +129 -0
- package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
- package/test/cli/go.test.mjs +62 -5
- 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/cli/skill-npm-and-env.test.mjs +52 -0
- package/test/cli/wireframes-go-registry.test.mjs +87 -2
- 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/go/build-source-identity.test.mjs +31 -0
- package/test/go/cloudflare-probe.test.mjs +274 -10
- package/test/go/distribution.test.mjs +28 -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/ai-access-onboarding.test.mjs +47 -0
- package/test/integration/app-command.test.mjs +30 -0
- package/test/integration/cad-project.test.mjs +4 -1
- package/test/integration/cli-help.test.mjs +1 -1
- package/test/integration/cms-app-scaffold.test.mjs +71 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +9 -8
- package/test/integration/codebaseindex-ingest.test.mjs +214 -0
- package/test/integration/features-resolve.test.mjs +30 -11
- package/test/integration/icon-registry.test.mjs +67 -0
- package/test/integration/ingest-discover-models.test.mjs +30 -0
- package/test/integration/inspect-path-cli.test.mjs +46 -0
- package/test/integration/install-script.test.mjs +12 -9
- package/test/integration/inventory-evidence.test.mjs +125 -0
- package/test/integration/local-fs.test.mjs +113 -0
- package/test/integration/provider-env-cli.test.mjs +2 -1
- package/test/integration/runtime-status.integration.test.mjs +2 -1
- package/test/integration/sam-activity-recovery.test.mjs +147 -0
- package/test/integration/sam-decision.test.mjs +584 -0
- package/test/integration/sam-kernel.test.mjs +99 -0
- package/test/integration/sam-planning-astar.test.mjs +279 -0
- package/test/integration/skill-runtime.test.mjs +240 -0
- package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
- package/test/knowledge.test.mjs +35 -1
- package/test/loopback-oauth.test.mjs +53 -0
- package/test/models.test.mjs +14 -7
- 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/shell.test.mjs +4 -4
- 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,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init / create pickers — real presets, scaffolds, and apps (not aspirational lanes).
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { listPresets } from '../presets/index.js';
|
|
8
|
+
import { listAppManifests } from '../commands/app.js';
|
|
9
|
+
|
|
10
|
+
const SDK_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
|
|
11
|
+
const INSTALLABLE_PRODUCT_CACHE = path.join('registry', 'cms-rust-machine-20260928', 'installable-products.json');
|
|
12
|
+
|
|
13
|
+
export const SCAFFOLD_WIZARDS = Object.freeze([
|
|
14
|
+
{
|
|
15
|
+
value: 'scaffold:cms',
|
|
16
|
+
kind: 'scaffold',
|
|
17
|
+
scaffold: 'cms',
|
|
18
|
+
label: 'CMS Site (Worker + D1 + R2)',
|
|
19
|
+
hint: 'Proven Cloudflare CMS scaffold with pages, nav, and templates',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
value: 'scaffold:worker-api',
|
|
23
|
+
kind: 'scaffold',
|
|
24
|
+
scaffold: 'worker-api',
|
|
25
|
+
label: 'Worker API',
|
|
26
|
+
hint: 'Bare Cloudflare Worker with typed routes and D1',
|
|
27
|
+
},
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
export const RUN_TARGET_OPTIONS = Object.freeze([
|
|
31
|
+
{
|
|
32
|
+
value: 'local',
|
|
33
|
+
label: 'This machine',
|
|
34
|
+
hint: 'SQLite + local API; no cloud account required',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
value: 'cloudflare',
|
|
38
|
+
label: 'Cloudflare Workers',
|
|
39
|
+
hint: 'OAuth via Local Studio / agentsam connections — Workers, D1, R2',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
value: 'tauri',
|
|
43
|
+
label: 'Local Studio desktop',
|
|
44
|
+
hint: 'Bundled Tauri app + local SQLite; offline-capable product runtime',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
value: 'gcp',
|
|
48
|
+
label: 'Google Cloud',
|
|
49
|
+
hint: 'agentsam google-cloud OAuth / gcloud — VMs, Cloud Run, Workstations',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
value: 'docker',
|
|
53
|
+
label: 'Docker',
|
|
54
|
+
hint: 'agentsam dockerize — proven compose/build/run on this host',
|
|
55
|
+
},
|
|
56
|
+
]);
|
|
57
|
+
|
|
58
|
+
function appReady(manifest = {}) {
|
|
59
|
+
const runtime = manifest.runtime || {};
|
|
60
|
+
return (
|
|
61
|
+
runtime.source_scaffold === 'ready'
|
|
62
|
+
|| runtime.local_preview === 'ready'
|
|
63
|
+
|| runtime.cloudflare === 'ready'
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function listInstallableProductCache(root = SDK_ROOT) {
|
|
68
|
+
const file = path.join(root || SDK_ROOT, INSTALLABLE_PRODUCT_CACHE);
|
|
69
|
+
try {
|
|
70
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
71
|
+
return Array.isArray(parsed?.products) ? parsed.products : [];
|
|
72
|
+
} catch {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function actionChoice(action = {}) {
|
|
78
|
+
if (action.kind === 'app' && action.id) return `app:${action.id}`;
|
|
79
|
+
if (action.kind === 'scaffold' && action.id) return `scaffold:${action.id}`;
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function getInstallableProductChoice(id, root = SDK_ROOT) {
|
|
84
|
+
return listInstallableProductCache(root).find((row) => row.slug === id) || null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function listInitProjectTypeOptions(root) {
|
|
88
|
+
const presets = listPresets().map((preset) => ({
|
|
89
|
+
value: `preset:${preset.id}`,
|
|
90
|
+
kind: 'preset',
|
|
91
|
+
presetId: preset.id,
|
|
92
|
+
lane: preset.lane || preset.id,
|
|
93
|
+
label: preset.id === 'cms' ? 'CMS app (local AgentSam)' : preset.id === 'prototype'
|
|
94
|
+
? 'Prototype (minimal)'
|
|
95
|
+
: preset.id === 'data'
|
|
96
|
+
? 'Data app'
|
|
97
|
+
: 'Full Stack app',
|
|
98
|
+
hint: preset.description || preset.id,
|
|
99
|
+
}));
|
|
100
|
+
|
|
101
|
+
const apps = listAppManifests(root)
|
|
102
|
+
.filter((row) => appReady(row.manifest || {}))
|
|
103
|
+
.map((row) => {
|
|
104
|
+
const runtime = row.manifest?.runtime || {};
|
|
105
|
+
const cf = runtime.cloudflare === 'ready' ? ' · Cloudflare ready' : '';
|
|
106
|
+
return {
|
|
107
|
+
value: `app:${row.id}`,
|
|
108
|
+
kind: 'app',
|
|
109
|
+
appId: row.id,
|
|
110
|
+
label: row.name || row.id,
|
|
111
|
+
hint: `agentsam app scaffold ${row.id}${cf}`,
|
|
112
|
+
hasScaffold: Boolean(row.commands?.scaffold || row.manifest?.commands?.scaffold),
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const represented = new Set([
|
|
117
|
+
...SCAFFOLD_WIZARDS.map((row) => row.value),
|
|
118
|
+
...apps.map((row) => row.value),
|
|
119
|
+
]);
|
|
120
|
+
const products = listInstallableProductCache(root || SDK_ROOT)
|
|
121
|
+
.filter((row) => row?.slug && row?.action)
|
|
122
|
+
.filter((row) => {
|
|
123
|
+
const action = actionChoice(row.action);
|
|
124
|
+
return !action || !represented.has(action);
|
|
125
|
+
})
|
|
126
|
+
.map((row) => ({
|
|
127
|
+
value: `product:${row.slug}`,
|
|
128
|
+
kind: 'product',
|
|
129
|
+
productId: row.slug,
|
|
130
|
+
label: row.label || row.slug,
|
|
131
|
+
hint: row.hint || `${row.kind || 'product'} · ${row.status || 'unknown'}`,
|
|
132
|
+
action: row.action,
|
|
133
|
+
}));
|
|
134
|
+
|
|
135
|
+
return [...presets, ...SCAFFOLD_WIZARDS, ...products, ...apps];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function parseProjectTypeChoice(value) {
|
|
139
|
+
const raw = String(value || '').trim();
|
|
140
|
+
if (raw.startsWith('preset:')) {
|
|
141
|
+
return { kind: 'preset', id: raw.slice('preset:'.length) };
|
|
142
|
+
}
|
|
143
|
+
if (raw.startsWith('scaffold:')) {
|
|
144
|
+
return { kind: 'scaffold', id: raw.slice('scaffold:'.length) };
|
|
145
|
+
}
|
|
146
|
+
if (raw.startsWith('app:')) {
|
|
147
|
+
return { kind: 'app', id: raw.slice('app:'.length) };
|
|
148
|
+
}
|
|
149
|
+
if (raw.startsWith('product:')) {
|
|
150
|
+
return { kind: 'product', id: raw.slice('product:'.length) };
|
|
151
|
+
}
|
|
152
|
+
// Back-compat for --lane fullstack|cms|…
|
|
153
|
+
if (raw) return { kind: 'preset', id: raw };
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Concrete next commands after init — not "decide later". */
|
|
158
|
+
export function guidanceForRunTarget(runTarget, { projectName } = {}) {
|
|
159
|
+
const name = projectName || '.';
|
|
160
|
+
if (runTarget === 'cloudflare') {
|
|
161
|
+
return [
|
|
162
|
+
'agentsam connections setup # Cloudflare OAuth callback + Local Studio connector',
|
|
163
|
+
'agentsam cloudflare # Workers / bindings capabilities',
|
|
164
|
+
`cd ${name} && npm run deploy # Graduate this project to a Worker when ready`,
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
if (runTarget === 'tauri') {
|
|
168
|
+
return [
|
|
169
|
+
'agentsam app doctor local-studio # Verify the bundled desktop product contract',
|
|
170
|
+
`cd ${name} && npm install # Install the scaffolded app workspace`,
|
|
171
|
+
'Open AgentSam Local Studio.app # Desktop authority uses local SQLite when the adapter supports it',
|
|
172
|
+
];
|
|
173
|
+
}
|
|
174
|
+
if (runTarget === 'gcp') {
|
|
175
|
+
return [
|
|
176
|
+
'agentsam google-cloud doctor # OAuth + gcloud readiness',
|
|
177
|
+
'agentsam google-cloud auth # Sign in / refresh Google user OAuth',
|
|
178
|
+
'agentsam compute # List VMs / Cloud Run / Workstations targets',
|
|
179
|
+
];
|
|
180
|
+
}
|
|
181
|
+
if (runTarget === 'docker') {
|
|
182
|
+
return [
|
|
183
|
+
`cd ${name} && npx agentsam dockerize # Generate Dockerfile + compose from proven templates`,
|
|
184
|
+
'docker compose up --build',
|
|
185
|
+
];
|
|
186
|
+
}
|
|
187
|
+
return [
|
|
188
|
+
'npm install && npm run smoke && npm run dev',
|
|
189
|
+
'npx agentsam',
|
|
190
|
+
'Optional: npm run pty · npm run ollama:setup',
|
|
191
|
+
];
|
|
192
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Local-first scaffold —
|
|
3
|
-
* Prove the project locally; `agentsam deploy` adds cloud adapters only when requested.
|
|
2
|
+
* Local-first scaffold — prove locally, then graduate with real Cloudflare / GCP / Docker tooling.
|
|
4
3
|
*/
|
|
5
4
|
|
|
6
5
|
import pkg from '../../package.json' with { type: 'json' };
|
|
@@ -40,9 +39,11 @@ const RUN_TARGETS = {
|
|
|
40
39
|
'1': 'local',
|
|
41
40
|
'2': 'cloudflare',
|
|
42
41
|
'3': 'gcp',
|
|
42
|
+
'4': 'docker',
|
|
43
43
|
local: 'local',
|
|
44
44
|
cloudflare: 'cloudflare',
|
|
45
45
|
gcp: 'gcp',
|
|
46
|
+
docker: 'docker',
|
|
46
47
|
};
|
|
47
48
|
|
|
48
49
|
export { LANE_KEYS, LANE_LABELS, RUN_TARGETS };
|
|
@@ -184,10 +185,13 @@ npm run ollama:status # probe local Ollama + models
|
|
|
184
185
|
|
|
185
186
|
The local SQLite database lives at \`.agentsam/data/agentsam.sqlite\` and is initialized from \`db/schema.sql\`.
|
|
186
187
|
|
|
187
|
-
When you're
|
|
188
|
+
When you're ready to run on Cloudflare, GCP, or Docker (all supported end-to-end):
|
|
188
189
|
|
|
189
190
|
\`\`\`bash
|
|
190
|
-
npx agentsam
|
|
191
|
+
npx agentsam connections setup # Cloudflare OAuth (Local Studio)
|
|
192
|
+
npx agentsam google-cloud doctor # GCP OAuth / gcloud
|
|
193
|
+
npx agentsam dockerize # Containerize this project
|
|
194
|
+
npx agentsam deploy # Cloudflare Worker graduation
|
|
191
195
|
\`\`\`
|
|
192
196
|
`,
|
|
193
197
|
},
|
|
@@ -416,7 +420,16 @@ No Worker or cloud account is required for local development.
|
|
|
416
420
|
npm run deploy
|
|
417
421
|
\`\`\`
|
|
418
422
|
|
|
419
|
-
Selected
|
|
423
|
+
Selected run target: **${runTarget}**.
|
|
424
|
+
|
|
425
|
+
| Target | Proven path |
|
|
426
|
+
| --- | --- |
|
|
427
|
+
| local | SQLite + local API on this host |
|
|
428
|
+
| cloudflare | Local Studio CF OAuth · \`agentsam connections\` · \`agentsam deploy\` |
|
|
429
|
+
| gcp | \`agentsam google-cloud\` OAuth / gcloud |
|
|
430
|
+
| docker | \`agentsam dockerize\` compose/build/run |
|
|
431
|
+
|
|
432
|
+
Cloud adapters and credentials are configured with those commands — not left as aspirational flags.
|
|
420
433
|
`,
|
|
421
434
|
},
|
|
422
435
|
];
|
|
@@ -432,6 +445,35 @@ export function buildLocalScaffoldMeta(body, sdkVersion = pkg.version) {
|
|
|
432
445
|
const laneLabel = LANE_LABELS[laneKey] || 'Full Stack';
|
|
433
446
|
const agent = AGENT_FOR_LANE[laneKey] || 'orchestrator';
|
|
434
447
|
const runTarget = normalizeRunTarget(body.runTarget || body.run_target || 'local');
|
|
448
|
+
const nextByTarget = {
|
|
449
|
+
local: [
|
|
450
|
+
'npm install',
|
|
451
|
+
'npm run smoke',
|
|
452
|
+
'npm run status',
|
|
453
|
+
'npm run dev',
|
|
454
|
+
'npx agentsam',
|
|
455
|
+
'Optional: npm run pty · npm run ollama:setup',
|
|
456
|
+
],
|
|
457
|
+
cloudflare: [
|
|
458
|
+
'npm install',
|
|
459
|
+
'npm run smoke',
|
|
460
|
+
'agentsam connections setup',
|
|
461
|
+
'agentsam cloudflare',
|
|
462
|
+
'npm run deploy',
|
|
463
|
+
],
|
|
464
|
+
gcp: [
|
|
465
|
+
'npm install',
|
|
466
|
+
'npm run smoke',
|
|
467
|
+
'agentsam google-cloud doctor',
|
|
468
|
+
'agentsam google-cloud auth',
|
|
469
|
+
'agentsam compute',
|
|
470
|
+
],
|
|
471
|
+
docker: [
|
|
472
|
+
'npm install',
|
|
473
|
+
'npx agentsam dockerize',
|
|
474
|
+
'docker compose up --build',
|
|
475
|
+
],
|
|
476
|
+
};
|
|
435
477
|
|
|
436
478
|
return {
|
|
437
479
|
projectName,
|
|
@@ -440,16 +482,6 @@ export function buildLocalScaffoldMeta(body, sdkVersion = pkg.version) {
|
|
|
440
482
|
agent,
|
|
441
483
|
runTarget,
|
|
442
484
|
files: buildLocalScaffoldFiles({ projectName, laneKey, laneLabel, agent, runTarget, sdkVersion }),
|
|
443
|
-
next_steps: [
|
|
444
|
-
'npm install',
|
|
445
|
-
'npm run smoke',
|
|
446
|
-
'npm run status',
|
|
447
|
-
'npm run dev',
|
|
448
|
-
'npx agentsam',
|
|
449
|
-
'npm run db:status',
|
|
450
|
-
'Optional free/local models: npm run ollama:setup',
|
|
451
|
-
'Optional: npm run pty',
|
|
452
|
-
'When ready for cloud: npm run deploy',
|
|
453
|
-
],
|
|
485
|
+
next_steps: nextByTarget[runTarget] || nextByTarget.local,
|
|
454
486
|
};
|
|
455
487
|
}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic provider-command remediation — no LLM.
|
|
3
|
+
* Turns provider-native failures into next-step cards with copyable commands.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
function clean(value) {
|
|
7
|
+
return value == null ? '' : String(value).trim();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function argvLine(argv = []) {
|
|
11
|
+
return argv.map((part) => (/\s/.test(String(part)) ? JSON.stringify(String(part)) : String(part))).join(' ');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** @typedef {{ id: string, title: string, command?: string, recommended?: boolean, docs_url?: string }} RemediationAction */
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @typedef {object} RemediationCard
|
|
18
|
+
* @property {string} schema_version
|
|
19
|
+
* @property {string} provider
|
|
20
|
+
* @property {string} kind
|
|
21
|
+
* @property {string} title
|
|
22
|
+
* @property {string} summary
|
|
23
|
+
* @property {string[]} ran
|
|
24
|
+
* @property {string[]} [notes]
|
|
25
|
+
* @property {RemediationAction[]} actions
|
|
26
|
+
* @property {{ enter?: string, h?: string, o?: string, c?: string, p?: string, esc?: string }} keys
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Google Distributed Cloud Edge ≠ Compute Engine IAM.
|
|
31
|
+
* Acceptance fixture from the Mac ExecOS failure.
|
|
32
|
+
* @param {{ argv?: string[], projectId?: string, instance?: string, zone?: string }} [ctx]
|
|
33
|
+
* @returns {RemediationCard|null}
|
|
34
|
+
*/
|
|
35
|
+
export function remediateGcloudEdgeServiceAccountKey(ctx = {}) {
|
|
36
|
+
const argv = Array.isArray(ctx.argv) ? ctx.argv.map(String) : [];
|
|
37
|
+
const joined = argv.join(' ').toLowerCase();
|
|
38
|
+
const looksLike =
|
|
39
|
+
/edge-cloud/.test(joined) &&
|
|
40
|
+
/service-accounts?/.test(joined) &&
|
|
41
|
+
/\bkeys?\b/.test(joined) &&
|
|
42
|
+
/\bcreate\b/.test(joined);
|
|
43
|
+
if (!looksLike && !ctx.force) return null;
|
|
44
|
+
|
|
45
|
+
const projectId = clean(ctx.projectId) || clean(ctx.env?.CLOUDSDK_CORE_PROJECT) || '$PROJECT_ID';
|
|
46
|
+
const instance = clean(ctx.instance) || 'iam-tunnel';
|
|
47
|
+
const zone = clean(ctx.zone) || 'us-central1-f';
|
|
48
|
+
const saEmail = clean(ctx.serviceAccount) || `agentsam-env-controller@${projectId === '$PROJECT_ID' ? 'PROJECT_ID' : projectId}.iam.gserviceaccount.com`;
|
|
49
|
+
|
|
50
|
+
return Object.freeze({
|
|
51
|
+
schema_version: 'agentsam-remediation-v1',
|
|
52
|
+
provider: 'google_cloud',
|
|
53
|
+
kind: 'command_incomplete_wrong_family',
|
|
54
|
+
title: 'Command incomplete',
|
|
55
|
+
summary:
|
|
56
|
+
'This command belongs to Google Distributed Cloud Edge. Your current runtime is a Compute Engine VM / standard GCP project.',
|
|
57
|
+
ran: Object.freeze([argvLine(argv.length ? argv : ['gcloud', 'edge-cloud', 'service-accounts', 'keys', 'create'])]),
|
|
58
|
+
notes: Object.freeze([
|
|
59
|
+
'edge-cloud manages GDCE resources, not project IAM service accounts.',
|
|
60
|
+
'Prefer OAuth / ADC for Local Studio connections over downloadable JSON keys.',
|
|
61
|
+
]),
|
|
62
|
+
actions: Object.freeze([
|
|
63
|
+
Object.freeze({
|
|
64
|
+
id: 'inspect_vm_sa',
|
|
65
|
+
title: "Inspect the VM's current service account",
|
|
66
|
+
recommended: true,
|
|
67
|
+
command: `gcloud compute instances describe ${instance} --zone=${zone} --project=${projectId} --format='yaml(serviceAccounts,name,status)'`,
|
|
68
|
+
}),
|
|
69
|
+
Object.freeze({
|
|
70
|
+
id: 'list_iam_sas',
|
|
71
|
+
title: 'List normal Google IAM service accounts',
|
|
72
|
+
command: `gcloud iam service-accounts list --project=${projectId} --format='table(email,displayName,disabled)'`,
|
|
73
|
+
}),
|
|
74
|
+
Object.freeze({
|
|
75
|
+
id: 'create_iam_key',
|
|
76
|
+
title: 'Create a standard service-account key (avoid when ADC works)',
|
|
77
|
+
command: `gcloud iam service-accounts keys create ./sa-key.json --iam-account=${saEmail} --project=${projectId}`,
|
|
78
|
+
}),
|
|
79
|
+
Object.freeze({
|
|
80
|
+
id: 'oauth_connection',
|
|
81
|
+
title: 'Use OAuth instead (recommended for Local Studio)',
|
|
82
|
+
command: 'agentsam connections',
|
|
83
|
+
docs_url: 'https://cloud.google.com/docs/authentication',
|
|
84
|
+
}),
|
|
85
|
+
]),
|
|
86
|
+
keys: Object.freeze({
|
|
87
|
+
enter: 'recommended',
|
|
88
|
+
h: 'help',
|
|
89
|
+
o: 'open provider docs',
|
|
90
|
+
c: 'copy command',
|
|
91
|
+
esc: 'cancel',
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param {{ operation?: string, connection?: string, projectId?: string, permission?: string }} [ctx]
|
|
98
|
+
* @returns {RemediationCard}
|
|
99
|
+
*/
|
|
100
|
+
export function remediateGcloudPermissionDenied(ctx = {}) {
|
|
101
|
+
const operation = clean(ctx.operation) || 'compute.instances.list';
|
|
102
|
+
const connection = clean(ctx.connection) || 'Google Cloud';
|
|
103
|
+
const projectId = clean(ctx.projectId) || '$PROJECT_ID';
|
|
104
|
+
const permission = clean(ctx.permission) || operation;
|
|
105
|
+
|
|
106
|
+
return Object.freeze({
|
|
107
|
+
schema_version: 'agentsam-remediation-v1',
|
|
108
|
+
provider: 'google_cloud',
|
|
109
|
+
kind: 'permission_denied',
|
|
110
|
+
title: 'Permission missing',
|
|
111
|
+
summary: `Operation ${operation} was denied for the active Google Cloud connection.`,
|
|
112
|
+
ran: Object.freeze([]),
|
|
113
|
+
notes: Object.freeze([
|
|
114
|
+
`Connection: ${connection}`,
|
|
115
|
+
`Required permission (when known): ${permission}`,
|
|
116
|
+
]),
|
|
117
|
+
actions: Object.freeze([
|
|
118
|
+
Object.freeze({
|
|
119
|
+
id: 'reauth',
|
|
120
|
+
title: 'Re-authorize Google Cloud',
|
|
121
|
+
recommended: true,
|
|
122
|
+
command: 'gcloud auth login',
|
|
123
|
+
}),
|
|
124
|
+
Object.freeze({
|
|
125
|
+
id: 'show_permission',
|
|
126
|
+
title: 'Show required permission',
|
|
127
|
+
command: `gcloud projects get-iam-policy ${projectId} --flatten='bindings[].members' --filter='bindings.role:roles/' --format='table(bindings.role)'`,
|
|
128
|
+
}),
|
|
129
|
+
Object.freeze({
|
|
130
|
+
id: 'open_iam',
|
|
131
|
+
title: 'Open IAM / consent page',
|
|
132
|
+
docs_url: `https://console.cloud.google.com/iam-admin/iam?project=${encodeURIComponent(projectId)}`,
|
|
133
|
+
command: `open "https://console.cloud.google.com/iam-admin/iam?project=${projectId}"`,
|
|
134
|
+
}),
|
|
135
|
+
Object.freeze({
|
|
136
|
+
id: 'copy_probe',
|
|
137
|
+
title: 'Copy read-only probe command',
|
|
138
|
+
command: `gcloud compute instances list --project=${projectId} --format='table(name,zone,status,machineType)'`,
|
|
139
|
+
}),
|
|
140
|
+
]),
|
|
141
|
+
keys: Object.freeze({
|
|
142
|
+
enter: 'Re-authorize Google Cloud',
|
|
143
|
+
p: 'Show required permission',
|
|
144
|
+
o: 'Open IAM/consent page',
|
|
145
|
+
c: 'Copy gcloud command',
|
|
146
|
+
esc: 'cancel',
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* GitHub env token shadows healthy keyring OAuth.
|
|
153
|
+
* @param {{ envTokenPresent?: boolean, keyringHealthy?: boolean, scopes?: string[] }} [ctx]
|
|
154
|
+
* @returns {RemediationCard|null}
|
|
155
|
+
*/
|
|
156
|
+
export function remediateGithubTokenShadow(ctx = {}) {
|
|
157
|
+
if (!ctx.envTokenPresent || ctx.keyringHealthy !== true) return null;
|
|
158
|
+
return Object.freeze({
|
|
159
|
+
schema_version: 'agentsam-remediation-v1',
|
|
160
|
+
provider: 'github',
|
|
161
|
+
kind: 'credential_shadow',
|
|
162
|
+
title: 'Stale GITHUB_TOKEN shadows working keyring login',
|
|
163
|
+
summary:
|
|
164
|
+
'macOS keyring OAuth is healthy, but GITHUB_TOKEN / GH_TOKEN in the environment takes precedence and returns HTTP 401.',
|
|
165
|
+
ran: Object.freeze([]),
|
|
166
|
+
notes: Object.freeze([
|
|
167
|
+
...(Array.isArray(ctx.scopes) && ctx.scopes.length
|
|
168
|
+
? [`Keyring scopes: ${ctx.scopes.join(', ')}`]
|
|
169
|
+
: []),
|
|
170
|
+
'Prefer GitHub App installation for customer products; developer Macs may keep gh OAuth.',
|
|
171
|
+
]),
|
|
172
|
+
actions: Object.freeze([
|
|
173
|
+
Object.freeze({
|
|
174
|
+
id: 'unset',
|
|
175
|
+
title: 'Remove stale shell override for this session',
|
|
176
|
+
recommended: true,
|
|
177
|
+
command: 'unset GITHUB_TOKEN GH_TOKEN',
|
|
178
|
+
}),
|
|
179
|
+
Object.freeze({
|
|
180
|
+
id: 'status',
|
|
181
|
+
title: 'Confirm keyring auth',
|
|
182
|
+
command: 'gh auth status',
|
|
183
|
+
}),
|
|
184
|
+
Object.freeze({
|
|
185
|
+
id: 'whoami',
|
|
186
|
+
title: 'Confirm API identity',
|
|
187
|
+
command: "gh api user --jq '{login: .login, type: .type}'",
|
|
188
|
+
}),
|
|
189
|
+
Object.freeze({
|
|
190
|
+
id: 'find_source',
|
|
191
|
+
title: 'Inspect where the override originates',
|
|
192
|
+
command: "rg -n 'GITHUB_TOKEN|GH_TOKEN' ~/.zshrc ~/.zprofile ~/.profile ~/.agentsam 2>/dev/null",
|
|
193
|
+
}),
|
|
194
|
+
]),
|
|
195
|
+
keys: Object.freeze({
|
|
196
|
+
enter: 'inspect source',
|
|
197
|
+
c: 'copy command',
|
|
198
|
+
esc: 'cancel',
|
|
199
|
+
}),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Classify a failed argv / stderr blob into a remediation card when possible.
|
|
205
|
+
* @param {{ argv?: string[], stderr?: string, stdout?: string, env?: NodeJS.ProcessEnv, projectId?: string }} input
|
|
206
|
+
* @returns {RemediationCard|null}
|
|
207
|
+
*/
|
|
208
|
+
export function remediateProviderFailure(input = {}) {
|
|
209
|
+
const argv = Array.isArray(input.argv) ? input.argv.map(String) : [];
|
|
210
|
+
const text = `${argv.join(' ')}\n${clean(input.stderr)}\n${clean(input.stdout)}`;
|
|
211
|
+
|
|
212
|
+
const edge = remediateGcloudEdgeServiceAccountKey({
|
|
213
|
+
argv,
|
|
214
|
+
projectId: input.projectId,
|
|
215
|
+
env: input.env,
|
|
216
|
+
force: /edge-cloud/.test(text) && /service-account/.test(text),
|
|
217
|
+
});
|
|
218
|
+
if (edge) return edge;
|
|
219
|
+
|
|
220
|
+
if (/PERMISSION_DENIED|permission.?denied|403 Forbidden/i.test(text)) {
|
|
221
|
+
const opMatch = text.match(/\b([a-z]+(?:\.[a-z]+){1,4})\b/i);
|
|
222
|
+
return remediateGcloudPermissionDenied({
|
|
223
|
+
operation: opMatch?.[1],
|
|
224
|
+
projectId: input.projectId,
|
|
225
|
+
connection: 'Google Cloud',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (/GITHUB_TOKEN|GH_TOKEN/i.test(text) && /401|invalid|Bad credentials/i.test(text)) {
|
|
230
|
+
return remediateGithubTokenShadow({
|
|
231
|
+
envTokenPresent: true,
|
|
232
|
+
keyringHealthy: true,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Human-readable card (never prints secrets).
|
|
241
|
+
* @param {RemediationCard} card
|
|
242
|
+
* @returns {string}
|
|
243
|
+
*/
|
|
244
|
+
export function renderRemediationCard(card) {
|
|
245
|
+
if (!card) return '';
|
|
246
|
+
const lines = [
|
|
247
|
+
'',
|
|
248
|
+
` Agent Sam · ${providerLabel(card.provider)}`,
|
|
249
|
+
'',
|
|
250
|
+
` ✕ ${card.title}`,
|
|
251
|
+
'',
|
|
252
|
+
];
|
|
253
|
+
if (card.ran?.length) {
|
|
254
|
+
lines.push(' You ran:');
|
|
255
|
+
for (const ran of card.ran) lines.push(` ${ran}`);
|
|
256
|
+
lines.push('');
|
|
257
|
+
}
|
|
258
|
+
if (card.summary) {
|
|
259
|
+
lines.push(` ${card.summary}`);
|
|
260
|
+
lines.push('');
|
|
261
|
+
}
|
|
262
|
+
if (card.notes?.length) {
|
|
263
|
+
for (const note of card.notes) lines.push(` ${note}`);
|
|
264
|
+
lines.push('');
|
|
265
|
+
}
|
|
266
|
+
if (card.actions?.length) {
|
|
267
|
+
lines.push(' Likely intent');
|
|
268
|
+
lines.push('');
|
|
269
|
+
card.actions.forEach((action, index) => {
|
|
270
|
+
const mark = action.recommended ? '★' : ' ';
|
|
271
|
+
lines.push(` ${mark} ${index + 1} ${action.title}`);
|
|
272
|
+
if (action.command) lines.push(` ${action.command}`);
|
|
273
|
+
if (action.docs_url) lines.push(` docs: ${action.docs_url}`);
|
|
274
|
+
lines.push('');
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
const keys = card.keys || {};
|
|
278
|
+
const keyBits = [];
|
|
279
|
+
if (keys.enter) keyBits.push(`[enter] ${keys.enter}`);
|
|
280
|
+
if (keys.h) keyBits.push(`[h] ${keys.h}`);
|
|
281
|
+
if (keys.p) keyBits.push(`[p] ${keys.p}`);
|
|
282
|
+
if (keys.o) keyBits.push(`[o] ${keys.o}`);
|
|
283
|
+
if (keys.c) keyBits.push(`[c] ${keys.c}`);
|
|
284
|
+
if (keys.esc) keyBits.push(`[esc] ${keys.esc}`);
|
|
285
|
+
if (keyBits.length) {
|
|
286
|
+
lines.push(` ${keyBits.join(' ')}`);
|
|
287
|
+
lines.push('');
|
|
288
|
+
}
|
|
289
|
+
return lines.join('\n');
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function providerLabel(provider) {
|
|
293
|
+
switch (clean(provider)) {
|
|
294
|
+
case 'google_cloud':
|
|
295
|
+
return 'Google Cloud';
|
|
296
|
+
case 'github':
|
|
297
|
+
return 'GitHub';
|
|
298
|
+
case 'cloudflare':
|
|
299
|
+
return 'Cloudflare';
|
|
300
|
+
default:
|
|
301
|
+
return clean(provider) || 'Provider';
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export function recommendedCommand(card) {
|
|
306
|
+
const hit = (card?.actions || []).find((row) => row.recommended && row.command);
|
|
307
|
+
return hit?.command || (card?.actions || []).find((row) => row.command)?.command || null;
|
|
308
|
+
}
|