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,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: AIMEAT Protocol Node — index
|
|
3
|
+
version: v2
|
|
4
|
+
downloadedFrom: {{BASE_URL}}/llms.txt
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# AIMEAT Protocol Node
|
|
8
|
+
|
|
9
|
+
> This page is the index. The full builder's manual is at {{BASE_URL}}/llms-full.txt, and that is
|
|
10
|
+
> the document to fetch when you are helping someone build an app or calling this API directly.
|
|
11
|
+
> An AIMEAT node holds persistent memory, identity for humans and their AI agents (GHII/GAII),
|
|
12
|
+
> shared workspaces, skills, tasks and a usage meter, reachable over REST and MCP. The person who
|
|
13
|
+
> owns an account here owns what is stored under it and grants or revokes each agent's reach, one
|
|
14
|
+
> scope at a time.
|
|
15
|
+
|
|
16
|
+
- Node URL: {{BASE_URL}}
|
|
17
|
+
- Node ID: {{NODE_ID}}
|
|
18
|
+
- Protocol: AIMEAT v1
|
|
19
|
+
|
|
20
|
+
## Start here
|
|
21
|
+
|
|
22
|
+
- [You are a person]({{BASE_URL}}/v1/portal): register in the portal, then connect an assistant
|
|
23
|
+
- [You are an assistant helping someone build]({{BASE_URL}}/llms-full.txt): the manual, with SDK libraries, app templates and worked examples
|
|
24
|
+
- [You are an agent joining under your own identity]({{BASE_URL}}/auth.md): RFC 8628 device flow, the owner approves you and picks your scopes
|
|
25
|
+
- [You are a coding agent meeting AIMEAT as a dependency]({{BASE_URL}}/AGENTS.md): short orientation, installation and configuration
|
|
26
|
+
|
|
27
|
+
## Documentation
|
|
28
|
+
|
|
29
|
+
- [Full builder's manual]({{BASE_URL}}/llms-full.txt): everything below in one document — SDK libraries, app templates, core concepts, connection flows and the complete endpoint reference
|
|
30
|
+
- [Site map]({{BASE_URL}}/sitemap.md): every page and endpoint on this node, one page
|
|
31
|
+
- [Glossary]({{BASE_URL}}/v1/glossary): GHII, GAII, GEAI, morsels, organisms and the rest, defined
|
|
32
|
+
- [OpenAPI contract]({{BASE_URL}}/v1/spec): the canonical API contract this node is held to
|
|
33
|
+
- [API documentation]({{BASE_URL}}/v1/docs): browsable endpoint reference
|
|
34
|
+
- [Agent registration]({{BASE_URL}}/auth.md): RFC 8628 device flow, owner-approved
|
|
35
|
+
- [App building prompt]({{BASE_URL}}/v1/prompts/build-app): the canonical single-file app spec
|
|
36
|
+
- [App templates]({{BASE_URL}}/v1/app-templates): starter skeletons
|
|
37
|
+
- [App-build pitfalls]({{BASE_URL}}/v1/appdev/pitfalls): what breaks app builds, curated
|
|
38
|
+
|
|
39
|
+
## Discovery
|
|
40
|
+
|
|
41
|
+
- [Node descriptor]({{BASE_URL}}/.well-known/aimeat): id, type, public key, capabilities
|
|
42
|
+
- [MCP Server Card]({{BASE_URL}}/.well-known/mcp.json): the MCP server, its transport and auth
|
|
43
|
+
- [Machine-readable bootstrap]({{BASE_URL}}/?format=json): what this node is and what to call next
|
|
44
|
+
- [API catalog]({{BASE_URL}}/.well-known/api-catalog): RFC 9727 linkset
|
|
45
|
+
- [Agent Skills index]({{BASE_URL}}/.well-known/agent-skills/index.json): skill packs published here
|
|
46
|
+
- [Crawl policy]({{BASE_URL}}/robots.txt): the content signals this node sets
|
|
47
|
+
|
|
48
|
+
## Human pages
|
|
49
|
+
|
|
50
|
+
{{HUMAN_PAGES}}
|
|
51
|
+
|
|
52
|
+
## Optional
|
|
53
|
+
|
|
54
|
+
Secondary reading. Skip these when you need a shorter context.
|
|
55
|
+
|
|
56
|
+
{{OPTIONAL_PAGES}}
|
|
57
|
+
- [AI transparency]({{BASE_URL}}/v1/ai-transparency): what this node marks as AI-generated, how, and in which posture. Content generated here carries an `aimeat.provenance/v1` record on every surface; ask {{BASE_URL}}/v1/provenance/by-hash/<sha256> about bytes you hold, no account needed
|
|
58
|
+
- [UCP profile]({{BASE_URL}}/.well-known/ucp): commerce transports, checkout capability, payment handlers
|
|
59
|
+
- [ACP profile]({{BASE_URL}}/.well-known/acp.json): agentic-commerce discovery and the product feed
|
|
60
|
+
- [Web Bot Auth directory]({{BASE_URL}}/.well-known/http-message-signatures-directory): the keys this node signs outbound requests with
|
|
@@ -23,52 +23,93 @@ User-agent: *
|
|
|
23
23
|
Content-Signal: search=yes, ai-input=yes, ai-train=no
|
|
24
24
|
Allow: /
|
|
25
25
|
|
|
26
|
-
# ──
|
|
27
|
-
#
|
|
26
|
+
# ── Search and retrieval ────────────────────────────────────────────────────
|
|
27
|
+
# These are the bots that decide whether an AI assistant can answer a live question about this
|
|
28
|
+
# node correctly. Every one of them is allowed, on every node, and that is not operator-tunable:
|
|
29
|
+
# a node nobody can look up is a node nobody can join.
|
|
30
|
+
#
|
|
31
|
+
# Two kinds are mixed here on purpose, because blocking them has different costs. A SEARCH bot
|
|
32
|
+
# feeds the index an assistant queries; blocking it removes this node from that assistant's
|
|
33
|
+
# answers. A USER bot fetches one page because a human asked for it, and the vendors document
|
|
34
|
+
# that those may ignore robots.txt precisely because a person asked.
|
|
35
|
+
|
|
36
|
+
# OpenAI — OAI-SearchBot powers ChatGPT search results; blocking it removes this node from them.
|
|
28
37
|
User-agent: OAI-SearchBot
|
|
29
38
|
Allow: /
|
|
30
39
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
Disallow: /
|
|
40
|
+
User-agent: ChatGPT-User
|
|
41
|
+
Allow: /
|
|
34
42
|
|
|
35
|
-
|
|
36
|
-
|
|
43
|
+
User-agent: OAI-AdsBot
|
|
44
|
+
Allow: /
|
|
45
|
+
|
|
46
|
+
# Anthropic — rules apply per subdomain, which is why app origins serve their own robots.txt.
|
|
37
47
|
User-agent: Claude-SearchBot
|
|
38
48
|
Allow: /
|
|
39
49
|
|
|
40
|
-
# Claude-User: user-initiated fetches (cowork, claude.ai browsing)
|
|
41
50
|
User-agent: Claude-User
|
|
42
51
|
Allow: /
|
|
43
52
|
|
|
44
|
-
#
|
|
45
|
-
User-agent: ClaudeBot
|
|
46
|
-
Disallow: /
|
|
47
|
-
|
|
48
|
-
# ── Perplexity ───────────────────────────────────────────────────────────────
|
|
49
|
-
# PerplexityBot: search indexing (respects robots.txt)
|
|
53
|
+
# Perplexity
|
|
50
54
|
User-agent: PerplexityBot
|
|
51
55
|
Allow: /
|
|
52
56
|
|
|
53
|
-
# Perplexity-User: user-initiated fetches (typically ignores robots.txt anyway)
|
|
54
57
|
User-agent: Perplexity-User
|
|
55
58
|
Allow: /
|
|
56
59
|
|
|
57
|
-
#
|
|
58
|
-
#
|
|
60
|
+
# Google — Googlebot feeds Search, and therefore AI Overviews and AI Mode, which are retrieval
|
|
61
|
+
# over the Search index. Google-Extended is a separate decision and sits in the training block.
|
|
59
62
|
User-agent: Googlebot
|
|
60
63
|
Allow: /
|
|
61
64
|
|
|
62
|
-
#
|
|
65
|
+
# Microsoft — bingbot feeds both Bing Search and Copilot.
|
|
66
|
+
User-agent: Bingbot
|
|
67
|
+
Allow: /
|
|
68
|
+
|
|
69
|
+
# Apple — Applebot indexes for Siri and Spotlight. Applebot-Extended does not crawl at all; it is
|
|
70
|
+
# the training opt-out token, so it belongs in the block below.
|
|
71
|
+
User-agent: Applebot
|
|
72
|
+
Allow: /
|
|
73
|
+
|
|
74
|
+
# Meta — meta-externalfetcher is the user-requested single-link fetch.
|
|
75
|
+
User-agent: meta-externalfetcher
|
|
76
|
+
Allow: /
|
|
77
|
+
|
|
78
|
+
# xAI / Grok: deliberately absent. No vendor-documented crawler token exists — none appears in
|
|
79
|
+
# x.ai/robots.txt, grok.com/robots.txt or Cloudflare's bot reference — so there is nothing to name
|
|
80
|
+
# here that would not be a guess. The `User-agent: *` rule above covers Grok, and every other
|
|
81
|
+
# undocumented crawler, which is the whole of the available answer.
|
|
82
|
+
|
|
83
|
+
# ── AI training crawlers ────────────────────────────────────────────────────
|
|
84
|
+
# A separate decision from the block above, and an operator's to make: AIMEAT_AI_TRAINING=allow
|
|
85
|
+
# flips every Disallow between the markers to Allow and pairs the Content-Signal line to
|
|
86
|
+
# ai-train=yes. The default is deny, because a personal node holds one person's data and a safe
|
|
87
|
+
# default has to assume that case.
|
|
88
|
+
#
|
|
89
|
+
# The cost of denying, stated plainly so the choice is an informed one: it keeps this node out of
|
|
90
|
+
# what the models know without being pointed at it, and it is a stated preference rather than an
|
|
91
|
+
# enforceable control. It protects a right; it does not protect bytes.
|
|
92
|
+
#AIMEAT-TRAINING-BEGIN
|
|
93
|
+
User-agent: GPTBot
|
|
94
|
+
Disallow: /
|
|
95
|
+
|
|
96
|
+
User-agent: ClaudeBot
|
|
97
|
+
Disallow: /
|
|
98
|
+
|
|
99
|
+
# Google-Extended controls Gemini training and grounding ONLY. Per Google's own documentation it
|
|
100
|
+
# does not affect Google Search, and it does not remove this node from AI Overviews.
|
|
63
101
|
User-agent: Google-Extended
|
|
64
102
|
Disallow: /
|
|
65
103
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
104
|
+
User-agent: Applebot-Extended
|
|
105
|
+
Disallow: /
|
|
106
|
+
|
|
107
|
+
User-agent: meta-externalagent
|
|
108
|
+
Disallow: /
|
|
109
|
+
#AIMEAT-TRAINING-END
|
|
69
110
|
|
|
70
111
|
# ── AI agents: machine-readable docs ────────────────────────────────────────
|
|
71
|
-
#
|
|
112
|
+
# /llms.txt is the curated index; /llms-full.txt is the full builder's manual.
|
|
72
113
|
# API entry point for AI agents: GET /?format=json
|
|
73
114
|
|
|
74
|
-
Sitemap:
|
|
115
|
+
Sitemap: {{BASE_URL}}/sitemap.xml
|
package/dist/public/spa.html
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
|
-
<!-- AI: To help this user build apps on AIMEAT, fetch
|
|
4
|
+
<!-- AI: /llms.txt is the index of this node. To help this user build apps on AIMEAT, fetch
|
|
5
|
+
/llms-full.txt for templates and API docs, then ask what they want to build. -->
|
|
5
6
|
<meta charset="UTF-8">
|
|
6
7
|
<!-- interactive-widget=resizes-content: the on-screen keyboard resizes the layout viewport so dvh units
|
|
7
8
|
+ sticky/bottom-pinned composers stay above the keyboard. viewport-fit=cover exposes env(safe-area-*)
|
|
@@ -67,6 +68,7 @@
|
|
|
67
68
|
checks whether a site points at its own llms.txt finds the pointer. -->
|
|
68
69
|
<link rel="alternate" type="text/plain" href="/llms.txt" title="LLM-friendly description">
|
|
69
70
|
<link rel="alternate" type="text/plain" href="/llms-full.txt" title="Full content for LLMs">
|
|
71
|
+
<link rel="describedby" type="text/plain" href="/llms.txt">
|
|
70
72
|
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
71
73
|
<link rel="manifest" href="/manifest.json">
|
|
72
74
|
<!-- WebMCP bridge (TARGET-034 phase C): registers node-level tools (commerce feed, node info)
|
|
@@ -116,6 +118,7 @@
|
|
|
116
118
|
<link rel="stylesheet" href="/css/views/portfolio.css">
|
|
117
119
|
<link rel="stylesheet" href="/css/views/members.css">
|
|
118
120
|
<link rel="stylesheet" href="/css/views/inbox.css">
|
|
121
|
+
<link rel="stylesheet" href="/css/views/chat.css">
|
|
119
122
|
<link rel="stylesheet" href="/css/views/glossary.css">
|
|
120
123
|
<link rel="stylesheet" href="/css/components/tags.css">
|
|
121
124
|
<link rel="stylesheet" href="/css/components/image-deliverable.css">
|
|
@@ -158,6 +161,7 @@
|
|
|
158
161
|
"/js/use-session.js": "/js/use-session.js",
|
|
159
162
|
"/js/services/boards.js": "/js/services/boards.js",
|
|
160
163
|
"/js/services/catalogue.js": "/js/services/catalogue.js",
|
|
164
|
+
"/js/services/chat.js": "/js/services/chat.js",
|
|
161
165
|
"/js/services/consent.js": "/js/services/consent.js",
|
|
162
166
|
"/js/services/cortex.js": "/js/services/cortex.js",
|
|
163
167
|
"/js/services/extensions.js": "/js/services/extensions.js",
|
|
@@ -430,6 +434,7 @@
|
|
|
430
434
|
'/v1/glossary': () => import('/views/glossary.js' + B),
|
|
431
435
|
'/v1/business': () => import('/views/business.js' + B),
|
|
432
436
|
'/v1/transparency': () => import('/views/transparency.js' + B),
|
|
437
|
+
'/v1/chat': () => import('/views/chat.js' + B),
|
|
433
438
|
'/v1/profile': () => import('/views/profile.js' + B),
|
|
434
439
|
'/v1/home': () => import('/views/home/index.js' + B),
|
|
435
440
|
'/v1/app-grant': () => import('/views/app-grant.js' + B),
|
|
@@ -810,6 +815,8 @@
|
|
|
810
815
|
only existed because the bar was carrying the marketing links at the same
|
|
811
816
|
time. Those links are anon-only now, so these three fit on the row. -->
|
|
812
817
|
${session && html`
|
|
818
|
+
<a href="/v1/chat" class="${currentPath === '/v1/chat' ? 'active' : ''}"
|
|
819
|
+
onClick=${(e) => { handleNav(e, '/v1/chat'); setMenuOpen(false); }}>${t('nav.chat') || 'Chat'}</a>
|
|
813
820
|
<a href="/app-catalog.html" target="_blank" onClick=${() => setMenuOpen(false)}
|
|
814
821
|
class="${currentPath === '/app-catalog.html' ? 'active' : ''}">${t('nav.apps') || 'Apps'}</a>
|
|
815
822
|
<a href="/v1/profile" class="profile-link visible ${currentPath === '/v1/profile' ? 'active' : ''}"
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file public/views/chat/parts.js
|
|
3
|
+
* @description What the chat page is made of: the conversation list, one turn, the work log, and
|
|
4
|
+
* the box a person types into.
|
|
5
|
+
*
|
|
6
|
+
* Two registers share one column. The conversation is what was said; the work log is what was
|
|
7
|
+
* actually done, one line per tool call, and it is shown by default rather than folded away. A
|
|
8
|
+
* chat that reports "done" without showing the calls asks to be believed; this one can be checked.
|
|
9
|
+
* @structure
|
|
10
|
+
* - ThreadList — the person's conversations
|
|
11
|
+
* - Turn — one thing said, with the tools that ran while it was said
|
|
12
|
+
* - WorkLine — one tool call, its status, and what it was
|
|
13
|
+
* - Composer — the box, Enter to send, Shift+Enter for a newline, and a recorder beside it
|
|
14
|
+
* - StatusBar — which agent, what is left to spend, and what is wrong when something is
|
|
15
|
+
* @usage import { ThreadList, Turn, Composer, StatusBar } from './chat/parts.js';
|
|
16
|
+
* @version-history
|
|
17
|
+
* v1.1.0 — 2026-08-16 — Speech both ways: a recording becomes text in the box, which the person
|
|
18
|
+
* reads before sending, and an agent turn can be read aloud.
|
|
19
|
+
* v1.0.0 — 2026-08-16 — Initial.
|
|
20
|
+
*/
|
|
21
|
+
import { h } from 'preact';
|
|
22
|
+
import { useRef, useEffect, useState } from 'preact/hooks';
|
|
23
|
+
import htm from 'htm';
|
|
24
|
+
import { t } from '/js/i18n.js';
|
|
25
|
+
import { Markdown } from '/components/Markdown.js';
|
|
26
|
+
import { VoiceRecorder } from '/components/VoiceRecorder.js';
|
|
27
|
+
import { speak, stop as stopSpeaking, isSpeechSupported, textToParagraphs } from '/js/services/speech-reader.js';
|
|
28
|
+
|
|
29
|
+
const html = htm.bind(h);
|
|
30
|
+
const tr = (key, fallback) => { const v = t(key); return v && v !== key ? v : fallback; };
|
|
31
|
+
|
|
32
|
+
/** hh:mm in the reader's own locale, which is all a turn needs. */
|
|
33
|
+
function timeShort(iso) {
|
|
34
|
+
if (!iso) return '';
|
|
35
|
+
const d = new Date(iso);
|
|
36
|
+
return Number.isNaN(d.getTime()) ? '' : d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* One tool call, as a line in the work log.
|
|
41
|
+
*
|
|
42
|
+
* The status is a word rather than a colour alone: a person who cannot see the difference between
|
|
43
|
+
* two greens still has to be able to tell a call that finished from one that failed.
|
|
44
|
+
*/
|
|
45
|
+
export function WorkLine({ tool }) {
|
|
46
|
+
const status = String(tool.status || 'pending');
|
|
47
|
+
const label = tr(`chat.work.${status}`, status);
|
|
48
|
+
return html`
|
|
49
|
+
<li class="chat-work-line chat-work-line--${status}">
|
|
50
|
+
<span class="chat-work-status">${label}</span>
|
|
51
|
+
<span class="chat-work-title">${tool.title || tr('chat.work.untitled', 'a tool call')}</span>
|
|
52
|
+
</li>
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The work log for one turn: every tool call it made, in the order it made them. */
|
|
57
|
+
export function WorkLog({ tools }) {
|
|
58
|
+
if (!tools || tools.length === 0) return null;
|
|
59
|
+
return html`
|
|
60
|
+
<div class="chat-work">
|
|
61
|
+
<div class="chat-work-head">${tr('chat.work.title', 'What was done')}</div>
|
|
62
|
+
<ul class="chat-work-list">
|
|
63
|
+
${tools.map((tool, i) => html`<${WorkLine} key=${i} tool=${tool} />`)}
|
|
64
|
+
</ul>
|
|
65
|
+
</div>
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* One turn.
|
|
71
|
+
*
|
|
72
|
+
* The agent's words go through the markdown renderer because the agent writes markdown; the
|
|
73
|
+
* person's do not, because what they typed is what they meant.
|
|
74
|
+
*/
|
|
75
|
+
export function Turn({ turn, id }) {
|
|
76
|
+
const mine = turn.role === 'user';
|
|
77
|
+
const [reading, setReading] = useState(false);
|
|
78
|
+
// A turn that failed before the agent said anything leaves an empty record, and an empty bubble
|
|
79
|
+
// on screen reads as a message that arrived blank. Nothing was said, so nothing is drawn; the
|
|
80
|
+
// error above it is what happened.
|
|
81
|
+
if (!mine && !turn.text && !(turn.tools && turn.tools.length)) return null;
|
|
82
|
+
|
|
83
|
+
const listen = () => {
|
|
84
|
+
if (reading) { stopSpeaking(); setReading(false); return; }
|
|
85
|
+
setReading(speak(id, textToParagraphs(turn.text || '')));
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return html`
|
|
89
|
+
<div class="chat-turn chat-turn--${mine ? 'user' : 'agent'}">
|
|
90
|
+
<div class="chat-bubble">
|
|
91
|
+
${mine
|
|
92
|
+
? html`<p class="chat-said">${turn.text}</p>`
|
|
93
|
+
: html`<${Markdown} text=${turn.text || ''} />`}
|
|
94
|
+
<${WorkLog} tools=${turn.tools} />
|
|
95
|
+
</div>
|
|
96
|
+
<div class="chat-meta">
|
|
97
|
+
<span>${timeShort(turn.at)}</span>
|
|
98
|
+
${turn.model ? html`<span class="chat-model" title=${tr('chat.modelTitle', 'The model that answered this turn')}>${turn.model}</span>` : ''}
|
|
99
|
+
${!mine && turn.text && isSpeechSupported() ? html`
|
|
100
|
+
<button type="button" class="btn-ghost chat-listen" onClick=${listen}>
|
|
101
|
+
${reading ? tr('chat.stopListening', 'Stop') : tr('chat.listen', 'Listen')}
|
|
102
|
+
</button>` : ''}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* What the agent is doing right now, before the turn is over.
|
|
110
|
+
*
|
|
111
|
+
* A person watching a spinner for four minutes cannot tell work from a hang, so the live turn shows
|
|
112
|
+
* the words as they are written and each tool call as it starts.
|
|
113
|
+
*/
|
|
114
|
+
export function LiveTurn({ text, thought, tools, busy }) {
|
|
115
|
+
if (!busy && !text && (!tools || tools.length === 0)) return null;
|
|
116
|
+
return html`
|
|
117
|
+
<div class="chat-turn chat-turn--agent chat-turn--live">
|
|
118
|
+
<div class="chat-bubble">
|
|
119
|
+
${text ? html`<${Markdown} text=${text} />` : ''}
|
|
120
|
+
${!text && thought ? html`<p class="chat-thinking">${thought}</p>` : ''}
|
|
121
|
+
${!text && !thought && busy ? html`<p class="chat-thinking">${tr('chat.working', 'Working…')}</p>` : ''}
|
|
122
|
+
<${WorkLog} tools=${tools} />
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** A turn that could not run, with the reason and a way to try again. */
|
|
129
|
+
export function TurnError({ message, onRetry }) {
|
|
130
|
+
if (!message) return null;
|
|
131
|
+
return html`
|
|
132
|
+
<div class="chat-error" role="alert">
|
|
133
|
+
<p class="chat-error-msg">${message}</p>
|
|
134
|
+
${onRetry && html`
|
|
135
|
+
<button type="button" class="btn-outline chat-error-retry" onClick=${onRetry}>
|
|
136
|
+
${tr('chat.retry', 'Try again')}
|
|
137
|
+
</button>`}
|
|
138
|
+
</div>
|
|
139
|
+
`;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* The person's conversations.
|
|
144
|
+
*
|
|
145
|
+
* `onClose` is the way back on a phone, where this list covers the conversation and the header that
|
|
146
|
+
* would otherwise carry the control is hidden. Without it, opening the list is a room with no door:
|
|
147
|
+
* the only exit is picking a different conversation than the one you were reading.
|
|
148
|
+
*/
|
|
149
|
+
export function ThreadList({ threads, activeId, onOpen, onNew, onDelete, onClose }) {
|
|
150
|
+
return html`
|
|
151
|
+
<aside class="chat-threads">
|
|
152
|
+
<button type="button" class="btn-ghost chat-threads-close" onClick=${onClose}>
|
|
153
|
+
↩ ${tr('chat.backToChat', 'Back to the conversation')}
|
|
154
|
+
</button>
|
|
155
|
+
<button type="button" class="btn-primary chat-new" onClick=${onNew}>
|
|
156
|
+
${tr('chat.new', 'New conversation')}
|
|
157
|
+
</button>
|
|
158
|
+
${threads.length === 0
|
|
159
|
+
? html`<p class="chat-threads-empty">${tr('chat.noThreads', 'Nothing here yet. Say something and this is where it will be.')}</p>`
|
|
160
|
+
: html`
|
|
161
|
+
<ul class="chat-thread-list">
|
|
162
|
+
${threads.map((thread) => html`
|
|
163
|
+
<li key=${thread.id} class="chat-thread ${thread.id === activeId ? 'chat-thread--active' : ''}">
|
|
164
|
+
<button type="button" class="chat-thread-open" onClick=${() => onOpen(thread.id)}>
|
|
165
|
+
<span class="chat-thread-title">${thread.title}</span>
|
|
166
|
+
<span class="chat-thread-sub">${tr('chat.turnCount', '{n} messages').replace('{n}', String(thread.turns ?? 0))}</span>
|
|
167
|
+
</button>
|
|
168
|
+
<button type="button" class="btn-ghost chat-thread-del"
|
|
169
|
+
aria-label=${tr('chat.delete', 'Delete conversation')}
|
|
170
|
+
onClick=${() => onDelete(thread.id)}>✗</button>
|
|
171
|
+
</li>
|
|
172
|
+
`)}
|
|
173
|
+
</ul>`}
|
|
174
|
+
</aside>
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The box.
|
|
180
|
+
*
|
|
181
|
+
* Enter sends and Shift+Enter opens a line, which is what every chat does and therefore what a
|
|
182
|
+
* person's hands already expect. The field grows with what is in it up to a ceiling, so a long ask
|
|
183
|
+
* is readable while being written without the composer eating the conversation.
|
|
184
|
+
*/
|
|
185
|
+
export function Composer({ value, onInput, onSend, onStop, onSpeak, busy, disabled, note, listening, voiceMaxSeconds = 300 }) {
|
|
186
|
+
const ref = useRef(null);
|
|
187
|
+
|
|
188
|
+
// Re-measured on a resize as well as on every keystroke. Height depends on WIDTH: a line that
|
|
189
|
+
// fits on a desktop wraps on a phone, and a height measured before the turn left the field
|
|
190
|
+
// scrolling by two pixels behind a scrollbar nobody wanted.
|
|
191
|
+
useEffect(() => {
|
|
192
|
+
const fit = () => {
|
|
193
|
+
const el = ref.current;
|
|
194
|
+
if (!el) return;
|
|
195
|
+
el.style.height = 'auto';
|
|
196
|
+
el.style.height = `${Math.min(el.scrollHeight, 200)}px`;
|
|
197
|
+
};
|
|
198
|
+
fit();
|
|
199
|
+
window.addEventListener('resize', fit);
|
|
200
|
+
return () => window.removeEventListener('resize', fit);
|
|
201
|
+
}, [value]);
|
|
202
|
+
|
|
203
|
+
const keydown = (e) => {
|
|
204
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
205
|
+
e.preventDefault();
|
|
206
|
+
if (!busy && !disabled && value.trim()) onSend();
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
return html`
|
|
211
|
+
<div class="chat-composer">
|
|
212
|
+
${note ? html`<p class="chat-composer-note">${note}</p>` : ''}
|
|
213
|
+
${listening ? html`<p class="chat-composer-note">${tr('chat.hearing', 'Working out what you said…')}</p>` : ''}
|
|
214
|
+
<div class="chat-composer-row">
|
|
215
|
+
<textarea ref=${ref} class="chat-input" rows="1"
|
|
216
|
+
value=${value}
|
|
217
|
+
disabled=${disabled}
|
|
218
|
+
placeholder=${disabled
|
|
219
|
+
? tr('chat.disabledPlaceholder', 'This node has no chat agent yet.')
|
|
220
|
+
: tr('chat.placeholder', 'Ask for something, or describe what you want built.')}
|
|
221
|
+
onInput=${(e) => onInput(e.target.value)}
|
|
222
|
+
onKeyDown=${keydown}></textarea>
|
|
223
|
+
${onSpeak && !busy ? html`
|
|
224
|
+
<${VoiceRecorder} maxSeconds=${voiceMaxSeconds} disabled=${disabled || listening}
|
|
225
|
+
className="btn-outline chat-voice" onRecorded=${(file) => onSpeak(file)} />` : ''}
|
|
226
|
+
${busy
|
|
227
|
+
? html`<button type="button" class="btn-outline chat-send" onClick=${onStop}>${tr('chat.stop', 'Stop')}</button>`
|
|
228
|
+
: html`<button type="button" class="btn-primary chat-send"
|
|
229
|
+
disabled=${disabled || !value.trim()}
|
|
230
|
+
onClick=${onSend}>${tr('chat.send', 'Send')}</button>`}
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
`;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Who is answering, and what it costs.
|
|
238
|
+
*
|
|
239
|
+
* The allowance is shown because a person about to fall back to a free model deserves to have seen
|
|
240
|
+
* it coming. It is a line of text, not a gauge: this is not the thing they came here to look at.
|
|
241
|
+
*/
|
|
242
|
+
export function StatusBar({ status, onReset }) {
|
|
243
|
+
if (!status) return null;
|
|
244
|
+
const remaining = Number(status.allowance_remaining_usd ?? 0);
|
|
245
|
+
return html`
|
|
246
|
+
<div class="chat-status">
|
|
247
|
+
<span class="chat-status-agent">${status.agent_name}</span>
|
|
248
|
+
${status.has_own_key
|
|
249
|
+
? html`<span class="chat-status-key">${tr('chat.ownKey', 'Running on your own OpenRouter key.')}</span>`
|
|
250
|
+
: html`<span class="chat-status-key">${tr('chat.allowance', '{n} USD left of your allowance.').replace('{n}', remaining.toFixed(2))}</span>`}
|
|
251
|
+
${onReset && html`
|
|
252
|
+
<button type="button" class="btn-ghost chat-status-reset"
|
|
253
|
+
title=${tr('chat.resetTitle', 'Start a fresh agent session for this conversation. Needed after changing what the agent may do.')}
|
|
254
|
+
onClick=${onReset}>${tr('chat.reset', 'Reset session')}</button>`}
|
|
255
|
+
</div>
|
|
256
|
+
`;
|
|
257
|
+
}
|