aimeat 3.2.0 → 3.3.1
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/README.md +1 -1
- 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 +50 -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.d.ts +1 -1
- package/dist/scripts/check-ai-disclosure.d.ts.map +1 -1
- package/dist/scripts/check-ai-disclosure.js +30 -3
- 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/ai-gate.d.ts +25 -0
- package/dist/src/auth/ai-gate.d.ts.map +1 -0
- package/dist/src/auth/ai-gate.js +21 -0
- package/dist/src/auth/ai-gate.js.map +1 -0
- 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-agent.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-agent.js +38 -9
- package/dist/src/cli/connect/tool-call-defs-agent.js.map +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-apps.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-apps.js +114 -25
- package/dist/src/cli/connect/tool-call-defs-apps.js.map +1 -1
- 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 +179 -26
- package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-organism.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-organism.js +20 -3
- package/dist/src/cli/connect/tool-call-defs-organism.js.map +1 -1
- package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call.js +52 -1
- 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 +1808 -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 +55 -16
- 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/llm-proxy.d.ts +34 -0
- package/dist/src/routes/llm-proxy.d.ts.map +1 -0
- package/dist/src/routes/llm-proxy.js +258 -0
- package/dist/src/routes/llm-proxy.js.map +1 -0
- 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 +22 -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 +102 -0
- package/dist/src/services/ai-completion.d.ts.map +1 -1
- package/dist/src/services/ai-completion.js +131 -67
- 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 +43 -1
- package/dist/src/services/openrouter.d.ts.map +1 -1
- package/dist/src/services/openrouter.js +98 -1
- 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/methods/wallet.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/wallet.js +23 -4
- package/dist/src/storage/providers/postgres-kysely/methods/wallet.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/methods/work.d.ts +5 -0
- package/dist/src/storage/providers/sqlite/methods/work.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/work.js +34 -22
- package/dist/src/storage/providers/sqlite/methods/work.js.map +1 -1
- 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
|
@@ -6,6 +6,12 @@ const FIRST_PASS_DELAY_MS = 30_000; // let the server settle (and be reachable a
|
|
|
6
6
|
let running = false;
|
|
7
7
|
let disabled = false;
|
|
8
8
|
let timer = null;
|
|
9
|
+
/**
|
|
10
|
+
* Owner GHII -> the moments they asked for an on-demand capture, newest last. In-process on purpose:
|
|
11
|
+
* this is throttling, not accounting, and a node restart handing out a fresh allowance costs a few
|
|
12
|
+
* seconds of rendering rather than money.
|
|
13
|
+
*/
|
|
14
|
+
const onDemandHistory = new Map();
|
|
9
15
|
/**
|
|
10
16
|
* Launch a headless browser WITHOUT a Playwright browser download: prefer the machine's installed
|
|
11
17
|
* Edge/Chrome via `channel`, then a Playwright-installed Chromium. Returns null (and the caller
|
|
@@ -43,6 +49,75 @@ async function launchBrowser() {
|
|
|
43
49
|
+ '`npx playwright install --with-deps chromium`. Last error: ' + (lastErr?.message ?? 'unknown'));
|
|
44
50
|
return null;
|
|
45
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Render one app and store its thumbnail. The bytes come from storage and are served to the page by
|
|
54
|
+
* intercepting the main document, rather than navigating to the public URL: that URL 301-redirects
|
|
55
|
+
* to the app origin under H-2, which 404s on a node with no separate app host and would capture an
|
|
56
|
+
* error page. Sub-resources still load against the node and the page URL stays the node URL, so
|
|
57
|
+
* relative paths and API calls resolve.
|
|
58
|
+
*
|
|
59
|
+
* Throws on failure; each caller words its own answer.
|
|
60
|
+
*/
|
|
61
|
+
async function renderAndStore(ctx, config, storage, app) {
|
|
62
|
+
const base = config.baseUrl.replace(/\/+$/, '');
|
|
63
|
+
const page = await ctx.newPage();
|
|
64
|
+
try {
|
|
65
|
+
const full = await storage.getAppByOwnerName(app.ownerName, app.filename);
|
|
66
|
+
// storage returns `data` as a Uint8Array; a plain Uint8Array's .toString('utf8') comma-joins the
|
|
67
|
+
// byte values instead of decoding — wrap in Buffer.
|
|
68
|
+
const html = full?.data ? Buffer.from(full.data).toString('utf8') : null;
|
|
69
|
+
const url = `${base}/v1/apps/${encodeURIComponent(app.ownerName)}/${encodeURIComponent(app.filename)}?mode=inline`;
|
|
70
|
+
if (html) {
|
|
71
|
+
let fulfilled = false;
|
|
72
|
+
await page.route('**/*', (route) => {
|
|
73
|
+
if (!fulfilled && route.request().resourceType() === 'document') {
|
|
74
|
+
fulfilled = true;
|
|
75
|
+
route.fulfill({ status: 200, contentType: 'text/html', body: html });
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
route.continue();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// 'load' rather than networkidle: polling and SSE apps never go idle. The settle wait after it is
|
|
83
|
+
// what stops an app that fetches its data post-load from being captured blank.
|
|
84
|
+
await page.goto(url, { waitUntil: 'load', timeout: PAGE_TIMEOUT });
|
|
85
|
+
await page.waitForTimeout(Math.max(0, config.screenshotSettleMs));
|
|
86
|
+
const jpeg = await page.screenshot({ type: 'jpeg', quality: 80 });
|
|
87
|
+
await storage.createStorageFile({
|
|
88
|
+
key: `apps/screenshots/${app.filename}`,
|
|
89
|
+
ownerGaii: app.ownerGaii, // match the app row's bucket so the GET route finds it
|
|
90
|
+
visibility: 'public',
|
|
91
|
+
mimeType: 'image/jpeg',
|
|
92
|
+
size: jpeg.length,
|
|
93
|
+
data: jpeg,
|
|
94
|
+
createdAt: new Date().toISOString(),
|
|
95
|
+
});
|
|
96
|
+
return jpeg.length;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
await page.close();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Launch, hand over a context, and always close. */
|
|
103
|
+
async function withBrowser(fn) {
|
|
104
|
+
const browser = await launchBrowser();
|
|
105
|
+
if (!browser) {
|
|
106
|
+
disabled = true;
|
|
107
|
+
if (timer) {
|
|
108
|
+
clearInterval(timer);
|
|
109
|
+
timer = null;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const ctx = await browser.newContext({ viewport: VIEWPORT, deviceScaleFactor: 1 });
|
|
115
|
+
return await fn(ctx);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
await browser.close();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
46
121
|
/**
|
|
47
122
|
* One scan: capture + store a thumbnail for every published app that still has none. Returns the
|
|
48
123
|
* number captured. Exported so a manual trigger / test can run a single pass on demand.
|
|
@@ -62,74 +137,20 @@ export async function runScreenshotCapturePass(config, storage) {
|
|
|
62
137
|
}
|
|
63
138
|
if (missing.length === 0)
|
|
64
139
|
return 0;
|
|
65
|
-
|
|
66
|
-
if (!browser) {
|
|
67
|
-
disabled = true;
|
|
68
|
-
if (timer) {
|
|
69
|
-
clearInterval(timer);
|
|
70
|
-
timer = null;
|
|
71
|
-
}
|
|
72
|
-
return 0;
|
|
73
|
-
}
|
|
74
|
-
try {
|
|
75
|
-
const ctx = await browser.newContext({ viewport: VIEWPORT, deviceScaleFactor: 1 });
|
|
76
|
-
const base = config.baseUrl.replace(/\/+$/, '');
|
|
140
|
+
await withBrowser(async (ctx) => {
|
|
77
141
|
for (const app of missing) {
|
|
78
|
-
const page = await ctx.newPage();
|
|
79
142
|
try {
|
|
80
|
-
|
|
81
|
-
// to the public inline URL: that URL 301-redirects to the app origin under H-2, which 404s
|
|
82
|
-
// on a node with no separate app host (e.g. local dev) and would capture an error page.
|
|
83
|
-
// Sub-resources (libs, images, API) still load against the node and the page URL stays the
|
|
84
|
-
// node URL so relative paths resolve. Opened anonymously; 'load' (not networkidle) since
|
|
85
|
-
// polling/SSE apps never go idle.
|
|
86
|
-
const full = await storage.getAppByOwnerName(app.ownerName, app.filename);
|
|
87
|
-
// storage returns `data` as a Uint8Array (Prisma 6 Bytes); a plain Uint8Array's
|
|
88
|
-
// .toString('utf8') comma-joins the byte values instead of decoding — wrap in Buffer.
|
|
89
|
-
const html = full?.data ? Buffer.from(full.data).toString('utf8') : null;
|
|
90
|
-
const url = `${base}/v1/apps/${encodeURIComponent(app.ownerName)}/${encodeURIComponent(app.filename)}?mode=inline`;
|
|
91
|
-
if (html) {
|
|
92
|
-
let fulfilled = false;
|
|
93
|
-
await page.route('**/*', (route) => {
|
|
94
|
-
if (!fulfilled && route.request().resourceType() === 'document') {
|
|
95
|
-
fulfilled = true;
|
|
96
|
-
route.fulfill({ status: 200, contentType: 'text/html', body: html });
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
route.continue();
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
await page.goto(url, { waitUntil: 'load', timeout: PAGE_TIMEOUT });
|
|
104
|
-
// Settle wait: many apps fetch data / render after 'load', so capturing immediately yields a
|
|
105
|
-
// blank page. Default 6s; tune with AIMEAT_SCREENSHOT_SETTLE_MS.
|
|
106
|
-
await page.waitForTimeout(Math.max(0, config.screenshotSettleMs));
|
|
107
|
-
const jpeg = await page.screenshot({ type: 'jpeg', quality: 80 });
|
|
108
|
-
await storage.createStorageFile({
|
|
109
|
-
key: `apps/screenshots/${app.filename}`,
|
|
110
|
-
ownerGaii: app.ownerGaii, // match the app row's bucket so the GET route finds it
|
|
111
|
-
visibility: 'public',
|
|
112
|
-
mimeType: 'image/jpeg',
|
|
113
|
-
size: jpeg.length,
|
|
114
|
-
data: jpeg,
|
|
115
|
-
createdAt: new Date().toISOString(),
|
|
116
|
-
});
|
|
143
|
+
await renderAndStore(ctx, config, storage, app);
|
|
117
144
|
captured++;
|
|
118
145
|
}
|
|
119
146
|
catch (e) {
|
|
120
147
|
logger.warn(`Screenshot auto-capture failed for ${app.ownerName}/${app.filename}: ${e.message}`);
|
|
121
148
|
}
|
|
122
|
-
finally {
|
|
123
|
-
await page.close();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
if (captured > 0) {
|
|
127
|
-
logger.info(`Screenshot auto-capture: ${captured}/${missing.length} app thumbnail(s) generated.`);
|
|
128
|
-
emitChange('apps');
|
|
129
149
|
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
150
|
+
});
|
|
151
|
+
if (captured > 0) {
|
|
152
|
+
logger.info(`Screenshot auto-capture: ${captured}/${missing.length} app thumbnail(s) generated.`);
|
|
153
|
+
emitChange('apps');
|
|
133
154
|
}
|
|
134
155
|
}
|
|
135
156
|
catch (e) {
|
|
@@ -140,6 +161,67 @@ export async function runScreenshotCapturePass(config, storage) {
|
|
|
140
161
|
}
|
|
141
162
|
return captured;
|
|
142
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Capture ONE app now, for a caller who asked.
|
|
166
|
+
*
|
|
167
|
+
* Separate from the batch on purpose. The batch may skip, retry next interval and answer with a
|
|
168
|
+
* count; someone who just published an app and wants to look at it needs either a picture or a
|
|
169
|
+
* reason. The batch's `running` flag is deliberately NOT consulted here: a scan in progress is no
|
|
170
|
+
* reason to refuse a person, and the two writing the same key is an upsert either way.
|
|
171
|
+
*
|
|
172
|
+
* Rendering is the most expensive thing this node does per request, so it is throttled per owner.
|
|
173
|
+
*/
|
|
174
|
+
export async function captureAppScreenshot(config, storage, app) {
|
|
175
|
+
if (disabled) {
|
|
176
|
+
return {
|
|
177
|
+
ok: false, status: 503, code: 'NO_BROWSER',
|
|
178
|
+
message: 'This node has no usable browser, so it cannot render app screenshots. An operator can '
|
|
179
|
+
+ 'install one with `npx playwright install --with-deps chromium`.',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// The lookup lives here rather than at each door: it decides both "is there anything to render"
|
|
183
|
+
// and WHICH storage bucket the thumbnail belongs in, and a door that answered the first half for
|
|
184
|
+
// itself would be the second implementation of the same decision.
|
|
185
|
+
const live = await storage.getAppByOwnerName(app.ownerName, app.filename);
|
|
186
|
+
if (!live) {
|
|
187
|
+
return {
|
|
188
|
+
ok: false, status: 404, code: 'NOT_FOUND',
|
|
189
|
+
message: `No published app "${app.filename}" to render. Publish it first; a draft has no public `
|
|
190
|
+
+ 'page to photograph.',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const ownerGaii = live.ownerGaii;
|
|
194
|
+
const perHour = Math.max(1, config.screenshotOnDemandPerHour);
|
|
195
|
+
const now = Date.now();
|
|
196
|
+
const recent = (onDemandHistory.get(ownerGaii) ?? []).filter((t) => now - t < 3_600_000);
|
|
197
|
+
if (recent.length >= perHour) {
|
|
198
|
+
const waitMin = Math.ceil((3_600_000 - (now - recent[0])) / 60_000);
|
|
199
|
+
return {
|
|
200
|
+
ok: false, status: 429, code: 'RATE_LIMITED',
|
|
201
|
+
message: `Screenshot limit reached (${perHour} per hour). Try again in about ${waitMin} minute(s).`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
recent.push(now);
|
|
205
|
+
onDemandHistory.set(ownerGaii, recent);
|
|
206
|
+
try {
|
|
207
|
+
const bytes = await withBrowser((ctx) => renderAndStore(ctx, config, storage, { ownerName: app.ownerName, ownerGaii, filename: app.filename }));
|
|
208
|
+
if (bytes === null) {
|
|
209
|
+
return {
|
|
210
|
+
ok: false, status: 503, code: 'NO_BROWSER',
|
|
211
|
+
message: 'This node has no usable browser, so it cannot render app screenshots.',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
emitChange('apps');
|
|
215
|
+
logger.info(`Screenshot captured on demand: ${app.ownerName}/${app.filename} (${bytes} bytes)`);
|
|
216
|
+
return { ok: true, sizeBytes: bytes };
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
return {
|
|
220
|
+
ok: false, status: 502, code: 'RENDER_FAILED',
|
|
221
|
+
message: `The page did not render: ${e.message}`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
143
225
|
/** Start the interval-driven auto-capture job (no-op unless config.screenshotAutoCapture is on). */
|
|
144
226
|
export function startScreenshotAutoCapture(config, storage) {
|
|
145
227
|
if (!config.screenshotAutoCapture)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot-capture.js","sourceRoot":"","sources":["../../../src/services/screenshot-capture.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screenshot-capture.js","sourceRoot":"","sources":["../../../src/services/screenshot-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -359,7 +359,7 @@ When the owner sends one of these slash-prefixed messages, treat it as a command
|
|
|
359
359
|
When the owner assigns shared tags in the Data Access tab, use those tags as same-owner collaboration areas. Write shared project state, handoff notes, queues, and team context under \`agents.tag.<tag>.*\` with \`visibility: "owner"\` and \`tags: ["<tag>"]\`. Read the area with \`GET /v1/memory?owner_scope=true&prefix=agents.tag.<tag>.&tags=<tag>\` or the equivalent \`aimeat_memory_list\` parameters. Do not put private local secrets in shared tag memory.
|
|
360
360
|
|
|
361
361
|
### Publish Knowledge Artifacts
|
|
362
|
-
If onboarding or later work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of writing an arbitrary \`research.*\` memory placeholder. Follow \`/llms.txt\` and use \`POST /v1/knowledge/import\` for a new package, \`aimeat_knowledge_contribute\` for entries in an existing package, and \`aimeat_storage_upload\` for large source files or attachments.
|
|
362
|
+
If onboarding or later work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of writing an arbitrary \`research.*\` memory placeholder. Follow \`/llms-full.txt\` and use \`POST /v1/knowledge/import\` for a new package, \`aimeat_knowledge_contribute\` for entries in an existing package, and \`aimeat_storage_upload\` for large source files or attachments.
|
|
363
363
|
|
|
364
364
|
After import, report the package ID, manifest key, visibility, and whether it is catalog-listed so the owner can link it from Data Access if desired.
|
|
365
365
|
|
|
@@ -200,7 +200,7 @@ POST ${ctx.nodeUrl}/v1/memory
|
|
|
200
200
|
If the owner assigns shared tags in the Data Access tab, those tags are collaboration labels for same-owner agents. Use \`agents.tag.<tag>.*\` keys for shared project state, handoff notes, queues, and team context. Write shared entries with \`visibility: "owner"\` and \`tags: ["<tag>"]\`, then list the area with \`owner_scope=true\`, \`prefix=agents.tag.<tag>.\`, and the same tag filter. Do not store private agent-local secrets in shared tag memory.
|
|
201
201
|
|
|
202
202
|
### Publish Knowledge Artifacts
|
|
203
|
-
If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
|
|
203
|
+
If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms-full.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
|
|
204
204
|
|
|
205
205
|
## References
|
|
206
206
|
- references/api-overview.md -- Endpoints, auth, response format
|
|
@@ -150,7 +150,7 @@ POST ${ctx.nodeUrl}/v1/memory
|
|
|
150
150
|
If the owner assigns shared tags in the Data Access tab, those tags are collaboration labels for same-owner agents. Use \`agents.tag.<tag>.*\` keys for shared project state, handoff notes, queues, and team context. Write shared entries with \`visibility: "owner"\` and \`tags: ["<tag>"]\`, then list the area with \`owner_scope=true\`, \`prefix=agents.tag.<tag>.\`, and the same tag filter. Do not store private agent-local secrets in shared tag memory.
|
|
151
151
|
|
|
152
152
|
### Publish Knowledge Artifacts
|
|
153
|
-
If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
|
|
153
|
+
If setup or work produced structured research, documentation, datasets, or reusable knowledge, create a real knowledge package instead of a placeholder memory key. Follow \`/llms-full.txt\`: use \`POST /v1/knowledge/import\` for new packages, \`aimeat_knowledge_contribute\` for entries in existing packages, and \`aimeat_storage_upload\` for large source files or attachments. Report the package ID and manifest key to the owner.
|
|
154
154
|
|
|
155
155
|
## References
|
|
156
156
|
See references/ directory for detailed API documentation:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file src/services/storage-file-write.ts
|
|
3
|
-
* @description Storing one binary file, once, for every surface that can
|
|
3
|
+
* @description Storing and removing one binary file, once, for every surface that can do either.
|
|
4
4
|
*
|
|
5
5
|
* WHY THIS FILE EXISTS. `POST /v1/storage` and `aimeat_storage_upload` are the same capability, and
|
|
6
6
|
* the two copies had drifted in the way that costs money and access rather than tidiness:
|
|
@@ -28,12 +28,19 @@
|
|
|
28
28
|
* - StorageWriteDeps / StorageFileInput / StorageFileWriteResult — the contract
|
|
29
29
|
* - writeStorageFile() — the inline write, in order, with the fence first
|
|
30
30
|
* - mintStorageUploadUrl() — the presigned representation of the same write
|
|
31
|
+
* - removeStorageFile() — the delete, sharing the same key fence and change events
|
|
31
32
|
* @usage
|
|
32
33
|
* const out = await writeStorageFile({ storage, config, emitResourceUpdated }, gaii, input);
|
|
33
34
|
* if (!out.ok) return renderRefusal(out); // each door renders its own way
|
|
34
35
|
* @version-history
|
|
35
36
|
* v1.0.0 — 2026-08-11 — Initial (August 2026 audit step 8, unit storage-files). Collapses
|
|
36
37
|
* POST /v1/storage and aimeat_storage_upload onto one write.
|
|
38
|
+
* v1.1.0 — 2026-08-15 — removeStorageFile(): the delete, which had one door (DELETE /v1/storage)
|
|
39
|
+
* and no tool, so an agent could store a file over MCP and never take it back. Written here
|
|
40
|
+
* rather than in the new tool because the anonymous key fence was already a hand-copied second
|
|
41
|
+
* copy on that route, and because the route emitted only `files` while the upload emits `files`
|
|
42
|
+
* and `memory` — a delete moves the byte budget the memory view renders exactly as an upload
|
|
43
|
+
* does, and the two views disagreed about it.
|
|
37
44
|
*/
|
|
38
45
|
import type { AimeatConfig } from '../config.js';
|
|
39
46
|
import type { Storage, StorageFileRecord } from '../storage/interface.js';
|
|
@@ -78,6 +85,34 @@ export type StorageFileWriteResult = {
|
|
|
78
85
|
} | StorageWriteRefusal;
|
|
79
86
|
/** Store one file under `ownerGaii`, with every gate and side effect the capability carries. */
|
|
80
87
|
export declare function writeStorageFile(deps: StorageWriteDeps, ownerGaii: string, input: StorageFileInput): Promise<StorageFileWriteResult>;
|
|
88
|
+
export interface StorageDeleteRefusal {
|
|
89
|
+
ok: false;
|
|
90
|
+
status: number;
|
|
91
|
+
code: 'INVALID_INPUT' | 'FORBIDDEN' | 'NOT_FOUND' | 'ACCESS_DENIED';
|
|
92
|
+
message: string;
|
|
93
|
+
}
|
|
94
|
+
export type StorageFileDeleteResult = {
|
|
95
|
+
ok: true;
|
|
96
|
+
key: string;
|
|
97
|
+
size: number;
|
|
98
|
+
mimeType: string;
|
|
99
|
+
visibility: StorageFileRecord['visibility'];
|
|
100
|
+
} | StorageDeleteRefusal;
|
|
101
|
+
/**
|
|
102
|
+
* Remove one file from `ownerGaii`'s namespace. Irreversible: there is no version history behind a
|
|
103
|
+
* stored file the way there is behind a memory record, so what this deletes is gone.
|
|
104
|
+
*
|
|
105
|
+
* THE ORDER IS THE POINT. Fence, then read, then compare, then delete — a refusal must happen before
|
|
106
|
+
* anything is removed, which is the same rule the write follows for the quota. It also lets the
|
|
107
|
+
* caller be told WHAT it deleted (size, type), because those are read before the row goes.
|
|
108
|
+
*
|
|
109
|
+
* WHY NO CROSS-OWNER FORM. Reading has one, and it is the reason aimeat_storage_download takes a
|
|
110
|
+
* reference: a file is keyed by (owner, key) and an agent legitimately reads its owner's uploads.
|
|
111
|
+
* Deleting does not get the same door. `getStorageFile(ownerGaii, key)` is namespaced to the caller,
|
|
112
|
+
* so a file belonging to anyone else is simply absent here, and the ownership comparison below is a
|
|
113
|
+
* second lock on a door that is already shut rather than the lock that shuts it.
|
|
114
|
+
*/
|
|
115
|
+
export declare function removeStorageFile(deps: StorageWriteDeps, ownerGaii: string, key: string): Promise<StorageFileDeleteResult>;
|
|
81
116
|
export interface StorageUploadUrlInput {
|
|
82
117
|
key: string;
|
|
83
118
|
mimeType?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-file-write.d.ts","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"storage-file-write.d.ts","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,9 @@ import { isAnonymousGaii } from '../routes/memory/shared.js';
|
|
|
6
6
|
* the token is signed with are the same value, so they cannot drift apart. */
|
|
7
7
|
export const STORAGE_UPLOAD_URL_TTL_SECONDS = 3600;
|
|
8
8
|
/**
|
|
9
|
-
* May this principal
|
|
10
|
-
* point: the fence is on the
|
|
9
|
+
* May this principal touch this key at all. Every representation of the upload runs it, and so does
|
|
10
|
+
* the delete, which is the point: the fence is on the act, not on the shape the caller happens to
|
|
11
|
+
* ask for. The DELETE route carried its own copy of this until v1.1.0.
|
|
11
12
|
*/
|
|
12
13
|
function checkKey(ownerGaii, key) {
|
|
13
14
|
if (!key) {
|
|
@@ -16,7 +17,7 @@ function checkKey(ownerGaii, key) {
|
|
|
16
17
|
if (isAnonymousGaii(ownerGaii) && !key.startsWith('anonymous/')) {
|
|
17
18
|
return {
|
|
18
19
|
ok: false, status: 403, code: 'FORBIDDEN',
|
|
19
|
-
message: 'Anonymous agents can only
|
|
20
|
+
message: 'Anonymous agents can only use keys prefixed with "anonymous/"',
|
|
20
21
|
};
|
|
21
22
|
}
|
|
22
23
|
return null;
|
|
@@ -74,6 +75,51 @@ export async function writeStorageFile(deps, ownerGaii, input) {
|
|
|
74
75
|
emitChange('memory');
|
|
75
76
|
return { ok: true, file, overageMorsels: quota.overageMorsels };
|
|
76
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove one file from `ownerGaii`'s namespace. Irreversible: there is no version history behind a
|
|
80
|
+
* stored file the way there is behind a memory record, so what this deletes is gone.
|
|
81
|
+
*
|
|
82
|
+
* THE ORDER IS THE POINT. Fence, then read, then compare, then delete — a refusal must happen before
|
|
83
|
+
* anything is removed, which is the same rule the write follows for the quota. It also lets the
|
|
84
|
+
* caller be told WHAT it deleted (size, type), because those are read before the row goes.
|
|
85
|
+
*
|
|
86
|
+
* WHY NO CROSS-OWNER FORM. Reading has one, and it is the reason aimeat_storage_download takes a
|
|
87
|
+
* reference: a file is keyed by (owner, key) and an agent legitimately reads its owner's uploads.
|
|
88
|
+
* Deleting does not get the same door. `getStorageFile(ownerGaii, key)` is namespaced to the caller,
|
|
89
|
+
* so a file belonging to anyone else is simply absent here, and the ownership comparison below is a
|
|
90
|
+
* second lock on a door that is already shut rather than the lock that shuts it.
|
|
91
|
+
*/
|
|
92
|
+
export async function removeStorageFile(deps, ownerGaii, key) {
|
|
93
|
+
const { storage } = deps;
|
|
94
|
+
const fenced = checkKey(ownerGaii, key);
|
|
95
|
+
if (fenced)
|
|
96
|
+
return fenced;
|
|
97
|
+
const existing = await storage.getStorageFile(ownerGaii, key);
|
|
98
|
+
if (!existing) {
|
|
99
|
+
return {
|
|
100
|
+
ok: false, status: 404, code: 'NOT_FOUND',
|
|
101
|
+
message: `File not found in your namespace: ${key}. This deletes only your own files — a file someone else owns is not reachable here, whatever you may be allowed to read.`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (existing.ownerGaii !== ownerGaii) {
|
|
105
|
+
return { ok: false, status: 403, code: 'ACCESS_DENIED', message: 'You can only delete your own files' };
|
|
106
|
+
}
|
|
107
|
+
const deleted = await storage.deleteStorageFile(ownerGaii, key);
|
|
108
|
+
if (!deleted) {
|
|
109
|
+
// The row was there a moment ago and is not now. Another door removed it in between, which
|
|
110
|
+
// is the caller's desired end state, but saying "deleted" would claim work we did not do.
|
|
111
|
+
return { ok: false, status: 404, code: 'NOT_FOUND', message: `File not found: ${key}` };
|
|
112
|
+
}
|
|
113
|
+
deps.emitResourceUpdated?.(ownerGaii, `aimeat://storage/${encodeURIComponent(key)}`);
|
|
114
|
+
deps.emitResourceListChanged?.(ownerGaii);
|
|
115
|
+
// Both views, for the same reason the write emits both: the file leaves the files list AND frees
|
|
116
|
+
// bytes in the budget the memory view renders. The route emitted only 'files'.
|
|
117
|
+
emitChange('files');
|
|
118
|
+
emitChange('memory');
|
|
119
|
+
return {
|
|
120
|
+
ok: true, key, size: existing.size, mimeType: existing.mimeType, visibility: existing.visibility,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
77
123
|
/**
|
|
78
124
|
* Mint a presigned URL for the same write. The options the caller states here ride in the SIGNED
|
|
79
125
|
* token (PRESIGNED_META_KEYS.storage) and are applied by PUT /v1/upload/:token, so what was asked
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-file-write.js","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage-file-write.js","sourceRoot":"","sources":["../../../src/services/storage-file-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/task-outcome.ts
|
|
3
|
+
* @description What a finished task actually produced, in one place, for every door that reports a
|
|
4
|
+
* task.
|
|
5
|
+
*
|
|
6
|
+
* THE HOLE THIS CLOSES, and it was found by a crew rather than by us. A task-runner completed a
|
|
7
|
+
* real job in 104 seconds, the task went to `done`, and the answer could not be read back from
|
|
8
|
+
* anywhere: `aimeat_task_get` returns fifteen fields and not one of them is the output. The
|
|
9
|
+
* completion MESSAGE — the agent's own sentence about what it did — is written to the 'completed'
|
|
10
|
+
* event and nowhere else, and `deliverableKey` is on the record but was never returned. So the
|
|
11
|
+
* caller saw `status: "done"` and had to already know that a second, differently-shaped endpoint
|
|
12
|
+
* exists before it could find out what happened. A finished task whose result nobody can reach is
|
|
13
|
+
* indistinguishable from one that produced nothing.
|
|
14
|
+
*
|
|
15
|
+
* WHY NOT A NEW COLUMN. The two facts already exist: the sentence is on the terminal event, the
|
|
16
|
+
* pointer is on the record. A `completionMessage` column would be a third copy of something
|
|
17
|
+
* stored twice, on both providers, with a migration — to fix a READ. The read is what was broken.
|
|
18
|
+
*
|
|
19
|
+
* The deliverable is returned as an ADDRESS, not as content. It is a memory key under the agent's
|
|
20
|
+
* own namespace and may be any size; a task read that inlined it would make every listing as
|
|
21
|
+
* expensive as its largest output.
|
|
22
|
+
* @structure taskOutcome() — the terminal event plus the deliverable pointer, or null while running
|
|
23
|
+
* @usage
|
|
24
|
+
* import { taskOutcome } from '../services/task-outcome.js';
|
|
25
|
+
* const outcome = await taskOutcome(storage, task); // null unless done/failed
|
|
26
|
+
* @version-history
|
|
27
|
+
* v1.0.0 — 2026-08-16 — Initial. Reported by crewaimeat-dev against aimeat-crewai 0.20.0: a
|
|
28
|
+
* completed task-runner leaves its output where the caller cannot read it.
|
|
29
|
+
*/
|
|
30
|
+
import type { Storage, AgentTaskRecord } from '../storage/interface.js';
|
|
31
|
+
/** What a finished task produced. Null while it is still running — an unfinished task has no
|
|
32
|
+
* outcome, and reporting an empty one would read as "finished with nothing". */
|
|
33
|
+
export interface TaskOutcome {
|
|
34
|
+
/** 'done' or 'failed' — the same word the terminal event carries. */
|
|
35
|
+
state: 'done' | 'failed';
|
|
36
|
+
/** The agent's own sentence about what it did, from the terminal event. */
|
|
37
|
+
message: string;
|
|
38
|
+
at: string;
|
|
39
|
+
/** Memory key under the AGENT's namespace where the deliverable was published, when one was
|
|
40
|
+
* named. The pointer, never the content: an output may be megabytes. */
|
|
41
|
+
deliverable_key?: string;
|
|
42
|
+
/** A ready-to-follow address for that key, so a caller does not have to assemble one. */
|
|
43
|
+
deliverable_url?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The outcome of a task, or null if it has not finished.
|
|
47
|
+
*
|
|
48
|
+
* Reads the events newest-first and takes the first terminal one, so a task that was completed,
|
|
49
|
+
* reopened and completed again reports the LATEST completion rather than the first — which is what
|
|
50
|
+
* "what happened" means to whoever is asking.
|
|
51
|
+
*/
|
|
52
|
+
export declare function taskOutcome(storage: Storage, task: AgentTaskRecord): Promise<TaskOutcome | null>;
|
|
53
|
+
//# sourceMappingURL=task-outcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-outcome.d.ts","sourceRoot":"","sources":["../../../src/services/task-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAExE;iFACiF;AACjF,MAAM,WAAW,WAAW;IACxB,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX;6EACyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmBtG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const TERMINAL = new Set(['completed', 'failed']);
|
|
2
|
+
/**
|
|
3
|
+
* The outcome of a task, or null if it has not finished.
|
|
4
|
+
*
|
|
5
|
+
* Reads the events newest-first and takes the first terminal one, so a task that was completed,
|
|
6
|
+
* reopened and completed again reports the LATEST completion rather than the first — which is what
|
|
7
|
+
* "what happened" means to whoever is asking.
|
|
8
|
+
*/
|
|
9
|
+
export async function taskOutcome(storage, task) {
|
|
10
|
+
if (task.status !== 'done' && task.status !== 'failed')
|
|
11
|
+
return null;
|
|
12
|
+
const { events } = await storage.listTaskEvents(task.id, { page: 1, perPage: 50 });
|
|
13
|
+
// listTaskEvents orders oldest-first; the terminal one is at the end.
|
|
14
|
+
const terminal = [...events].reverse().find(e => TERMINAL.has(e.type));
|
|
15
|
+
return {
|
|
16
|
+
state: task.status,
|
|
17
|
+
// A task can reach a terminal state without a terminal event — an owner-side cancel, an
|
|
18
|
+
// older record from before the event existed. Saying so beats an empty string that reads
|
|
19
|
+
// like an agent who had nothing to report.
|
|
20
|
+
message: terminal?.message ?? '(no completion message was recorded)',
|
|
21
|
+
at: terminal?.timestamp ?? task.completedAt ?? task.updatedAt,
|
|
22
|
+
...(task.deliverableKey ? {
|
|
23
|
+
deliverable_key: task.deliverableKey,
|
|
24
|
+
deliverable_url: `/v1/memory/${encodeURIComponent(task.agentGaii)}/${encodeURIComponent(task.deliverableKey)}`,
|
|
25
|
+
} : {}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=task-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-outcome.js","sourceRoot":"","sources":["../../../src/services/task-outcome.ts"],"names":[],"mappings":"AA8CA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB,EAAE,IAAqB;IACrE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEpE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACnF,sEAAsE;IACtE,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,OAAO;QACH,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,wFAAwF;QACxF,yFAAyF;QACzF,2CAA2C;QAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,sCAAsC;QACpE,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS;QAC7D,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACtB,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,eAAe,EAAE,cAAc,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;SACjH,CAAC,CAAC,CAAC,EAAE,CAAC;KACV,CAAC;AACN,CAAC"}
|
|
@@ -6,6 +6,13 @@
|
|
|
6
6
|
* Extracted from engine.ts to satisfy max-file-lines.
|
|
7
7
|
* @usage import { validateHumanAnswer, applyHumanAnswer } from './engine-human.js';
|
|
8
8
|
* @version-history
|
|
9
|
+
* v1.2.0 — 2026-08-15 — The upgrade requires a PERSON, which the paragraph guarding it always
|
|
10
|
+
* said and the code never asked. An agent could call aimeat_workflow_answer on the step holding
|
|
11
|
+
* its own draft and the node stamped that content 'editorial-control' with the note "reviewed
|
|
12
|
+
* by <the agent>", turning the public disclosure label from "no human editorial review" into
|
|
13
|
+
* the reviewed wording with nobody having read the bytes. `byIsHuman` is set by the door that
|
|
14
|
+
* knows the principal class and absent everywhere else, so agents keep answering and stop
|
|
15
|
+
* upgrading. E2E test-quality audit finding A18.
|
|
9
16
|
* v1.1.0 — 2026-08-01 — TARGET-058 Phase 4: a human-input step that names `reviews_key` re-stamps
|
|
10
17
|
* the reviewed content with humanInvolvement 'editorial-control'. This is the ONLY place in
|
|
11
18
|
* the engine that may upgrade that field, and a watchdog timeout default never does — nobody
|
|
@@ -20,6 +27,14 @@ export interface HumanAnswerValue {
|
|
|
20
27
|
pick: string;
|
|
21
28
|
other?: string;
|
|
22
29
|
by: string;
|
|
30
|
+
/**
|
|
31
|
+
* Was the answerer a PERSON? Absent means no, deliberately: the upgrade below is the one thing in
|
|
32
|
+
* the engine that can turn "no human editorial review" into "reviewed by a person", so a caller
|
|
33
|
+
* has to say so on purpose. `by` alone cannot answer it — an agent's GAII and a human's GHII are
|
|
34
|
+
* both just strings here, and inferring humanness from their shape would break the moment a new
|
|
35
|
+
* principal class arrives.
|
|
36
|
+
*/
|
|
37
|
+
byIsHuman?: boolean;
|
|
23
38
|
}
|
|
24
39
|
/**
|
|
25
40
|
* Validate an incoming answer against the question PINNED at ask time (not the current def — a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-human.d.ts","sourceRoot":"","sources":["../../../../src/services/workflow/engine-human.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"engine-human.d.ts","sourceRoot":"","sources":["../../../../src/services/workflow/engine-human.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE3F,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,qBAAqB,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAOxH;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GACjH,OAAO,CAAC,IAAI,CAAC,CAiEf"}
|