aimeat 3.2.0 → 3.3.0
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/dist/.env.example +58 -1
- package/dist/build-stamp.json +4 -4
- package/dist/locales/en.json +41 -1
- package/dist/locales/es.json +41 -1
- package/dist/locales/fi.json +43 -3
- package/dist/public/changelog.json +12 -0
- package/dist/public/css/views/chat.css +388 -0
- package/dist/public/js/services/chat.js +190 -0
- package/dist/public/js/services/speech-reader.js +26 -0
- package/dist/public/lib/VENDORED.md +1 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser-eh.worker.js +14 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser.js +23 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-eh.wasm +0 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/extensions/v1.4.3/wasm_eh/parquet.duckdb_extension.wasm +0 -0
- package/dist/public/lib/vendored-assets.json +19 -0
- package/dist/public/llms-full-template.txt +2706 -0
- package/dist/public/llms-index-template.txt +60 -0
- package/dist/public/robots.node.txt +64 -23
- package/dist/public/spa.html +8 -1
- package/dist/public/views/chat/parts.js +257 -0
- package/dist/public/views/chat.js +327 -0
- package/dist/public/views/landing.js +24 -1
- package/dist/public/views/profile/agents/scope-model.js +320 -315
- package/dist/scripts/audit-mcp-schemas.js +41 -0
- package/dist/scripts/audit-mcp-schemas.js.map +1 -1
- package/dist/scripts/build-sdk-libs.d.ts.map +1 -1
- package/dist/scripts/build-sdk-libs.js +1 -0
- package/dist/scripts/build-sdk-libs.js.map +1 -1
- package/dist/scripts/check-ai-disclosure.js +11 -0
- package/dist/scripts/check-ai-disclosure.js.map +1 -1
- package/dist/scripts/check-denial-coverage.d.ts +29 -0
- package/dist/scripts/check-denial-coverage.d.ts.map +1 -0
- package/dist/scripts/check-denial-coverage.js +237 -0
- package/dist/scripts/check-denial-coverage.js.map +1 -0
- package/dist/scripts/check-ext-entrypoints.js +14 -2
- package/dist/scripts/check-ext-entrypoints.js.map +1 -1
- package/dist/scripts/check-outbound-fetch.d.ts.map +1 -1
- package/dist/scripts/check-outbound-fetch.js +16 -2
- package/dist/scripts/check-outbound-fetch.js.map +1 -1
- package/dist/scripts/check-sse-parity.js +14 -0
- package/dist/scripts/check-sse-parity.js.map +1 -1
- package/dist/scripts/indexnow.js +9 -7
- package/dist/scripts/indexnow.js.map +1 -1
- package/dist/src/auth/middleware.d.ts +7 -0
- package/dist/src/auth/middleware.d.ts.map +1 -1
- package/dist/src/auth/middleware.js +15 -21
- package/dist/src/auth/middleware.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +4 -0
- package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.js +11 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/apps.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/apps.js +88 -0
- package/dist/src/cli/connect/mcp/tools/apps.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.d.ts +7 -0
- package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.js +83 -4
- package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
- package/dist/src/cli/connect/onboarding-prompt.js +1 -1
- package/dist/src/cli/connect/skill-bundle.js +1 -1
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts +21 -0
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts.map +1 -0
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js +137 -0
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js.map +1 -0
- package/dist/src/cli/connect/tool-call-defs-core.d.ts +1 -0
- package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-core.js +30 -0
- package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
- package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call.js +2 -0
- package/dist/src/cli/connect/tool-call.js.map +1 -1
- package/dist/src/config-types-ai.d.ts +76 -0
- package/dist/src/config-types-ai.d.ts.map +1 -0
- package/dist/src/config-types-ai.js +15 -0
- package/dist/src/config-types-ai.js.map +1 -0
- package/dist/src/config-types.d.ts +11 -2
- package/dist/src/config-types.d.ts.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +25 -4
- package/dist/src/config.js.map +1 -1
- package/dist/src/data/builtin-skills.d.ts.map +1 -1
- package/dist/src/data/builtin-skills.js +3 -2
- package/dist/src/data/builtin-skills.js.map +1 -1
- package/dist/src/data/digital-signage-package.js +1 -1
- package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
- package/dist/src/data/library-packs/sdk.js +76 -0
- package/dist/src/data/library-packs/sdk.js.map +1 -1
- package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
- package/dist/src/data/library-packs/vendored.js +81 -0
- package/dist/src/data/library-packs/vendored.js.map +1 -1
- package/dist/src/data/library-packs.d.ts +2 -2
- package/dist/src/data/library-packs.js +2 -2
- package/dist/src/data/public-pages.d.ts +13 -0
- package/dist/src/data/public-pages.d.ts.map +1 -1
- package/dist/src/data/public-pages.js +153 -113
- package/dist/src/data/public-pages.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +1652 -36
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/index-start.d.ts.map +1 -1
- package/dist/src/index-start.js +3 -0
- package/dist/src/index-start.js.map +1 -1
- package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
- package/dist/src/mcp/agent-tasks.js +5 -0
- package/dist/src/mcp/agent-tasks.js.map +1 -1
- package/dist/src/mcp/ai-image.d.ts +22 -0
- package/dist/src/mcp/ai-image.d.ts.map +1 -0
- package/dist/src/mcp/ai-image.js +60 -0
- package/dist/src/mcp/ai-image.js.map +1 -0
- package/dist/src/mcp/annotations.d.ts +5 -0
- package/dist/src/mcp/annotations.d.ts.map +1 -1
- package/dist/src/mcp/annotations.js +18 -0
- package/dist/src/mcp/annotations.js.map +1 -1
- package/dist/src/mcp/apps-draft-edit.d.ts +28 -0
- package/dist/src/mcp/apps-draft-edit.d.ts.map +1 -0
- package/dist/src/mcp/apps-draft-edit.js +164 -0
- package/dist/src/mcp/apps-draft-edit.js.map +1 -0
- package/dist/src/mcp/apps-screenshot.d.ts +26 -0
- package/dist/src/mcp/apps-screenshot.d.ts.map +1 -0
- package/dist/src/mcp/apps-screenshot.js +39 -0
- package/dist/src/mcp/apps-screenshot.js.map +1 -0
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts +1 -0
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +40 -0
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts +3 -0
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +74 -0
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +1 -0
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
- package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
- package/dist/src/mcp/catalog/scopes.js +19 -1
- package/dist/src/mcp/catalog/scopes.js.map +1 -1
- package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
- package/dist/src/mcp/catalog/surfaces.js +18 -4
- package/dist/src/mcp/catalog/surfaces.js.map +1 -1
- package/dist/src/mcp/core-datapackage.d.ts +32 -0
- package/dist/src/mcp/core-datapackage.d.ts.map +1 -0
- package/dist/src/mcp/core-datapackage.js +188 -0
- package/dist/src/mcp/core-datapackage.js.map +1 -0
- package/dist/src/mcp/core-storage.d.ts +7 -3
- package/dist/src/mcp/core-storage.d.ts.map +1 -1
- package/dist/src/mcp/core-storage.js +27 -4
- package/dist/src/mcp/core-storage.js.map +1 -1
- package/dist/src/mcp/core.d.ts.map +1 -1
- package/dist/src/mcp/core.js +3 -0
- package/dist/src/mcp/core.js.map +1 -1
- package/dist/src/mcp/extensions.d.ts.map +1 -1
- package/dist/src/mcp/extensions.js +11 -1
- package/dist/src/mcp/extensions.js.map +1 -1
- package/dist/src/mcp/index.d.ts +9 -0
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +34 -0
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-task-schemas.js +12 -1
- package/dist/src/models/agent-task-schemas.js.map +1 -1
- package/dist/src/models/workflow-schemas.d.ts +178 -1
- package/dist/src/models/workflow-schemas.d.ts.map +1 -1
- package/dist/src/models/workflow-schemas.js +75 -0
- package/dist/src/models/workflow-schemas.js.map +1 -1
- package/dist/src/routes/admin-extensions.d.ts +4 -0
- package/dist/src/routes/admin-extensions.d.ts.map +1 -1
- package/dist/src/routes/admin-extensions.js +135 -142
- package/dist/src/routes/admin-extensions.js.map +1 -1
- package/dist/src/routes/agent-conventions.d.ts.map +1 -1
- package/dist/src/routes/agent-conventions.js +4 -2
- package/dist/src/routes/agent-conventions.js.map +1 -1
- package/dist/src/routes/agent-docs.d.ts +4 -4
- package/dist/src/routes/agent-docs.js +145 -145
- package/dist/src/routes/agent-docs.js.map +1 -1
- package/dist/src/routes/agent-messages.d.ts +6 -0
- package/dist/src/routes/agent-messages.d.ts.map +1 -1
- package/dist/src/routes/agent-messages.js +23 -1
- package/dist/src/routes/agent-messages.js.map +1 -1
- package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks/create-read.js +8 -1
- package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
- package/dist/src/routes/agent-tasks/lifecycle.d.ts +4 -1
- package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks/lifecycle.js +80 -2
- package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
- package/dist/src/routes/ai.d.ts +5 -0
- package/dist/src/routes/ai.d.ts.map +1 -1
- package/dist/src/routes/ai.js +51 -1
- package/dist/src/routes/ai.js.map +1 -1
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +5 -0
- package/dist/src/routes/app-grants.js.map +1 -1
- package/dist/src/routes/apps/drafts.d.ts +6 -0
- package/dist/src/routes/apps/drafts.d.ts.map +1 -1
- package/dist/src/routes/apps/drafts.js +133 -1
- package/dist/src/routes/apps/drafts.js.map +1 -1
- package/dist/src/routes/apps/read.d.ts.map +1 -1
- package/dist/src/routes/apps/read.js +38 -1
- package/dist/src/routes/apps/read.js.map +1 -1
- package/dist/src/routes/auth-otk.d.ts +28 -0
- package/dist/src/routes/auth-otk.d.ts.map +1 -0
- package/dist/src/routes/auth-otk.js +190 -0
- package/dist/src/routes/auth-otk.js.map +1 -0
- package/dist/src/routes/auth.d.ts +17 -0
- package/dist/src/routes/auth.d.ts.map +1 -1
- package/dist/src/routes/auth.js +44 -153
- package/dist/src/routes/auth.js.map +1 -1
- package/dist/src/routes/bootstrap.d.ts +6 -0
- package/dist/src/routes/bootstrap.d.ts.map +1 -1
- package/dist/src/routes/bootstrap.js +47 -20
- package/dist/src/routes/bootstrap.js.map +1 -1
- package/dist/src/routes/chat.d.ts +23 -0
- package/dist/src/routes/chat.d.ts.map +1 -0
- package/dist/src/routes/chat.js +165 -0
- package/dist/src/routes/chat.js.map +1 -0
- package/dist/src/routes/commerce.js +4 -4
- package/dist/src/routes/commerce.js.map +1 -1
- package/dist/src/routes/datapackages.d.ts +35 -0
- package/dist/src/routes/datapackages.d.ts.map +1 -0
- package/dist/src/routes/datapackages.js +217 -0
- package/dist/src/routes/datapackages.js.map +1 -0
- package/dist/src/routes/disputes.d.ts +8 -0
- package/dist/src/routes/disputes.d.ts.map +1 -1
- package/dist/src/routes/disputes.js +52 -1
- package/dist/src/routes/disputes.js.map +1 -1
- package/dist/src/routes/ecosystem-apps-advisories.d.ts +16 -0
- package/dist/src/routes/ecosystem-apps-advisories.d.ts.map +1 -0
- package/dist/src/routes/ecosystem-apps-advisories.js +104 -0
- package/dist/src/routes/ecosystem-apps-advisories.js.map +1 -0
- package/dist/src/routes/ecosystem-apps.d.ts +6 -0
- package/dist/src/routes/ecosystem-apps.d.ts.map +1 -1
- package/dist/src/routes/ecosystem-apps.js +31 -99
- package/dist/src/routes/ecosystem-apps.js.map +1 -1
- package/dist/src/routes/extensions/actions.d.ts.map +1 -1
- package/dist/src/routes/extensions/actions.js +29 -1
- package/dist/src/routes/extensions/actions.js.map +1 -1
- package/dist/src/routes/federation-sync/routing.d.ts.map +1 -1
- package/dist/src/routes/federation-sync/routing.js +12 -3
- package/dist/src/routes/federation-sync/routing.js.map +1 -1
- package/dist/src/routes/glossary.js +1 -1
- package/dist/src/routes/glossary.js.map +1 -1
- package/dist/src/routes/home/track.d.ts +5 -1
- package/dist/src/routes/home/track.d.ts.map +1 -1
- package/dist/src/routes/home/track.js +20 -6
- package/dist/src/routes/home/track.js.map +1 -1
- package/dist/src/routes/instances/install.d.ts +3 -0
- package/dist/src/routes/instances/install.d.ts.map +1 -1
- package/dist/src/routes/instances/install.js +17 -24
- package/dist/src/routes/instances/install.js.map +1 -1
- package/dist/src/routes/libs.js +1 -1
- package/dist/src/routes/libs.js.map +1 -1
- package/dist/src/routes/markdown-mirrors.js +1 -1
- package/dist/src/routes/markdown-mirrors.js.map +1 -1
- package/dist/src/routes/odata.d.ts +36 -0
- package/dist/src/routes/odata.d.ts.map +1 -0
- package/dist/src/routes/odata.js +143 -0
- package/dist/src/routes/odata.js.map +1 -0
- package/dist/src/routes/openrouter.d.ts +4 -0
- package/dist/src/routes/openrouter.d.ts.map +1 -1
- package/dist/src/routes/openrouter.js +10 -1
- package/dist/src/routes/openrouter.js.map +1 -1
- package/dist/src/routes/organisms/gates.d.ts.map +1 -1
- package/dist/src/routes/organisms/gates.js +9 -2
- package/dist/src/routes/organisms/gates.js.map +1 -1
- package/dist/src/routes/portal.d.ts +1 -0
- package/dist/src/routes/portal.d.ts.map +1 -1
- package/dist/src/routes/portal.js +13 -0
- package/dist/src/routes/portal.js.map +1 -1
- package/dist/src/routes/schedules.d.ts +4 -0
- package/dist/src/routes/schedules.d.ts.map +1 -1
- package/dist/src/routes/schedules.js +9 -1
- package/dist/src/routes/schedules.js.map +1 -1
- package/dist/src/routes/storage-files.d.ts +23 -0
- package/dist/src/routes/storage-files.d.ts.map +1 -1
- package/dist/src/routes/storage-files.js +103 -82
- package/dist/src/routes/storage-files.js.map +1 -1
- package/dist/src/routes/workflows.d.ts.map +1 -1
- package/dist/src/routes/workflows.js +9 -1
- package/dist/src/routes/workflows.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts +2 -0
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +20 -2
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
- package/dist/src/server-bootstrap/service-init.js +12 -7
- package/dist/src/server-bootstrap/service-init.js.map +1 -1
- package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
- package/dist/src/server-bootstrap/static-files.js +44 -10
- package/dist/src/server-bootstrap/static-files.js.map +1 -1
- package/dist/src/services/ai-allowance.d.ts +82 -0
- package/dist/src/services/ai-allowance.d.ts.map +1 -0
- package/dist/src/services/ai-allowance.js +117 -0
- package/dist/src/services/ai-allowance.js.map +1 -0
- package/dist/src/services/ai-completion.d.ts +26 -0
- package/dist/src/services/ai-completion.d.ts.map +1 -1
- package/dist/src/services/ai-completion.js +41 -13
- package/dist/src/services/ai-completion.js.map +1 -1
- package/dist/src/services/ai-image.d.ts +70 -0
- package/dist/src/services/ai-image.d.ts.map +1 -0
- package/dist/src/services/ai-image.js +104 -0
- package/dist/src/services/ai-image.js.map +1 -0
- package/dist/src/services/ai-model-defaults.d.ts +45 -0
- package/dist/src/services/ai-model-defaults.d.ts.map +1 -0
- package/dist/src/services/ai-model-defaults.js +42 -0
- package/dist/src/services/ai-model-defaults.js.map +1 -0
- package/dist/src/services/ai-tool-setup.d.ts +5 -1
- package/dist/src/services/ai-tool-setup.d.ts.map +1 -1
- package/dist/src/services/ai-tool-setup.js +36 -0
- package/dist/src/services/ai-tool-setup.js.map +1 -1
- package/dist/src/services/ai-transcription.d.ts +5 -0
- package/dist/src/services/ai-transcription.d.ts.map +1 -1
- package/dist/src/services/ai-transcription.js +5 -2
- package/dist/src/services/ai-transcription.js.map +1 -1
- package/dist/src/services/app-agent-surfaces.js +4 -4
- package/dist/src/services/app-agent-surfaces.js.map +1 -1
- package/dist/src/services/app-draft-edit.d.ts +144 -0
- package/dist/src/services/app-draft-edit.d.ts.map +1 -0
- package/dist/src/services/app-draft-edit.js +203 -0
- package/dist/src/services/app-draft-edit.js.map +1 -0
- package/dist/src/services/auth-md.js +2 -2
- package/dist/src/services/auth-md.js.map +1 -1
- package/dist/src/services/board-write.d.ts +11 -3
- package/dist/src/services/board-write.d.ts.map +1 -1
- package/dist/src/services/board-write.js +24 -3
- package/dist/src/services/board-write.js.map +1 -1
- package/dist/src/services/chat-agent.d.ts +36 -0
- package/dist/src/services/chat-agent.d.ts.map +1 -0
- package/dist/src/services/chat-agent.js +123 -0
- package/dist/src/services/chat-agent.js.map +1 -0
- package/dist/src/services/chat-session.d.ts +58 -0
- package/dist/src/services/chat-session.d.ts.map +1 -0
- package/dist/src/services/chat-session.js +151 -0
- package/dist/src/services/chat-session.js.map +1 -0
- package/dist/src/services/chat-threads.d.ts +61 -0
- package/dist/src/services/chat-threads.d.ts.map +1 -0
- package/dist/src/services/chat-threads.js +137 -0
- package/dist/src/services/chat-threads.js.map +1 -0
- package/dist/src/services/config-schema.d.ts.map +1 -1
- package/dist/src/services/config-schema.js +2 -1
- package/dist/src/services/config-schema.js.map +1 -1
- package/dist/src/services/datapackage/contract.d.ts +198 -0
- package/dist/src/services/datapackage/contract.d.ts.map +1 -0
- package/dist/src/services/datapackage/contract.js +140 -0
- package/dist/src/services/datapackage/contract.js.map +1 -0
- package/dist/src/services/datapackage/ext-capability.d.ts +85 -0
- package/dist/src/services/datapackage/ext-capability.d.ts.map +1 -0
- package/dist/src/services/datapackage/ext-capability.js +72 -0
- package/dist/src/services/datapackage/ext-capability.js.map +1 -0
- package/dist/src/services/datapackage/odata.d.ts +92 -0
- package/dist/src/services/datapackage/odata.d.ts.map +1 -0
- package/dist/src/services/datapackage/odata.js +256 -0
- package/dist/src/services/datapackage/odata.js.map +1 -0
- package/dist/src/services/datapackage/odps.d.ts +24 -0
- package/dist/src/services/datapackage/odps.d.ts.map +1 -0
- package/dist/src/services/datapackage/odps.js +183 -0
- package/dist/src/services/datapackage/odps.js.map +1 -0
- package/dist/src/services/datapackage/store.d.ts +143 -0
- package/dist/src/services/datapackage/store.d.ts.map +1 -0
- package/dist/src/services/datapackage/store.js +533 -0
- package/dist/src/services/datapackage/store.js.map +1 -0
- package/dist/src/services/datapackage/table.d.ts +67 -0
- package/dist/src/services/datapackage/table.d.ts.map +1 -0
- package/dist/src/services/datapackage/table.js +0 -0
- package/dist/src/services/datapackage/table.js.map +1 -0
- package/dist/src/services/extension-ctx.d.ts +1 -0
- package/dist/src/services/extension-ctx.d.ts.map +1 -1
- package/dist/src/services/extension-ctx.js +31 -6
- package/dist/src/services/extension-ctx.js.map +1 -1
- package/dist/src/services/extension-files.d.ts +20 -0
- package/dist/src/services/extension-files.d.ts.map +1 -1
- package/dist/src/services/extension-files.js +9 -2
- package/dist/src/services/extension-files.js.map +1 -1
- package/dist/src/services/extension-lifecycle.d.ts +3 -0
- package/dist/src/services/extension-lifecycle.d.ts.map +1 -1
- package/dist/src/services/extension-lifecycle.js +2 -26
- package/dist/src/services/extension-lifecycle.js.map +1 -1
- package/dist/src/services/extension-runtime.d.ts +28 -2
- package/dist/src/services/extension-runtime.d.ts.map +1 -1
- package/dist/src/services/extension-runtime.js +22 -0
- package/dist/src/services/extension-runtime.js.map +1 -1
- package/dist/src/services/extension-schedules.d.ts +90 -0
- package/dist/src/services/extension-schedules.d.ts.map +1 -0
- package/dist/src/services/extension-schedules.js +123 -0
- package/dist/src/services/extension-schedules.js.map +1 -0
- package/dist/src/services/extension-system-run.d.ts +91 -0
- package/dist/src/services/extension-system-run.d.ts.map +1 -0
- package/dist/src/services/extension-system-run.js +100 -0
- package/dist/src/services/extension-system-run.js.map +1 -0
- package/dist/src/services/extension-upsert.d.ts +2 -0
- package/dist/src/services/extension-upsert.d.ts.map +1 -1
- package/dist/src/services/extension-upsert.js +6 -24
- package/dist/src/services/extension-upsert.js.map +1 -1
- package/dist/src/services/goose-acp.d.ts +84 -0
- package/dist/src/services/goose-acp.d.ts.map +1 -0
- package/dist/src/services/goose-acp.js +304 -0
- package/dist/src/services/goose-acp.js.map +1 -0
- package/dist/src/services/markdown-negotiation.js +1 -1
- package/dist/src/services/markdown-negotiation.js.map +1 -1
- package/dist/src/services/openrouter.d.ts +20 -1
- package/dist/src/services/openrouter.d.ts.map +1 -1
- package/dist/src/services/openrouter.js +66 -0
- package/dist/src/services/openrouter.js.map +1 -1
- package/dist/src/services/prompt-defaults/tiers-core.js +4 -4
- package/dist/src/services/scheduler-extension-job.d.ts +29 -6
- package/dist/src/services/scheduler-extension-job.d.ts.map +1 -1
- package/dist/src/services/scheduler-extension-job.js +29 -75
- package/dist/src/services/scheduler-extension-job.js.map +1 -1
- package/dist/src/services/scope-vocabulary-migration.d.ts +34 -1
- package/dist/src/services/scope-vocabulary-migration.d.ts.map +1 -1
- package/dist/src/services/scope-vocabulary-migration.js +60 -0
- package/dist/src/services/scope-vocabulary-migration.js.map +1 -1
- package/dist/src/services/screenshot-capture.d.ts +40 -1
- package/dist/src/services/screenshot-capture.d.ts.map +1 -1
- package/dist/src/services/screenshot-capture.js +142 -60
- package/dist/src/services/screenshot-capture.js.map +1 -1
- package/dist/src/services/skill-bundle/generator.js +1 -1
- package/dist/src/services/skill-bundle/generic-adapter.js +1 -1
- package/dist/src/services/skill-bundle/hermes-adapter.js +1 -1
- package/dist/src/services/storage-file-write.d.ts +36 -1
- package/dist/src/services/storage-file-write.d.ts.map +1 -1
- package/dist/src/services/storage-file-write.js +49 -3
- package/dist/src/services/storage-file-write.js.map +1 -1
- package/dist/src/services/task-outcome.d.ts +53 -0
- package/dist/src/services/task-outcome.d.ts.map +1 -0
- package/dist/src/services/task-outcome.js +28 -0
- package/dist/src/services/task-outcome.js.map +1 -0
- package/dist/src/services/workflow/engine-human.d.ts +15 -0
- package/dist/src/services/workflow/engine-human.d.ts.map +1 -1
- package/dist/src/services/workflow/engine-human.js +10 -1
- package/dist/src/services/workflow/engine-human.js.map +1 -1
- package/dist/src/services/workflow/engine-steps.d.ts +48 -3
- package/dist/src/services/workflow/engine-steps.d.ts.map +1 -1
- package/dist/src/services/workflow/engine-steps.js +361 -0
- package/dist/src/services/workflow/engine-steps.js.map +1 -1
- package/dist/src/services/workflow/engine.d.ts +1 -0
- package/dist/src/services/workflow/engine.d.ts.map +1 -1
- package/dist/src/services/workflow/engine.js +2 -1
- package/dist/src/services/workflow/engine.js.map +1 -1
- package/dist/src/services/workflow/store.d.ts.map +1 -1
- package/dist/src/services/workflow/store.js +60 -4
- package/dist/src/services/workflow/store.js.map +1 -1
- package/dist/src/services/write-guards.d.ts +27 -1
- package/dist/src/services/write-guards.d.ts.map +1 -1
- package/dist/src/services/write-guards.js +39 -9
- package/dist/src/services/write-guards.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/db-types.d.ts +1 -0
- package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +3 -0
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts +2 -0
- package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/files.js +34 -2
- package/dist/src/storage/providers/postgres-kysely/methods/files.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/migrations/0039_storage_file_utf8_verified.sql +19 -0
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +2 -1
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/apps.js +33 -28
- package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts +1 -12
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +28 -135
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts +38 -0
- package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts.map +1 -0
- package/dist/src/storage/providers/sqlite/methods/storage-files.js +109 -0
- package/dist/src/storage/providers/sqlite/methods/storage-files.js.map +1 -0
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +134 -130
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/app-grant.repository.d.ts +11 -0
- package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/file.repository.d.ts +13 -0
- package/dist/src/storage/repositories/file.repository.d.ts.map +1 -1
- package/dist/src/storage/types/commerce.d.ts +6 -0
- package/dist/src/storage/types/commerce.d.ts.map +1 -1
- package/dist/src/utils/agent-footer.d.ts.map +1 -1
- package/dist/src/utils/agent-footer.js +1 -0
- package/dist/src/utils/agent-footer.js.map +1 -1
- package/dist/src/utils/app-content-type.d.ts +57 -3
- package/dist/src/utils/app-content-type.d.ts.map +1 -1
- package/dist/src/utils/app-content-type.js +81 -12
- package/dist/src/utils/app-content-type.js.map +1 -1
- package/dist/src/utils/env-config/sections-features.d.ts.map +1 -1
- package/dist/src/utils/env-config/sections-features.js +9 -3
- package/dist/src/utils/env-config/sections-features.js.map +1 -1
- package/dist/src/utils/file-download-headers.d.ts +5 -3
- package/dist/src/utils/file-download-headers.d.ts.map +1 -1
- package/dist/src/utils/file-download-headers.js +18 -5
- package/dist/src/utils/file-download-headers.js.map +1 -1
- package/dist/src/utils/http-range.d.ts +151 -0
- package/dist/src/utils/http-range.d.ts.map +1 -0
- package/dist/src/utils/http-range.js +190 -0
- package/dist/src/utils/http-range.js.map +1 -0
- package/dist/src/utils/page-head.d.ts +5 -0
- package/dist/src/utils/page-head.d.ts.map +1 -1
- package/dist/src/utils/page-head.js +10 -1
- package/dist/src/utils/page-head.js.map +1 -1
- package/dist/src/utils/reserved-keys.d.ts +4 -1
- package/dist/src/utils/reserved-keys.d.ts.map +1 -1
- package/dist/src/utils/reserved-keys.js +4 -1
- package/dist/src/utils/reserved-keys.js.map +1 -1
- package/dist/static/sdk-libs/datapackage/index.js +336 -0
- package/dist/static/sdk-libs/dist/aimeat-datapackage.js +305 -0
- package/package.json +10 -2
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/extension-schedules.ts
|
|
3
|
+
* @description Registering the schedules an extension's manifest declares, and saying WHOSE they are.
|
|
4
|
+
*
|
|
5
|
+
* A manifest-declared schedule is built in four places — activate (services/extension-lifecycle.ts),
|
|
6
|
+
* redeploy (services/extension-upsert.ts), package install (routes/instances/install.ts) and the
|
|
7
|
+
* admin install route — and all four built the record by hand. None of them stamped `ownerScope`,
|
|
8
|
+
* which cost every scheduled extension on aimeat.io: from 2026-08-15 the executor reads the owner
|
|
9
|
+
* off the JOB (services/scheduler-extension-job.ts) rather than off the extension record, so a job
|
|
10
|
+
* with no ownerScope refuses before it starts. Every `@activate` job on the node failed with
|
|
11
|
+
* "has no owner scope" on every restart, and every cron-bearing one on every fire.
|
|
12
|
+
*
|
|
13
|
+
* WHOSE A MANIFEST SCHEDULE IS. The installer's, always: the schedule comes from the extension's own
|
|
14
|
+
* manifest and is created by the act of installing it, so the responsible party is `installedBy` and
|
|
15
|
+
* nobody else. That is the value the executor used before it moved to the job record, and it is what
|
|
16
|
+
* is written here — as a GHII, because a schedule's ownerScope is a GHII everywhere else.
|
|
17
|
+
*
|
|
18
|
+
* The stamp is not decoration: it is what the RUN-time owner fence compares. An extension deleted
|
|
19
|
+
* and reinstalled by a DIFFERENT owner leaves the old job behind, and the old job then names the old
|
|
20
|
+
* owner while the record names the new one — which is exactly the case the fence exists for, and
|
|
21
|
+
* exactly the case a fallback to `ext.installedBy` would wave through.
|
|
22
|
+
* @structure
|
|
23
|
+
* - extensionJobOwnerScope() — the installer's GHII, from whatever form installedBy is in
|
|
24
|
+
* - registerExtensionSchedules() — build and store the manifest's jobs; replace or skip existing
|
|
25
|
+
* - backfillExtensionJobOwnerScope() — startup repair for jobs stored before the stamp existed
|
|
26
|
+
* @usage
|
|
27
|
+
* await registerExtensionSchedules({ storage, config, scheduler }, ext, actor);
|
|
28
|
+
* await registerExtensionSchedules({ storage, config, scheduler }, ext, actor, { replace: true });
|
|
29
|
+
* @version-history
|
|
30
|
+
* v1.0.0 — 2026-08-16 — Extracted from the four hand-built copies, with the ownerScope they all
|
|
31
|
+
* lacked. Adds the startup backfill, because an already-stored job is not re-created by a deploy.
|
|
32
|
+
*/
|
|
33
|
+
import type { AimeatConfig } from '../config.js';
|
|
34
|
+
import type { Storage, ExtensionRecord } from '../storage/interface.js';
|
|
35
|
+
import type { Scheduler } from './scheduler.js';
|
|
36
|
+
export interface ExtensionScheduleDeps {
|
|
37
|
+
storage: Storage;
|
|
38
|
+
config: AimeatConfig;
|
|
39
|
+
/** Absent on a door with no scheduler wired; then nothing is registered. */
|
|
40
|
+
scheduler?: Scheduler | null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The owner scope a manifest-declared job carries: the installer's GHII on this node.
|
|
44
|
+
*
|
|
45
|
+
* `installedBy` is a bare owner name on every door that writes it today, but one route stores
|
|
46
|
+
* `req.auth!.sub`, so the bare name is taken rather than assumed. Returns '' when there is nothing to
|
|
47
|
+
* derive, which the caller must treat as "do not stamp a wrong owner".
|
|
48
|
+
*/
|
|
49
|
+
export declare function extensionJobOwnerScope(installedBy: string | undefined, nodeId: string): string;
|
|
50
|
+
/** The scheduled-job id a manifest schedule gets. Stable: activate, redeploy and install all reuse it. */
|
|
51
|
+
export declare function extensionJobId(extensionName: string, scheduleId: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Did this job come from an extension's manifest, or did the owner create it?
|
|
54
|
+
*
|
|
55
|
+
* The id says so: a manifest job is addressed `ext:<extension>:<schedule>` and an owner-created one
|
|
56
|
+
* gets a UUID (services/schedule-write.ts). The distinction is what the schedules view is built on —
|
|
57
|
+
* a manifest job is shown as a fact about the extension, an owner's own schedule is shown with the
|
|
58
|
+
* controls that edit it — and the two used to be told apart by ownerScope, which stopped separating
|
|
59
|
+
* anything the moment a manifest job started carrying one.
|
|
60
|
+
*/
|
|
61
|
+
export declare function isManifestDeclaredJob(job: {
|
|
62
|
+
id: string;
|
|
63
|
+
type?: string;
|
|
64
|
+
}): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Register the schedules an extension's manifest declares.
|
|
67
|
+
*
|
|
68
|
+
* `replace: true` drops the extension's existing jobs first — what a redeploy needs, because the new
|
|
69
|
+
* manifest's schedules are the whole truth about its clock. Without it an id that already exists is
|
|
70
|
+
* left alone, which is what activation and package install need: they must not restart a job that has
|
|
71
|
+
* been running.
|
|
72
|
+
*
|
|
73
|
+
* Returns how many jobs were created.
|
|
74
|
+
*/
|
|
75
|
+
export declare function registerExtensionSchedules(deps: ExtensionScheduleDeps, ext: ExtensionRecord, actor: string, opts?: {
|
|
76
|
+
replace?: boolean;
|
|
77
|
+
}): Promise<number>;
|
|
78
|
+
/**
|
|
79
|
+
* Stamp the missing owner scope onto extension jobs stored before it was written.
|
|
80
|
+
*
|
|
81
|
+
* A deploy does not fix these on its own: activation and install skip an id that already exists, so a
|
|
82
|
+
* job created by the old code keeps its old shape until somebody rewrites it. Runs at startup BEFORE
|
|
83
|
+
* the scheduler starts, so the first `@activate` wave after a restart already has what it needs.
|
|
84
|
+
*
|
|
85
|
+
* The extension record is the only place the answer can come from, and it is the same answer the
|
|
86
|
+
* executor itself used until 2026-08-15. A job whose extension is gone is left alone: it names nobody,
|
|
87
|
+
* and it would refuse for the better reason a moment later anyway.
|
|
88
|
+
*/
|
|
89
|
+
export declare function backfillExtensionJobOwnerScope(config: AimeatConfig, storage: Storage): Promise<number>;
|
|
90
|
+
//# sourceMappingURL=extension-schedules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-schedules.d.ts","sourceRoot":"","sources":["../../../src/services/extension-schedules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG9F;AAED,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAEjF;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC5C,IAAI,EAAE,qBAAqB,EAC3B,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,CAAC,CAgDjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB5G"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* The owner scope a manifest-declared job carries: the installer's GHII on this node.
|
|
4
|
+
*
|
|
5
|
+
* `installedBy` is a bare owner name on every door that writes it today, but one route stores
|
|
6
|
+
* `req.auth!.sub`, so the bare name is taken rather than assumed. Returns '' when there is nothing to
|
|
7
|
+
* derive, which the caller must treat as "do not stamp a wrong owner".
|
|
8
|
+
*/
|
|
9
|
+
export function extensionJobOwnerScope(installedBy, nodeId) {
|
|
10
|
+
const bare = (installedBy ?? '').split('@')[0];
|
|
11
|
+
return bare ? `${bare}@${nodeId}` : '';
|
|
12
|
+
}
|
|
13
|
+
/** The scheduled-job id a manifest schedule gets. Stable: activate, redeploy and install all reuse it. */
|
|
14
|
+
export function extensionJobId(extensionName, scheduleId) {
|
|
15
|
+
return `ext:${extensionName}:${scheduleId}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Did this job come from an extension's manifest, or did the owner create it?
|
|
19
|
+
*
|
|
20
|
+
* The id says so: a manifest job is addressed `ext:<extension>:<schedule>` and an owner-created one
|
|
21
|
+
* gets a UUID (services/schedule-write.ts). The distinction is what the schedules view is built on —
|
|
22
|
+
* a manifest job is shown as a fact about the extension, an owner's own schedule is shown with the
|
|
23
|
+
* controls that edit it — and the two used to be told apart by ownerScope, which stopped separating
|
|
24
|
+
* anything the moment a manifest job started carrying one.
|
|
25
|
+
*/
|
|
26
|
+
export function isManifestDeclaredJob(job) {
|
|
27
|
+
return job.type === 'extension' && job.id.startsWith('ext:');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Register the schedules an extension's manifest declares.
|
|
31
|
+
*
|
|
32
|
+
* `replace: true` drops the extension's existing jobs first — what a redeploy needs, because the new
|
|
33
|
+
* manifest's schedules are the whole truth about its clock. Without it an id that already exists is
|
|
34
|
+
* left alone, which is what activation and package install need: they must not restart a job that has
|
|
35
|
+
* been running.
|
|
36
|
+
*
|
|
37
|
+
* Returns how many jobs were created.
|
|
38
|
+
*/
|
|
39
|
+
export async function registerExtensionSchedules(deps, ext, actor, opts = {}) {
|
|
40
|
+
const { storage, config, scheduler } = deps;
|
|
41
|
+
if (!scheduler)
|
|
42
|
+
return 0;
|
|
43
|
+
if (opts.replace) {
|
|
44
|
+
const existing = await storage.listScheduledJobs({ extensionName: ext.name });
|
|
45
|
+
for (const job of existing) {
|
|
46
|
+
scheduler.removeJob(job.id);
|
|
47
|
+
await storage.deleteScheduledJob(job.id);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const schedules = ext.config?.__schedules ?? [];
|
|
51
|
+
if (schedules.length === 0)
|
|
52
|
+
return 0;
|
|
53
|
+
const ownerScope = extensionJobOwnerScope(ext.installedBy, config.nodeId);
|
|
54
|
+
if (!ownerScope) {
|
|
55
|
+
// An unattended run has no owner to be, so a job that cannot name one would only fail later.
|
|
56
|
+
logger.error(`Extension "${ext.name}" has no installer — its ${schedules.length} manifest schedules were NOT registered`);
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
let created = 0;
|
|
60
|
+
for (const sched of schedules) {
|
|
61
|
+
const jobId = extensionJobId(ext.name, sched.id);
|
|
62
|
+
if (!opts.replace && await storage.getScheduledJob(jobId))
|
|
63
|
+
continue;
|
|
64
|
+
const now = new Date().toISOString();
|
|
65
|
+
const jobRecord = {
|
|
66
|
+
id: jobId,
|
|
67
|
+
name: sched.description ?? `${ext.name}/${sched.id}`,
|
|
68
|
+
type: 'extension',
|
|
69
|
+
extensionName: ext.name,
|
|
70
|
+
actionId: sched.action,
|
|
71
|
+
cron: sched.cron,
|
|
72
|
+
enabled: true,
|
|
73
|
+
input: sched.input ?? undefined,
|
|
74
|
+
// Whose it is, and what the run-time owner fence compares. See the file header.
|
|
75
|
+
ownerScope,
|
|
76
|
+
createdBy: actor,
|
|
77
|
+
createdAt: now,
|
|
78
|
+
updatedAt: now,
|
|
79
|
+
};
|
|
80
|
+
await storage.createScheduledJob(jobRecord);
|
|
81
|
+
scheduler.addJob(jobRecord);
|
|
82
|
+
created++;
|
|
83
|
+
logger.info(`Registered scheduled job: ${jobId}`, { cron: jobRecord.cron, ownerScope });
|
|
84
|
+
}
|
|
85
|
+
return created;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Stamp the missing owner scope onto extension jobs stored before it was written.
|
|
89
|
+
*
|
|
90
|
+
* A deploy does not fix these on its own: activation and install skip an id that already exists, so a
|
|
91
|
+
* job created by the old code keeps its old shape until somebody rewrites it. Runs at startup BEFORE
|
|
92
|
+
* the scheduler starts, so the first `@activate` wave after a restart already has what it needs.
|
|
93
|
+
*
|
|
94
|
+
* The extension record is the only place the answer can come from, and it is the same answer the
|
|
95
|
+
* executor itself used until 2026-08-15. A job whose extension is gone is left alone: it names nobody,
|
|
96
|
+
* and it would refuse for the better reason a moment later anyway.
|
|
97
|
+
*/
|
|
98
|
+
export async function backfillExtensionJobOwnerScope(config, storage) {
|
|
99
|
+
const jobs = await storage.listScheduledJobs({ type: 'extension' });
|
|
100
|
+
let repaired = 0;
|
|
101
|
+
let orphaned = 0;
|
|
102
|
+
for (const job of jobs) {
|
|
103
|
+
if (job.ownerScope || !job.extensionName)
|
|
104
|
+
continue;
|
|
105
|
+
const ext = await storage.getExtension(job.extensionName);
|
|
106
|
+
const ownerScope = extensionJobOwnerScope(ext?.installedBy, config.nodeId);
|
|
107
|
+
if (!ownerScope) {
|
|
108
|
+
orphaned++;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
await storage.updateScheduledJob(job.id, { ownerScope, updatedAt: new Date().toISOString() });
|
|
112
|
+
repaired++;
|
|
113
|
+
}
|
|
114
|
+
if (repaired > 0)
|
|
115
|
+
logger.info(`Stamped owner scope onto ${repaired} extension scheduled jobs`);
|
|
116
|
+
if (orphaned > 0) {
|
|
117
|
+
// These keep refusing, and the log says why rather than leaving the same line to repeat on
|
|
118
|
+
// every fire: there is no installer to name, because the extension is gone or never had one.
|
|
119
|
+
logger.warn(`${orphaned} extension scheduled jobs have no installer to name — they will refuse until their extension is reinstalled`);
|
|
120
|
+
}
|
|
121
|
+
return repaired;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=extension-schedules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-schedules.js","sourceRoot":"","sources":["../../../src/services/extension-schedules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/extension-system-run.ts
|
|
3
|
+
* @description Running one extension action with NOBODY PRESENT — the shared half of the two roads
|
|
4
|
+
* that do it: a schedule firing on a clock, and a workflow step reaching its turn.
|
|
5
|
+
*
|
|
6
|
+
* WHY THIS IS ONE FUNCTION. The steps between "an id names an action" and "the sandbox starts" are
|
|
7
|
+
* seven, and every one of them is a place a road can be wrong differently: resolve the extension,
|
|
8
|
+
* refuse an inactive one, find the action, refuse a stranger's, decrypt the manifest secrets,
|
|
9
|
+
* resolve the instance and ITS secrets, build the context. The scheduler road had all seven; the
|
|
10
|
+
* workflow road was about to grow a second copy of them. This node has already paid for that shape
|
|
11
|
+
* once — four hand-built sandbox contexts, each missing a different guard, five findings in the
|
|
12
|
+
* August 2026 audit — which is why `services/extension-ctx.ts` exists and why the layer above it
|
|
13
|
+
* should not be re-derived either.
|
|
14
|
+
*
|
|
15
|
+
* THE ONE RULE THAT MAKES AN UNATTENDED CALL SAFE: it must be the OWNER'S OWN EXTENSION. A system
|
|
16
|
+
* run has no paywall, no contract and no meter — there is no door where a price could be asked —
|
|
17
|
+
* so a clock or a workflow pointed at somebody else's extension is an unlimited standing call on
|
|
18
|
+
* their capability, their API keys and their quota. `POST /v1/schedules` has refused that since it
|
|
19
|
+
* was written (services/schedule-write.ts); here it is checked again at RUN time, because
|
|
20
|
+
* `installedBy` is decided at install and a saved schedule or workflow outlives the record it
|
|
21
|
+
* names. A create-time gate cannot see a delete-and-reinstall by a different owner.
|
|
22
|
+
*
|
|
23
|
+
* WHAT A SYSTEM RUN DOES NOT GET: a wallet. Nobody's balance is available to spend when nobody is
|
|
24
|
+
* present, so `ctx.wallet` is the empty object it has always been on these roads, and a script that
|
|
25
|
+
* reaches for it gets `undefined` rather than someone else's money.
|
|
26
|
+
* @structure SystemRunTarget · SystemRunPrincipal · runExtensionActionAsSystem
|
|
27
|
+
* @usage
|
|
28
|
+
* const out = await runExtensionActionAsSystem({ storage, config, emailService }, {
|
|
29
|
+
* extensionName, actionId, instanceId, input,
|
|
30
|
+
* callerGaii: `scheduler@${config.nodeId}`, storageOwnerGhii: ownerGhii, ownerName,
|
|
31
|
+
* logLabel: 'scheduler',
|
|
32
|
+
* });
|
|
33
|
+
* @version-history
|
|
34
|
+
* v1.0.0 -- 2026-08-15 -- TARGET-063 A3: extracted from services/scheduler-extension-job.ts when
|
|
35
|
+
* the workflow engine gained an `extension` step and would otherwise have grown the second copy.
|
|
36
|
+
*/
|
|
37
|
+
import type { AimeatConfig } from '../config.js';
|
|
38
|
+
import type { Storage } from '../storage/interface.js';
|
|
39
|
+
import type { EmailService } from './email.js';
|
|
40
|
+
export interface SystemRunDeps {
|
|
41
|
+
storage: Storage;
|
|
42
|
+
config: AimeatConfig;
|
|
43
|
+
emailService?: EmailService;
|
|
44
|
+
}
|
|
45
|
+
export interface SystemRunArgs {
|
|
46
|
+
extensionName: string;
|
|
47
|
+
actionId: string;
|
|
48
|
+
/** Instance-scoped run: its config (secrets decrypted) is handed to the sandbox as ctx.instance. */
|
|
49
|
+
instanceId?: string;
|
|
50
|
+
input?: Record<string, unknown>;
|
|
51
|
+
/**
|
|
52
|
+
* What the sandbox sees as `ctx.caller.gaii`. A schedule passes `scheduler@<node>` — there is
|
|
53
|
+
* genuinely nobody — while a workflow step passes the run's owner GHII, because a workflow HAS
|
|
54
|
+
* an owner and naming them is more honest than naming a machine.
|
|
55
|
+
*/
|
|
56
|
+
callerGaii: string;
|
|
57
|
+
/** Bare owner name: whose notifications, whose email consents, whose extension this must be. */
|
|
58
|
+
ownerName: string;
|
|
59
|
+
/**
|
|
60
|
+
* The namespace `ctx.files` reads and writes. ALWAYS the owner's GHII on these roads, never the
|
|
61
|
+
* caller — a data package produced on a clock has to sit at the same permanent
|
|
62
|
+
* `/v1/pub/<owner>/…` address as the same package produced from the app or by an agent, and
|
|
63
|
+
* `scheduler@<node>` owns no storage at all.
|
|
64
|
+
*/
|
|
65
|
+
storageOwnerGhii: string;
|
|
66
|
+
/** Distinguishes this road in the sandbox's log lines, e.g. 'scheduler' or 'wf:daily-scan'. */
|
|
67
|
+
logLabel: string;
|
|
68
|
+
/** What a data package produced on this road records as its producer. A clock and a workflow are
|
|
69
|
+
* different things to a consumer deciding whether to trust a cadence. */
|
|
70
|
+
producerKind: 'extension' | 'workflow';
|
|
71
|
+
/** The producer's own address — the schedule id or the workflow's `id/step` — so a consumer
|
|
72
|
+
* looking at a package can find the thing that makes it. */
|
|
73
|
+
producerRef?: string;
|
|
74
|
+
/** The cron the producer runs on, when it has one. This is what `updateFrequency` in the ODPS
|
|
75
|
+
* SLA block is projected from, so it is recorded rather than described. */
|
|
76
|
+
producerSchedule?: string;
|
|
77
|
+
/** Wrap the context in memory-access tracking and return the reads/writes (the scheduler logs them). */
|
|
78
|
+
trackMemory?: boolean;
|
|
79
|
+
}
|
|
80
|
+
export interface SystemRunResult {
|
|
81
|
+
result: unknown;
|
|
82
|
+
reads: string[];
|
|
83
|
+
writes: string[];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Run one action with nobody present. Throws on every refusal rather than returning a shape the
|
|
87
|
+
* caller has to remember to inspect: both roads treat a thrown error as a failed run that notifies
|
|
88
|
+
* the owner, and a returned "not really" would be recorded as success by each of them.
|
|
89
|
+
*/
|
|
90
|
+
export declare function runExtensionActionAsSystem(deps: SystemRunDeps, args: SystemRunArgs): Promise<SystemRunResult>;
|
|
91
|
+
//# sourceMappingURL=extension-system-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-system-run.d.ts","sourceRoot":"","sources":["../../../src/services/extension-system-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAQvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,oGAAoG;IACpG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,QAAQ,EAAE,MAAM,CAAC;IACjB;8EAC0E;IAC1E,YAAY,EAAE,WAAW,GAAG,UAAU,CAAC;IACvC;iEAC6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;gFAC4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wGAAwG;IACxG,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA0FnH"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { executeExtensionAction, trackMemoryAccess } from './extension-runtime.js';
|
|
2
|
+
import { buildExtensionCtx, buildExtensionNotify, buildExtensionEmail, sandboxLimits } from './extension-ctx.js';
|
|
3
|
+
import { makeExtensionFiles } from './extension-files.js';
|
|
4
|
+
import { makeExtensionDataPackage } from './datapackage/ext-capability.js';
|
|
5
|
+
import { getEncryptionKey } from './encryption.js';
|
|
6
|
+
import { getExtSecretKeys, getInstanceSecretKeys, decryptSecretFields } from './extension-secrets.js';
|
|
7
|
+
/**
|
|
8
|
+
* Run one action with nobody present. Throws on every refusal rather than returning a shape the
|
|
9
|
+
* caller has to remember to inspect: both roads treat a thrown error as a failed run that notifies
|
|
10
|
+
* the owner, and a returned "not really" would be recorded as success by each of them.
|
|
11
|
+
*/
|
|
12
|
+
export async function runExtensionActionAsSystem(deps, args) {
|
|
13
|
+
const { storage, config, emailService } = deps;
|
|
14
|
+
const { extensionName, actionId, instanceId, ownerName, callerGaii, storageOwnerGhii, logLabel } = args;
|
|
15
|
+
const ext = await storage.getExtension(extensionName);
|
|
16
|
+
if (!ext)
|
|
17
|
+
throw new Error(`Extension "${extensionName}" not found`);
|
|
18
|
+
if (ext.status !== 'active')
|
|
19
|
+
throw new Error(`Extension "${extensionName}" is not active`);
|
|
20
|
+
// The fence. See the file header: an unattended call has no door where a price could be asked.
|
|
21
|
+
if (ext.installedBy !== ownerName) {
|
|
22
|
+
throw new Error(`Extension "${extensionName}" belongs to another owner — an unattended run may only call your own`);
|
|
23
|
+
}
|
|
24
|
+
const action = ext.actions.find(a => a.id === actionId);
|
|
25
|
+
if (!action)
|
|
26
|
+
throw new Error(`Action "${actionId}" not found in extension "${extensionName}"`);
|
|
27
|
+
const encKey = getEncryptionKey(config);
|
|
28
|
+
const extMemoryOwner = instanceId ? `ext:${ext.name}.${instanceId}` : `ext:${ext.name}`;
|
|
29
|
+
// An instance-scoped run gets the same bring-your-own-key config a live instance action would;
|
|
30
|
+
// `type: 'secret'` fields are decrypted just before the VM (services/extension-secrets.ts).
|
|
31
|
+
let instanceCtx;
|
|
32
|
+
if (instanceId) {
|
|
33
|
+
const inst = await storage.getExtensionInstance(ext.name, instanceId);
|
|
34
|
+
instanceCtx = {
|
|
35
|
+
id: instanceId,
|
|
36
|
+
config: inst
|
|
37
|
+
? decryptSecretFields(inst.config, getInstanceSecretKeys(ext), encKey)
|
|
38
|
+
: (args.input ?? {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const baseCtx = buildExtensionCtx({
|
|
42
|
+
config,
|
|
43
|
+
storage,
|
|
44
|
+
extMemoryOwner,
|
|
45
|
+
// 'operator' is what the sandbox reads to decide no human is present. It is the role even
|
|
46
|
+
// when `gaii` names the owner: a workflow step acts in the owner's name, it is not the owner
|
|
47
|
+
// sitting at a screen, and an IAM gate that treats the two the same would let an unattended
|
|
48
|
+
// run pass a door meant for a person.
|
|
49
|
+
caller: { gaii: callerGaii, owner: ownerName, roles: ['operator'] },
|
|
50
|
+
extConfig: decryptSecretFields(ext.config, getExtSecretKeys(ext), encKey),
|
|
51
|
+
instance: instanceCtx,
|
|
52
|
+
logPrefix: `[ext:${ext.name}:${logLabel}]`,
|
|
53
|
+
// No wallet: see the file header.
|
|
54
|
+
files: makeExtensionFiles({
|
|
55
|
+
config, storage, extName: ext.name,
|
|
56
|
+
callerGaii: storageOwnerGhii,
|
|
57
|
+
callerOwner: ownerName,
|
|
58
|
+
}),
|
|
59
|
+
// The deterministic producers live here, so this is the road ctx.datapackage exists for.
|
|
60
|
+
// Owner namespace on both roads, and the producer block records WHICH unattended road it
|
|
61
|
+
// was: a package a clock refreshes weekly and one a workflow rebuilds after a human approval
|
|
62
|
+
// are different products, and a buyer choosing between them needs to see which is which.
|
|
63
|
+
datapackage: makeExtensionDataPackage({
|
|
64
|
+
config, storage,
|
|
65
|
+
ownerGhii: storageOwnerGhii,
|
|
66
|
+
producedBy: {
|
|
67
|
+
gaii: callerGaii,
|
|
68
|
+
kind: args.producerKind,
|
|
69
|
+
ref: args.producerRef ?? `${ext.name}/${actionId}`,
|
|
70
|
+
...(args.producerSchedule ? { schedule: args.producerSchedule } : {}),
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
notify: buildExtensionNotify({
|
|
74
|
+
storage, config, extName: ext.name,
|
|
75
|
+
recipientGaii: ownerName, recipientOwner: ownerName,
|
|
76
|
+
}),
|
|
77
|
+
email: buildExtensionEmail({
|
|
78
|
+
storage, config, extName: ext.name, extConfig: ext.config,
|
|
79
|
+
ownerName, emailService,
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
const tracked = args.trackMemory ? trackMemoryAccess(baseCtx) : null;
|
|
83
|
+
const ctx = tracked ? tracked.ctx : baseCtx;
|
|
84
|
+
// Reject a non-serialisable input before the VM rather than inside it, where the failure reads
|
|
85
|
+
// as a script bug.
|
|
86
|
+
let input;
|
|
87
|
+
try {
|
|
88
|
+
input = JSON.parse(JSON.stringify(args.input ?? {}));
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
throw new Error(`Extension run "${extensionName}/${actionId}" has non-serializable input`);
|
|
92
|
+
}
|
|
93
|
+
const result = await executeExtensionAction(action.scriptContent, ctx, input, sandboxLimits(ext.limits, config));
|
|
94
|
+
return {
|
|
95
|
+
result,
|
|
96
|
+
reads: tracked?.accessLog.reads ?? [],
|
|
97
|
+
writes: tracked?.accessLog.writes ?? [],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=extension-system-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-system-run.js","sourceRoot":"","sources":["../../../src/services/extension-system-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
* { ownerName, actor, wasActive });
|
|
18
18
|
* if (!out.record) return refuse('the write did not apply');
|
|
19
19
|
* @version-history
|
|
20
|
+
* v1.1.0 — 2026-08-16 — Schedule re-registration goes through services/extension-schedules.ts, so a
|
|
21
|
+
* redeployed extension's jobs carry the installer's `ownerScope` like every other road's.
|
|
20
22
|
* v1.0.0 — 2026-08-11 — Extracted after the copied-logic check found the pair.
|
|
21
23
|
*/
|
|
22
24
|
import type { AimeatConfig } from '../config.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-upsert.d.ts","sourceRoot":"","sources":["../../../src/services/extension-upsert.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"extension-upsert.d.ts","sourceRoot":"","sources":["../../../src/services/extension-upsert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,gGAAgG;IAChG,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC1B,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CACxC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,CAiCrE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { reconcileAfterExtensionWrite } from './exchange-projection.js';
|
|
2
|
+
import { registerExtensionSchedules } from './extension-schedules.js';
|
|
2
3
|
import { logger } from '../utils/logger.js';
|
|
3
4
|
/**
|
|
4
5
|
* Replace an installed extension's code and metadata, preserving its lifecycle fields and its
|
|
@@ -31,30 +32,11 @@ export async function upsertExtensionInPlace(deps, name, record, ctx) {
|
|
|
31
32
|
// is already live — each call reads scriptContent fresh from storage.
|
|
32
33
|
if (!(ctx.wasActive && scheduler))
|
|
33
34
|
return { record: updated, reinitialized: false };
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
const schedules = record.config.__schedules ?? [];
|
|
40
|
-
for (const sched of schedules) {
|
|
41
|
-
const now = new Date().toISOString();
|
|
42
|
-
const jobRecord = {
|
|
43
|
-
id: `ext:${name}:${sched.id}`,
|
|
44
|
-
name: sched.description ?? `${name}/${sched.id}`,
|
|
45
|
-
type: 'extension',
|
|
46
|
-
extensionName: name,
|
|
47
|
-
actionId: sched.action,
|
|
48
|
-
cron: sched.cron,
|
|
49
|
-
enabled: true,
|
|
50
|
-
input: sched.input ?? undefined,
|
|
51
|
-
createdBy: ctx.actor,
|
|
52
|
-
createdAt: now,
|
|
53
|
-
updatedAt: now,
|
|
54
|
-
};
|
|
55
|
-
await storage.createScheduledJob(jobRecord);
|
|
56
|
-
scheduler.addJob(jobRecord);
|
|
57
|
-
}
|
|
35
|
+
// `replace: true`: the new manifest's schedules are the whole truth about this extension's clock,
|
|
36
|
+
// so the old ones go first. The jobs are stamped with the INSTALLER's owner scope, which is
|
|
37
|
+
// `updated.installedBy` and not the redeployer — an operator may write on somebody else's behalf,
|
|
38
|
+
// and the schedule still belongs to the person whose extension it is.
|
|
39
|
+
await registerExtensionSchedules({ storage, config, scheduler }, updated, ctx.actor, { replace: true });
|
|
58
40
|
scheduler.runActivateJobs(name).catch(err => logger.error(`Failed to run @activate jobs for ${name}`, { error: String(err) }));
|
|
59
41
|
return { record: updated, reinitialized: true };
|
|
60
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-upsert.js","sourceRoot":"","sources":["../../../src/services/extension-upsert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extension-upsert.js","sourceRoot":"","sources":["../../../src/services/extension-upsert.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAkB5C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,IAAgB,EAChB,IAAY,EACZ,MAAuB,EACvB,GAAkB;IAElB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAE5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE;QAChD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC9B,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAE5D,kGAAkG;IAClG,MAAM,4BAA4B,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEhF,0FAA0F;IAC1F,+FAA+F;IAC/F,sEAAsE;IACtE,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAEpF,kGAAkG;IAClG,4FAA4F;IAC5F,kGAAkG;IAClG,sEAAsE;IACtE,MAAM,0BAA0B,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CACxC,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEtF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { AimeatConfig } from '../config.js';
|
|
2
|
+
/** An MCP server handed to one session. `http` is the transport goose reports as supported. */
|
|
3
|
+
export interface AcpMcpServer {
|
|
4
|
+
name: string;
|
|
5
|
+
type: 'http';
|
|
6
|
+
url: string;
|
|
7
|
+
headers?: Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
value: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
/** One thing that happened during a turn, flattened for the chat surface to render. */
|
|
13
|
+
export type SessionUpdate = {
|
|
14
|
+
kind: 'text';
|
|
15
|
+
text: string;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'thought';
|
|
18
|
+
text: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'tool_call';
|
|
21
|
+
id: string;
|
|
22
|
+
title: string;
|
|
23
|
+
status: string;
|
|
24
|
+
raw: unknown;
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'other';
|
|
27
|
+
type: string;
|
|
28
|
+
raw: unknown;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'done';
|
|
31
|
+
stopReason: string;
|
|
32
|
+
tokens?: number;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'error';
|
|
35
|
+
message: string;
|
|
36
|
+
};
|
|
37
|
+
export declare class GooseAcpClient {
|
|
38
|
+
private readonly child;
|
|
39
|
+
private nextId;
|
|
40
|
+
private readonly pending;
|
|
41
|
+
private readonly bus;
|
|
42
|
+
private buffer;
|
|
43
|
+
private closed;
|
|
44
|
+
private constructor();
|
|
45
|
+
/**
|
|
46
|
+
* Start the agent and shake hands.
|
|
47
|
+
*
|
|
48
|
+
* Client capabilities are declared HONESTLY: no filesystem, no terminal. The node has neither to
|
|
49
|
+
* offer a hosted agent, and claiming otherwise then failing the callback is worse than saying no
|
|
50
|
+
* up front — the agent plans around what the client says it can do.
|
|
51
|
+
*/
|
|
52
|
+
static start(config: AimeatConfig): Promise<GooseAcpClient>;
|
|
53
|
+
/** Split the stream into lines; every line is one JSON-RPC message. */
|
|
54
|
+
private onData;
|
|
55
|
+
/** A reply to us, a request FROM the agent that must be answered, or a notification. */
|
|
56
|
+
private dispatch;
|
|
57
|
+
/**
|
|
58
|
+
* Answer the agent's callbacks.
|
|
59
|
+
*
|
|
60
|
+
* Permission is granted, because the node already decided what this session may do: the session's
|
|
61
|
+
* MCP token carries the owner's scopes and the tool surface refuses what it must. A second
|
|
62
|
+
* yes/no here would be a permission model in a place that cannot see the identity.
|
|
63
|
+
*
|
|
64
|
+
* Filesystem and terminal are refused, matching what start() declared.
|
|
65
|
+
*/
|
|
66
|
+
private answerAgentRequest;
|
|
67
|
+
private write;
|
|
68
|
+
private failAllPending;
|
|
69
|
+
private call;
|
|
70
|
+
/** Start a session with its own MCP servers. `cwd` is required by the protocol and unused here. */
|
|
71
|
+
newSession(opts: {
|
|
72
|
+
mcpServers: AcpMcpServer[];
|
|
73
|
+
cwd?: string;
|
|
74
|
+
}): Promise<string>;
|
|
75
|
+
/** Run one turn, yielding what happens as it happens. */
|
|
76
|
+
prompt(sessionId: string, text: string): AsyncGenerator<SessionUpdate>;
|
|
77
|
+
/** Ask the agent to stop the current turn. */
|
|
78
|
+
cancel(sessionId: string): Promise<void>;
|
|
79
|
+
/** Stop the agent. SIGTERM first; a child that ignores it is killed after a grace period. */
|
|
80
|
+
close(): void;
|
|
81
|
+
}
|
|
82
|
+
/** The aimeat MCP server, as one session's tool surface, carrying that person's own agent token. */
|
|
83
|
+
export declare function aimeatMcpServer(baseUrl: string, agentToken: string): AcpMcpServer;
|
|
84
|
+
//# sourceMappingURL=goose-acp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goose-acp.d.ts","sourceRoot":"","sources":["../../../src/services/goose-acp.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,+FAA+F;AAC/F,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,uFAAuF;AACvF,MAAM,MAAM,aAAa,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAgBzC,qBAAa,cAAc;IASH,OAAO,CAAC,QAAQ,CAAC,KAAK;IAR1C,OAAO,CAAC,MAAM,CAAO;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEnB;IACL,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IA4BP;;;;;;OAMG;WACU,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAoBjE,uEAAuE;IACvE,OAAO,CAAC,MAAM;IAgBd,wFAAwF;IACxF,OAAO,CAAC,QAAQ;IAyBhB;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,IAAI;IAaZ,mGAAmG;IAC7F,UAAU,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,YAAY,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBrF,yDAAyD;IAClD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC;IA4B7E,8CAA8C;IACxC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,6FAA6F;IAC7F,KAAK,IAAI,IAAI;CAchB;AA2BD,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAOjF"}
|