aimeat 2.4.0 → 2.6.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 +33 -0
- package/dist/build-stamp.json +13 -0
- package/dist/locales/en.json +186 -20
- package/dist/locales/fi.json +186 -20
- package/dist/public/components/VoiceRecorder.js +116 -0
- package/dist/public/connection-done.html +53 -0
- package/dist/public/css/components/voice-recorder.css +66 -0
- package/dist/public/css/views/inbox.css +41 -0
- package/dist/public/css/views/profile.css +171 -95
- package/dist/public/css/views/transparency.css +5 -0
- package/dist/public/js/services/audio-recorder.js +171 -0
- package/dist/public/js/services/messages.js +21 -2
- package/dist/public/spa.html +3 -0
- package/dist/public/views/landing.js +4 -0
- package/dist/public/views/profile/access-tab/connections.js +264 -0
- package/dist/public/views/profile/access-tab.js +2 -0
- package/dist/public/views/profile/ai-transparency-card.js +22 -17
- package/dist/public/views/profile/inbox-tab/components.js +60 -10
- package/dist/public/views/profile/inbox-tab/helpers.js +33 -0
- package/dist/public/views/profile/inbox-tab/panels.js +6 -1
- package/dist/public/views/profile/inbox-tab/use-voice.js +50 -0
- package/dist/public/views/profile/inbox-tab/voice-parts.js +111 -0
- package/dist/public/views/profile/inbox-tab.js +18 -24
- package/dist/public/views/profile/openrouter/budget-panel.js +224 -0
- package/dist/public/views/profile/openrouter/model-picker.js +150 -0
- package/dist/public/views/profile/openrouter/pricing.js +139 -0
- package/dist/public/views/profile/openrouter-settings.js +425 -488
- package/dist/public/views/transparency.js +50 -0
- 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.map +1 -1
- package/dist/scripts/check-ai-disclosure.js +182 -0
- package/dist/scripts/check-ai-disclosure.js.map +1 -1
- package/dist/src/cli/connect/ai-provenance-carry.d.ts +247 -0
- package/dist/src/cli/connect/ai-provenance-carry.d.ts.map +1 -0
- package/dist/src/cli/connect/ai-provenance-carry.js +334 -0
- package/dist/src/cli/connect/ai-provenance-carry.js.map +1 -0
- package/dist/src/cli/connect/api-client.d.ts +11 -0
- package/dist/src/cli/connect/api-client.d.ts.map +1 -1
- package/dist/src/cli/connect/api-client.js +2 -0
- package/dist/src/cli/connect/api-client.js.map +1 -1
- package/dist/src/cli/connect/mcp/local-server.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/local-server.js +11 -0
- package/dist/src/cli/connect/mcp/local-server.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-messages.d.ts +2 -0
- package/dist/src/cli/connect/mcp/tools/agent-messages.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-messages.js +5 -2
- package/dist/src/cli/connect/mcp/tools/agent-messages.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +2 -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 +5 -2
- package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/apps.d.ts +3 -0
- package/dist/src/cli/connect/mcp/tools/apps.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/apps.js +13 -5
- package/dist/src/cli/connect/mcp/tools/apps.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/boards.d.ts +3 -0
- package/dist/src/cli/connect/mcp/tools/boards.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/boards.js +5 -2
- package/dist/src/cli/connect/mcp/tools/boards.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.d.ts +5 -0
- package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.js +25 -5
- package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts +2 -0
- package/dist/src/cli/connect/mcp/tools/dm-messages.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/dm-messages.js +11 -6
- package/dist/src/cli/connect/mcp/tools/dm-messages.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/exchange.d.ts +2 -0
- package/dist/src/cli/connect/mcp/tools/exchange.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/exchange.js +8 -2
- package/dist/src/cli/connect/mcp/tools/exchange.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/knowledge.d.ts +3 -0
- package/dist/src/cli/connect/mcp/tools/knowledge.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/knowledge.js +7 -3
- package/dist/src/cli/connect/mcp/tools/knowledge.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts +2 -0
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.js +7 -2
- package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/workspaces.d.ts +3 -0
- package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/workspaces.js +8 -2
- package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-core.d.ts +3 -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 +7 -0
- package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
- package/dist/src/cli/connect/tool-call.d.ts +3 -0
- package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call.js +11 -1
- package/dist/src/cli/connect/tool-call.js.map +1 -1
- package/dist/src/config-types.d.ts +14 -0
- package/dist/src/config-types.d.ts.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +10 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/data/public-pages.d.ts +12 -0
- package/dist/src/data/public-pages.d.ts.map +1 -1
- package/dist/src/data/public-pages.js +12 -0
- package/dist/src/data/public-pages.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +969 -85
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/mcp/ai-provenance-input.d.ts +45 -2
- package/dist/src/mcp/ai-provenance-input.d.ts.map +1 -1
- package/dist/src/mcp/ai-provenance-input.js +48 -2
- package/dist/src/mcp/ai-provenance-input.js.map +1 -1
- package/dist/src/mcp/apps.d.ts +7 -0
- package/dist/src/mcp/apps.d.ts.map +1 -1
- package/dist/src/mcp/apps.js +20 -2
- package/dist/src/mcp/apps.js.map +1 -1
- package/dist/src/models/ai-provenance-schemas.d.ts +7 -1
- package/dist/src/models/ai-provenance-schemas.d.ts.map +1 -1
- package/dist/src/models/ai-provenance-schemas.js +11 -1
- package/dist/src/models/ai-provenance-schemas.js.map +1 -1
- package/dist/src/models/connection-schemas.d.ts +203 -0
- package/dist/src/models/connection-schemas.d.ts.map +1 -0
- package/dist/src/models/connection-schemas.js +33 -0
- package/dist/src/models/connection-schemas.js.map +1 -0
- package/dist/src/models/message-schemas.d.ts +40 -0
- package/dist/src/models/message-schemas.d.ts.map +1 -1
- package/dist/src/models/message-schemas.js +23 -0
- package/dist/src/models/message-schemas.js.map +1 -1
- package/dist/src/routes/ai-provenance.d.ts +6 -0
- package/dist/src/routes/ai-provenance.d.ts.map +1 -1
- package/dist/src/routes/ai-provenance.js +34 -1
- package/dist/src/routes/ai-provenance.js.map +1 -1
- package/dist/src/routes/ai-transparency.d.ts +6 -1
- package/dist/src/routes/ai-transparency.d.ts.map +1 -1
- package/dist/src/routes/ai-transparency.js +17 -3
- package/dist/src/routes/ai-transparency.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 +83 -0
- 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 +4 -0
- package/dist/src/routes/app-grants.js.map +1 -1
- package/dist/src/routes/apps/drafts.d.ts +3 -0
- package/dist/src/routes/apps/drafts.d.ts.map +1 -1
- package/dist/src/routes/apps/drafts.js +13 -0
- package/dist/src/routes/apps/drafts.js.map +1 -1
- package/dist/src/routes/apps/publish.d.ts +5 -0
- package/dist/src/routes/apps/publish.d.ts.map +1 -1
- package/dist/src/routes/apps/publish.js +21 -5
- package/dist/src/routes/apps/publish.js.map +1 -1
- package/dist/src/routes/connections.d.ts +35 -0
- package/dist/src/routes/connections.d.ts.map +1 -0
- package/dist/src/routes/connections.js +406 -0
- package/dist/src/routes/connections.js.map +1 -0
- package/dist/src/routes/libs.js +1 -1
- package/dist/src/routes/libs.js.map +1 -1
- package/dist/src/routes/messages.d.ts +5 -0
- package/dist/src/routes/messages.d.ts.map +1 -1
- package/dist/src/routes/messages.js +92 -0
- package/dist/src/routes/messages.js.map +1 -1
- package/dist/src/routes/openrouter.d.ts +6 -1
- package/dist/src/routes/openrouter.d.ts.map +1 -1
- package/dist/src/routes/openrouter.js +37 -7
- package/dist/src/routes/openrouter.js.map +1 -1
- package/dist/src/routes/upload.d.ts +5 -0
- package/dist/src/routes/upload.d.ts.map +1 -1
- package/dist/src/routes/upload.js +32 -0
- package/dist/src/routes/upload.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +2 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/services/ai-completion.d.ts +48 -0
- package/dist/src/services/ai-completion.d.ts.map +1 -1
- package/dist/src/services/ai-completion.js +112 -72
- package/dist/src/services/ai-completion.js.map +1 -1
- package/dist/src/services/ai-disclosure.d.ts +6 -0
- package/dist/src/services/ai-disclosure.d.ts.map +1 -1
- package/dist/src/services/ai-disclosure.js +20 -2
- package/dist/src/services/ai-disclosure.js.map +1 -1
- package/dist/src/services/ai-provenance-page.d.ts +59 -0
- package/dist/src/services/ai-provenance-page.d.ts.map +1 -0
- package/dist/src/services/ai-provenance-page.js +185 -0
- package/dist/src/services/ai-provenance-page.js.map +1 -0
- package/dist/src/services/ai-provenance.d.ts +6 -0
- package/dist/src/services/ai-provenance.d.ts.map +1 -1
- package/dist/src/services/ai-provenance.js +5 -0
- package/dist/src/services/ai-provenance.js.map +1 -1
- package/dist/src/services/ai-transcription.d.ts +66 -0
- package/dist/src/services/ai-transcription.d.ts.map +1 -0
- package/dist/src/services/ai-transcription.js +90 -0
- package/dist/src/services/ai-transcription.js.map +1 -0
- package/dist/src/services/app-publish.d.ts.map +1 -1
- package/dist/src/services/app-publish.js +16 -1
- package/dist/src/services/app-publish.js.map +1 -1
- package/dist/src/services/build-app-prompt.d.ts.map +1 -1
- package/dist/src/services/build-app-prompt.js +2 -1
- package/dist/src/services/build-app-prompt.js.map +1 -1
- package/dist/src/services/connections/attach.d.ts +62 -0
- package/dist/src/services/connections/attach.d.ts.map +1 -0
- package/dist/src/services/connections/attach.js +168 -0
- package/dist/src/services/connections/attach.js.map +1 -0
- package/dist/src/services/connections/credential.d.ts +39 -0
- package/dist/src/services/connections/credential.d.ts.map +1 -0
- package/dist/src/services/connections/credential.js +66 -0
- package/dist/src/services/connections/credential.js.map +1 -0
- package/dist/src/services/connections/instance.d.ts +65 -0
- package/dist/src/services/connections/instance.d.ts.map +1 -0
- package/dist/src/services/connections/instance.js +144 -0
- package/dist/src/services/connections/instance.js.map +1 -0
- package/dist/src/services/connections/oauth.d.ts +77 -0
- package/dist/src/services/connections/oauth.d.ts.map +1 -0
- package/dist/src/services/connections/oauth.js +290 -0
- package/dist/src/services/connections/oauth.js.map +1 -0
- package/dist/src/services/connections/providers.d.ts +118 -0
- package/dist/src/services/connections/providers.d.ts.map +1 -0
- package/dist/src/services/connections/providers.js +260 -0
- package/dist/src/services/connections/providers.js.map +1 -0
- package/dist/src/services/connections/publish-gate.d.ts +103 -0
- package/dist/src/services/connections/publish-gate.d.ts.map +1 -0
- package/dist/src/services/connections/publish-gate.js +0 -0
- package/dist/src/services/connections/publish-gate.js.map +1 -0
- package/dist/src/services/connections/publish.d.ts +60 -0
- package/dist/src/services/connections/publish.d.ts.map +1 -0
- package/dist/src/services/connections/publish.js +340 -0
- package/dist/src/services/connections/publish.js.map +1 -0
- package/dist/src/services/connections/refresh.d.ts +55 -0
- package/dist/src/services/connections/refresh.d.ts.map +1 -0
- package/dist/src/services/connections/refresh.js +307 -0
- package/dist/src/services/connections/refresh.js.map +1 -0
- package/dist/src/services/markdown-negotiation.d.ts +17 -0
- package/dist/src/services/markdown-negotiation.d.ts.map +1 -1
- package/dist/src/services/markdown-negotiation.js +15 -0
- package/dist/src/services/markdown-negotiation.js.map +1 -1
- package/dist/src/services/message-send.d.ts.map +1 -1
- package/dist/src/services/message-send.js +16 -2
- package/dist/src/services/message-send.js.map +1 -1
- package/dist/src/services/openrouter.d.ts +67 -1
- package/dist/src/services/openrouter.d.ts.map +1 -1
- package/dist/src/services/openrouter.js +102 -11
- package/dist/src/services/openrouter.js.map +1 -1
- package/dist/src/services/upload-token.d.ts +5 -1
- package/dist/src/services/upload-token.d.ts.map +1 -1
- package/dist/src/services/upload-token.js +13 -1
- package/dist/src/services/upload-token.js.map +1 -1
- package/dist/src/services/workflow/engine-util.d.ts +18 -0
- package/dist/src/services/workflow/engine-util.d.ts.map +1 -1
- package/dist/src/services/workflow/engine-util.js +27 -0
- package/dist/src/services/workflow/engine-util.js.map +1 -1
- package/dist/src/services/workflow/engine.d.ts.map +1 -1
- package/dist/src/services/workflow/engine.js +4 -2
- package/dist/src/services/workflow/engine.js.map +1 -1
- package/dist/src/storage/interface.d.ts +2 -1
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/db-types.d.ts +65 -0
- package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/index.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/index.js +2 -1
- package/dist/src/storage/providers/postgres-kysely/index.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/connections.d.ts +44 -0
- package/dist/src/storage/providers/postgres-kysely/methods/connections.d.ts.map +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/connections.js +308 -0
- package/dist/src/storage/providers/postgres-kysely/methods/connections.js.map +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/node-infra.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/node-infra.js +4 -2
- package/dist/src/storage/providers/postgres-kysely/methods/node-infra.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/migrations/0021_connections.sql +116 -0
- package/dist/src/storage/providers/postgres-kysely/migrations/0022_provider_clients.sql +36 -0
- package/dist/src/storage/providers/postgres-kysely/migrations/0023_nonce_payload.sql +13 -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/community.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/community.js +2 -1
- package/dist/src/storage/providers/sqlite/methods/community.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/connections.d.ts +60 -0
- package/dist/src/storage/providers/sqlite/methods/connections.d.ts.map +1 -0
- package/dist/src/storage/providers/sqlite/methods/connections.js +287 -0
- package/dist/src/storage/providers/sqlite/methods/connections.js.map +1 -0
- package/dist/src/storage/providers/sqlite/schema-tables-1.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-1.js +4 -0
- package/dist/src/storage/providers/sqlite/schema-tables-1.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-3.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-3.js +106 -0
- package/dist/src/storage/providers/sqlite/schema-tables-3.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +2 -0
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/connection.repository.d.ts +124 -0
- package/dist/src/storage/repositories/connection.repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/connection.repository.js +2 -0
- package/dist/src/storage/repositories/connection.repository.js.map +1 -0
- package/dist/src/storage/types/agents-messaging.d.ts +19 -0
- package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
- package/dist/src/storage/types/agents-messaging.js.map +1 -1
- package/dist/src/storage/types/auth.d.ts +8 -1
- package/dist/src/storage/types/auth.d.ts.map +1 -1
- package/dist/src/utils/build-stamp.d.ts +56 -0
- package/dist/src/utils/build-stamp.d.ts.map +1 -0
- package/dist/src/utils/build-stamp.js +142 -0
- package/dist/src/utils/build-stamp.js.map +1 -0
- package/dist/src/utils/messaging.d.ts +14 -0
- package/dist/src/utils/messaging.d.ts.map +1 -1
- package/dist/src/utils/messaging.js +0 -0
- package/dist/src/utils/messaging.js.map +1 -1
- package/dist/static/sdk-libs/connect/index.js +199 -0
- package/dist/static/sdk-libs/connect/notes.js +47 -0
- package/dist/static/sdk-libs/connect/panel.js +238 -0
- package/dist/static/sdk-libs/data/index.js +63 -11
- package/dist/static/sdk-libs/dist/aimeat-connect.js +357 -0
- package/dist/static/sdk-libs/dist/aimeat-data.js +40 -9
- package/package.json +2 -2
|
@@ -96,7 +96,8 @@ export function buildAppPrompt(config, opts = {}) {
|
|
|
96
96
|
body += '```\n';
|
|
97
97
|
body += 'Works only when logged in. After a write, read it back to confirm it persisted.\n';
|
|
98
98
|
body += 'A key is a plain string: `get(key)` / `getPublic(gaii, key)` always return the LATEST value — never append a version, index or `:0`/`:N` suffix to a key, and read back the SAME key you wrote (a store-as-`x` / read-as-`x:0` mismatch just 404s and your UI shows nothing). To page a large list, store it as ONE array under one key (or shard with your OWN explicit id scheme), not a magic version suffix.\n';
|
|
99
|
-
body += 'Shared feeds, journals, comments and discussions are ALL built this way — one public key per entry, `getPublic()` to read others\'. Never reach for Boards (deprecated, removal-bound) or organism workspaces as an app\'s data layer. When a rule must be enforced server-side (only-author-can-delete, one-vote-per-user), that logic goes into an extension — see the extension guide, not into boards/organisms.\n
|
|
99
|
+
body += 'Shared feeds, journals, comments and discussions are ALL built this way — one public key per entry, `getPublic()` to read others\'. Never reach for Boards (deprecated, removal-bound) or organism workspaces as an app\'s data layer. When a rule must be enforced server-side (only-author-can-delete, one-vote-per-user), that logic goes into an extension — see the extension guide, not into boards/organisms.\n';
|
|
100
|
+
body += 'If you RENDER content an agent wrote, read it with `getPublicEntry(gaii, key)` instead: it returns the same entry plus `provenance` — how that content was made, including the model and the `sources` the writer declared. `getPublic()` returns the bare value and cannot carry it. Showing agent-written text with no origin, when the node is holding the record that explains it, is the gap the label is meant to close.\n\n';
|
|
100
101
|
// Reading what the owner's AGENTS produced. This is the single most common "my app shows
|
|
101
102
|
// nothing" cause for fleet-facing apps: agent output is NOT in the owner's namespace, and an
|
|
102
103
|
// app-grant token gets no automatic broadening, so an unscoped list() legitimately returns [].
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file attach.ts
|
|
3
|
+
* @description Connecting an account by SUPPLYING a credential rather than by an authorization
|
|
4
|
+
* round (TARGET-057). The other half of the connect surface, and the one that existed as a
|
|
5
|
+
* provider entry before it existed as a route.
|
|
6
|
+
*
|
|
7
|
+
* THE APP PASSWORD IS KEPT ALONGSIDE THE SESSION, deliberately. A session expires and its refresh
|
|
8
|
+
* token can be rotated away or rejected; the secret the user handed over does not expire, so a
|
|
9
|
+
* dead session can be re-minted without sending them back to a settings page to find something
|
|
10
|
+
* they already gave us. That is the whole practical advantage of a non-expiring credential and
|
|
11
|
+
* throwing it away after the first exchange would waste it.
|
|
12
|
+
*
|
|
13
|
+
* THE SECRET IS NEVER ECHOED. Not in the response, not in an error, not in a log line. The only
|
|
14
|
+
* thing that comes back is the connection, and the connection's projection has no credential in
|
|
15
|
+
* it at any level.
|
|
16
|
+
* @structure attachCredential · mintSession
|
|
17
|
+
* @usage import { attachCredential } from './attach.js';
|
|
18
|
+
* @version-history
|
|
19
|
+
* v1.0.0 — 2026-08-02 — TARGET-057 Phase 6.
|
|
20
|
+
*/
|
|
21
|
+
import type { ConnectContext } from './oauth.js';
|
|
22
|
+
import type { ConnectionCredential, ConnectionMode, ConnectionRecord } from '../../models/connection-schemas.js';
|
|
23
|
+
export type AttachResult = {
|
|
24
|
+
ok: true;
|
|
25
|
+
connection: ConnectionRecord;
|
|
26
|
+
created: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
code: string;
|
|
30
|
+
reason: string;
|
|
31
|
+
};
|
|
32
|
+
/** What a mint produced: the session, plus who it belongs to at the provider. */
|
|
33
|
+
export interface MintedSession {
|
|
34
|
+
credential: ConnectionCredential;
|
|
35
|
+
externalId: string;
|
|
36
|
+
accountLabel: string;
|
|
37
|
+
expiresAt: string | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Exchange a supplied secret for a session.
|
|
41
|
+
*
|
|
42
|
+
* Exported because `refresh.ts` needs it too: re-minting from the stored app password is what a
|
|
43
|
+
* session-shaped connection falls back to when its refresh is rejected, and having two copies of
|
|
44
|
+
* this exchange is how the two paths drift.
|
|
45
|
+
*/
|
|
46
|
+
export declare function mintSession(providerId: string, fields: Record<string, string>, baseUrl: string): Promise<MintedSession | {
|
|
47
|
+
error: string;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Connect an account from a credential the user supplied.
|
|
51
|
+
*
|
|
52
|
+
* Re-attaching an account that is already connected UPDATES that row, exactly as re-authorising
|
|
53
|
+
* does on the OAuth side — which is what makes "my app password stopped working, here is a new one"
|
|
54
|
+
* a repair rather than a way to accumulate duplicates.
|
|
55
|
+
*/
|
|
56
|
+
export declare function attachCredential(ctx: ConnectContext, input: {
|
|
57
|
+
principal: string;
|
|
58
|
+
provider: string;
|
|
59
|
+
mode: ConnectionMode;
|
|
60
|
+
fields: Record<string, string>;
|
|
61
|
+
}): Promise<AttachResult>;
|
|
62
|
+
//# sourceMappingURL=attach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../../../src/services/connections/attach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EACV,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,EACvD,MAAM,oCAAoC,CAAC;AAK5C,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,oBAAoB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAClE,OAAO,CAAC,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA0E5C;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACnG,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file attach.ts
|
|
3
|
+
* @description Connecting an account by SUPPLYING a credential rather than by an authorization
|
|
4
|
+
* round (TARGET-057). The other half of the connect surface, and the one that existed as a
|
|
5
|
+
* provider entry before it existed as a route.
|
|
6
|
+
*
|
|
7
|
+
* THE APP PASSWORD IS KEPT ALONGSIDE THE SESSION, deliberately. A session expires and its refresh
|
|
8
|
+
* token can be rotated away or rejected; the secret the user handed over does not expire, so a
|
|
9
|
+
* dead session can be re-minted without sending them back to a settings page to find something
|
|
10
|
+
* they already gave us. That is the whole practical advantage of a non-expiring credential and
|
|
11
|
+
* throwing it away after the first exchange would waste it.
|
|
12
|
+
*
|
|
13
|
+
* THE SECRET IS NEVER ECHOED. Not in the response, not in an error, not in a log line. The only
|
|
14
|
+
* thing that comes back is the connection, and the connection's projection has no credential in
|
|
15
|
+
* it at any level.
|
|
16
|
+
* @structure attachCredential · mintSession
|
|
17
|
+
* @usage import { attachCredential } from './attach.js';
|
|
18
|
+
* @version-history
|
|
19
|
+
* v1.0.0 — 2026-08-02 — TARGET-057 Phase 6.
|
|
20
|
+
*/
|
|
21
|
+
import { randomUUID } from 'node:crypto';
|
|
22
|
+
import { safeFetch } from '../../utils/url-validator.js';
|
|
23
|
+
import { sealCredential } from './credential.js';
|
|
24
|
+
import { findProvider } from './providers.js';
|
|
25
|
+
/** Bluesky's default Personal Data Server. A user on their own PDS supplies it as a field later. */
|
|
26
|
+
const BLUESKY_PDS = 'https://bsky.social';
|
|
27
|
+
/**
|
|
28
|
+
* Exchange a supplied secret for a session.
|
|
29
|
+
*
|
|
30
|
+
* Exported because `refresh.ts` needs it too: re-minting from the stored app password is what a
|
|
31
|
+
* session-shaped connection falls back to when its refresh is rejected, and having two copies of
|
|
32
|
+
* this exchange is how the two paths drift.
|
|
33
|
+
*/
|
|
34
|
+
export async function mintSession(providerId, fields, baseUrl) {
|
|
35
|
+
const identifier = (fields.identifier ?? '').trim();
|
|
36
|
+
const password = fields.password ?? '';
|
|
37
|
+
if (!identifier || !password)
|
|
38
|
+
return { error: 'both a handle and a secret are required' };
|
|
39
|
+
if (providerId === 'bluesky') {
|
|
40
|
+
try {
|
|
41
|
+
const r = await safeFetch(`${BLUESKY_PDS}/xrpc/com.atproto.server.createSession`, {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: { 'Content-Type': 'application/json' },
|
|
44
|
+
body: JSON.stringify({ identifier, password }),
|
|
45
|
+
signal: AbortSignal.timeout(15_000),
|
|
46
|
+
});
|
|
47
|
+
if (!r.ok) {
|
|
48
|
+
// Deliberately not the provider's raw body: a failed login response can echo the identifier
|
|
49
|
+
// and sometimes the attempt itself. The actionable half is that the pair was refused.
|
|
50
|
+
return { error: r.status === 401
|
|
51
|
+
? 'Bluesky refused that handle and app password. Check it is an APP password, not your account password.'
|
|
52
|
+
: `Bluesky refused the sign-in (HTTP ${r.status})` };
|
|
53
|
+
}
|
|
54
|
+
const j = await r.json();
|
|
55
|
+
const accessJwt = typeof j.accessJwt === 'string' ? j.accessJwt : '';
|
|
56
|
+
const did = typeof j.did === 'string' ? j.did : '';
|
|
57
|
+
if (!accessJwt || !did)
|
|
58
|
+
return { error: 'Bluesky returned no usable session' };
|
|
59
|
+
return {
|
|
60
|
+
credential: {
|
|
61
|
+
shape: 'session',
|
|
62
|
+
accessToken: accessJwt,
|
|
63
|
+
...(typeof j.refreshJwt === 'string' ? { refreshToken: j.refreshJwt } : {}),
|
|
64
|
+
// The secret is kept so a dead session can be re-minted; `pds` so a user on their own
|
|
65
|
+
// server is a field change rather than a code change.
|
|
66
|
+
extra: { appPassword: password, identifier, pds: BLUESKY_PDS, did },
|
|
67
|
+
},
|
|
68
|
+
externalId: did,
|
|
69
|
+
accountLabel: typeof j.handle === 'string' ? `@${j.handle}` : did,
|
|
70
|
+
// AT Proto does not state a lifetime here. Null means "do not pre-emptively refresh"; the
|
|
71
|
+
// 401-then-refresh path handles expiry when it actually arrives.
|
|
72
|
+
expiresAt: null,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return { error: `could not reach Bluesky: ${err.message}` };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (providerId === 'fake-static') {
|
|
80
|
+
try {
|
|
81
|
+
const r = await safeFetch(`${baseUrl}/session`, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: { 'Content-Type': 'application/json' },
|
|
84
|
+
body: JSON.stringify({ identifier, password }),
|
|
85
|
+
signal: AbortSignal.timeout(15_000),
|
|
86
|
+
});
|
|
87
|
+
if (!r.ok)
|
|
88
|
+
return { error: `the test provider refused the credential (HTTP ${r.status})` };
|
|
89
|
+
const j = await r.json();
|
|
90
|
+
const accessJwt = typeof j.accessJwt === 'string' ? j.accessJwt : '';
|
|
91
|
+
const did = typeof j.did === 'string' ? j.did : '';
|
|
92
|
+
if (!accessJwt || !did)
|
|
93
|
+
return { error: 'the test provider returned no usable session' };
|
|
94
|
+
return {
|
|
95
|
+
credential: {
|
|
96
|
+
shape: 'session',
|
|
97
|
+
accessToken: accessJwt,
|
|
98
|
+
...(typeof j.refreshJwt === 'string' ? { refreshToken: j.refreshJwt } : {}),
|
|
99
|
+
extra: { appPassword: password, identifier, pds: baseUrl, did },
|
|
100
|
+
},
|
|
101
|
+
externalId: did,
|
|
102
|
+
accountLabel: typeof j.handle === 'string' ? `@${j.handle}` : did,
|
|
103
|
+
expiresAt: null,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return { error: `could not reach the test provider: ${err.message}` };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { error: `no supplied-credential recipe for ${providerId}` };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Connect an account from a credential the user supplied.
|
|
114
|
+
*
|
|
115
|
+
* Re-attaching an account that is already connected UPDATES that row, exactly as re-authorising
|
|
116
|
+
* does on the OAuth side — which is what makes "my app password stopped working, here is a new one"
|
|
117
|
+
* a repair rather than a way to accumulate duplicates.
|
|
118
|
+
*/
|
|
119
|
+
export async function attachCredential(ctx, input) {
|
|
120
|
+
const provider = findProvider(ctx.providers, input.provider);
|
|
121
|
+
if (!provider)
|
|
122
|
+
return { ok: false, code: 'UNKNOWN_PROVIDER', reason: `no provider '${input.provider}'` };
|
|
123
|
+
if (!provider.enabled) {
|
|
124
|
+
return { ok: false, code: 'PROVIDER_DISABLED', reason: provider.disabledReason ?? 'provider is disabled' };
|
|
125
|
+
}
|
|
126
|
+
if (!provider.attachFields) {
|
|
127
|
+
// The two paths never overlap: a provider with an authorization round must go through it, or a
|
|
128
|
+
// caller could skip the consent screen by posting here instead.
|
|
129
|
+
return { ok: false, code: 'NEEDS_AUTHORIZATION', reason: `${provider.id} is connected by approving it at the provider, not by supplying a credential` };
|
|
130
|
+
}
|
|
131
|
+
for (const f of provider.attachFields) {
|
|
132
|
+
if (!input.fields[f.name]) {
|
|
133
|
+
return { ok: false, code: 'MISSING_FIELD', reason: `${f.label} is required` };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const minted = await mintSession(provider.id, input.fields, ctx.config.connectFakeBaseUrl);
|
|
137
|
+
if ('error' in minted)
|
|
138
|
+
return { ok: false, code: 'ATTACH_FAILED', reason: minted.error };
|
|
139
|
+
const credential = sealCredential(minted.credential, ctx.key);
|
|
140
|
+
const now = new Date().toISOString();
|
|
141
|
+
const existing = await ctx.storage.findConnection(input.principal, provider.id, minted.externalId, null);
|
|
142
|
+
if (existing) {
|
|
143
|
+
await ctx.storage.updateConnectionCredential(existing.id, credential, minted.expiresAt);
|
|
144
|
+
const refreshed = await ctx.storage.getConnection(existing.id);
|
|
145
|
+
return { ok: true, connection: refreshed ?? existing, created: false };
|
|
146
|
+
}
|
|
147
|
+
const connection = {
|
|
148
|
+
id: randomUUID(),
|
|
149
|
+
principal: input.principal,
|
|
150
|
+
mode: input.mode,
|
|
151
|
+
provider: provider.id,
|
|
152
|
+
instance: null,
|
|
153
|
+
accountLabel: minted.accountLabel,
|
|
154
|
+
externalId: minted.externalId,
|
|
155
|
+
credential,
|
|
156
|
+
credentialShape: 'session',
|
|
157
|
+
scopes: provider.scopes,
|
|
158
|
+
expiresAt: minted.expiresAt,
|
|
159
|
+
status: 'active',
|
|
160
|
+
lastOkAt: now,
|
|
161
|
+
lastError: null,
|
|
162
|
+
createdAt: now,
|
|
163
|
+
updatedAt: now,
|
|
164
|
+
};
|
|
165
|
+
await ctx.storage.createConnection(connection);
|
|
166
|
+
return { ok: true, connection, created: true };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=attach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../../src/services/connections/attach.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file credential.ts
|
|
3
|
+
* @description Sealing and opening an outbound connection's credential (TARGET-057). The one place
|
|
4
|
+
* a token is turned into ciphertext and back, so there is exactly one place to audit.
|
|
5
|
+
*
|
|
6
|
+
* The whole credential is sealed as a single JSON document rather than field by field. That keeps
|
|
7
|
+
* the three shapes (oauth2 / static / session) storable in one column, and it means a future
|
|
8
|
+
* provider that needs an extra field does not need a migration to hold it.
|
|
9
|
+
*
|
|
10
|
+
* NOTHING HERE LOGS. A decrypt failure returns null with a caller-facing reason; it never prints
|
|
11
|
+
* the ciphertext, the key state or the provider's response. A secret that reaches a log has left
|
|
12
|
+
* the node as surely as one that reaches an API response.
|
|
13
|
+
* @structure sealCredential · openCredential · requireEncryptionKey
|
|
14
|
+
* @usage import { sealCredential, openCredential } from './credential.js';
|
|
15
|
+
* @version-history
|
|
16
|
+
* v1.0.0 — 2026-08-02 — TARGET-057 Phase 1c.
|
|
17
|
+
*/
|
|
18
|
+
import type { AimeatConfig } from '../../config.js';
|
|
19
|
+
import type { ConnectionCredential } from '../../models/connection-schemas.js';
|
|
20
|
+
/**
|
|
21
|
+
* The node's master key, or null when none is configured.
|
|
22
|
+
*
|
|
23
|
+
* Callers must refuse the whole operation on null rather than continue. There is no degraded mode
|
|
24
|
+
* here: storing a token in the clear because a key was missing is worse than not storing it, and
|
|
25
|
+
* extension secrets already take this same path.
|
|
26
|
+
*/
|
|
27
|
+
export declare function requireEncryptionKey(config: AimeatConfig): Buffer | null;
|
|
28
|
+
/** Seal a credential for storage. Returns `iv:tag:ct`. */
|
|
29
|
+
export declare function sealCredential(credential: ConnectionCredential, key: Buffer): string;
|
|
30
|
+
/**
|
|
31
|
+
* Open a stored credential. Returns null when the ciphertext cannot be read — a rotated key, a
|
|
32
|
+
* truncated column, a row restored from a backup taken under a different key.
|
|
33
|
+
*
|
|
34
|
+
* Null is a legitimate outcome the caller must handle by parking the connection in `needs_reauth`,
|
|
35
|
+
* because the honest statement to the owner is "reconnect this account", not a 500. Throwing here
|
|
36
|
+
* would surface as an unhandled error in whatever background job happened to touch it first.
|
|
37
|
+
*/
|
|
38
|
+
export declare function openCredential(ciphertext: string, key: Buffer): ConnectionCredential | null;
|
|
39
|
+
//# sourceMappingURL=credential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential.d.ts","sourceRoot":"","sources":["../../../../src/services/connections/credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE/E;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAExE;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAoB3F"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file credential.ts
|
|
3
|
+
* @description Sealing and opening an outbound connection's credential (TARGET-057). The one place
|
|
4
|
+
* a token is turned into ciphertext and back, so there is exactly one place to audit.
|
|
5
|
+
*
|
|
6
|
+
* The whole credential is sealed as a single JSON document rather than field by field. That keeps
|
|
7
|
+
* the three shapes (oauth2 / static / session) storable in one column, and it means a future
|
|
8
|
+
* provider that needs an extra field does not need a migration to hold it.
|
|
9
|
+
*
|
|
10
|
+
* NOTHING HERE LOGS. A decrypt failure returns null with a caller-facing reason; it never prints
|
|
11
|
+
* the ciphertext, the key state or the provider's response. A secret that reaches a log has left
|
|
12
|
+
* the node as surely as one that reaches an API response.
|
|
13
|
+
* @structure sealCredential · openCredential · requireEncryptionKey
|
|
14
|
+
* @usage import { sealCredential, openCredential } from './credential.js';
|
|
15
|
+
* @version-history
|
|
16
|
+
* v1.0.0 — 2026-08-02 — TARGET-057 Phase 1c.
|
|
17
|
+
*/
|
|
18
|
+
import { encrypt, decrypt, getEncryptionKey } from '../encryption.js';
|
|
19
|
+
import { logger } from '../../utils/logger.js';
|
|
20
|
+
/**
|
|
21
|
+
* The node's master key, or null when none is configured.
|
|
22
|
+
*
|
|
23
|
+
* Callers must refuse the whole operation on null rather than continue. There is no degraded mode
|
|
24
|
+
* here: storing a token in the clear because a key was missing is worse than not storing it, and
|
|
25
|
+
* extension secrets already take this same path.
|
|
26
|
+
*/
|
|
27
|
+
export function requireEncryptionKey(config) {
|
|
28
|
+
return getEncryptionKey(config);
|
|
29
|
+
}
|
|
30
|
+
/** Seal a credential for storage. Returns `iv:tag:ct`. */
|
|
31
|
+
export function sealCredential(credential, key) {
|
|
32
|
+
return encrypt(JSON.stringify(credential), key);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Open a stored credential. Returns null when the ciphertext cannot be read — a rotated key, a
|
|
36
|
+
* truncated column, a row restored from a backup taken under a different key.
|
|
37
|
+
*
|
|
38
|
+
* Null is a legitimate outcome the caller must handle by parking the connection in `needs_reauth`,
|
|
39
|
+
* because the honest statement to the owner is "reconnect this account", not a 500. Throwing here
|
|
40
|
+
* would surface as an unhandled error in whatever background job happened to touch it first.
|
|
41
|
+
*/
|
|
42
|
+
export function openCredential(ciphertext, key) {
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(decrypt(ciphertext, key));
|
|
45
|
+
if (!parsed || typeof parsed !== 'object')
|
|
46
|
+
return null;
|
|
47
|
+
const c = parsed;
|
|
48
|
+
if (typeof c.accessToken !== 'string' || typeof c.shape !== 'string')
|
|
49
|
+
return null;
|
|
50
|
+
return {
|
|
51
|
+
shape: c.shape,
|
|
52
|
+
accessToken: c.accessToken,
|
|
53
|
+
...(typeof c.refreshToken === 'string' ? { refreshToken: c.refreshToken } : {}),
|
|
54
|
+
...(c.extra && typeof c.extra === 'object' ? { extra: c.extra } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// The FACT is logged; the exception is not. A failed decrypt's message can carry fragments of
|
|
59
|
+
// the ciphertext, so passing it to the logger would put key material in the log to satisfy a
|
|
60
|
+
// rule about visibility. An operator needs to know this happened, not what the bytes were —
|
|
61
|
+
// and the caller adds which connection it was when it parks the row in needs_reauth.
|
|
62
|
+
logger.warn('connections: a stored credential could not be opened (rotated key, or a backup restored under another key)');
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../../../src/services/connections/credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI/C;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,UAAgC,EAAE,GAAW;IAC1E,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,GAAW;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAY,CAAC;QAC/D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvD,MAAM,CAAC,GAAG,MAAuC,CAAC;QAClD,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClF,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,GAAG,CAAC,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAA+B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChG,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,8FAA8F;QAC9F,6FAA6F;QAC7F,4FAA4F;QAC5F,qFAAqF;QACrF,MAAM,CAAC,IAAI,CAAC,4GAA4G,CAAC,CAAC;QAC1H,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file instance.ts
|
|
3
|
+
* @description Instance-scoped provider support (TARGET-057): normalising a user-supplied instance
|
|
4
|
+
* address, and registering this node as an application at that instance on first contact.
|
|
5
|
+
*
|
|
6
|
+
* THE ADDRESS COMES FROM A USER. That single fact drives this whole file. `mastodon.social` is
|
|
7
|
+
* typed into a box by whoever is connecting, and the node then makes an HTTP request to it. That
|
|
8
|
+
* is an SSRF vector, and the answer is two layers rather than one: normalise and reject
|
|
9
|
+
* syntactically here, then let safeFetch apply the network-level rules (private ranges, redirect
|
|
10
|
+
* re-validation) on every request that follows.
|
|
11
|
+
*
|
|
12
|
+
* LAZY REGISTRATION. There is no way to know which instance the next user arrives from, and there
|
|
13
|
+
* are thousands, so the client credentials cannot be configuration. The node registers itself the
|
|
14
|
+
* first time someone connects from an instance and remembers the result, so the second user
|
|
15
|
+
* reuses the first user's registration rather than minting a parallel one.
|
|
16
|
+
* @structure normalizeInstance · registerAtInstance
|
|
17
|
+
* @usage import { normalizeInstance, registerAtInstance } from './instance.js';
|
|
18
|
+
* @version-history
|
|
19
|
+
* v1.0.0 — 2026-08-02 — TARGET-057 Phase 1c.
|
|
20
|
+
*/
|
|
21
|
+
import type { Storage } from '../../storage/interface.js';
|
|
22
|
+
/** A normalised instance origin, or the reason it was refused. */
|
|
23
|
+
export type InstanceResult = {
|
|
24
|
+
ok: true;
|
|
25
|
+
origin: string;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
reason: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Normalise `mastodon.social`, `https://mastodon.social/`, `HTTPS://Mastodon.Social` and friends to
|
|
32
|
+
* one canonical origin, or refuse.
|
|
33
|
+
*
|
|
34
|
+
* Canonicalising matters beyond tidiness: the origin is the storage key for the node's registration
|
|
35
|
+
* at that instance, so two spellings of one instance would register twice and hold two client
|
|
36
|
+
* secrets for the same place.
|
|
37
|
+
*
|
|
38
|
+
* HTTPS is forced rather than accepted-if-offered. An instance reached over http would carry the
|
|
39
|
+
* user's authorization code in the clear, and accepting `http://` from a text box is also the
|
|
40
|
+
* easiest way to reach something that is not on the internet at all.
|
|
41
|
+
*/
|
|
42
|
+
export declare function normalizeInstance(raw: string): InstanceResult;
|
|
43
|
+
/** Client credentials this node holds at one instance. */
|
|
44
|
+
export interface InstanceClient {
|
|
45
|
+
clientId: string;
|
|
46
|
+
clientSecret: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The node's application registration at `origin`, registering it if this is the first contact.
|
|
50
|
+
*
|
|
51
|
+
* Concurrency is handled by the store rather than here: `upsertProviderClient` is insert-if-new and
|
|
52
|
+
* returns whatever is now there, so two users arriving from one instance at the same moment
|
|
53
|
+
* converge on a single registration. The loser of that race has registered an application at the
|
|
54
|
+
* instance that nothing will ever point at, which is untidy at the instance and harmless to us —
|
|
55
|
+
* the alternative, a lock held across a network call to a stranger's server, is worse.
|
|
56
|
+
*/
|
|
57
|
+
export declare function registerAtInstance(storage: Storage, key: Buffer, provider: string, origin: string, app: {
|
|
58
|
+
name: string;
|
|
59
|
+
redirectUri: string;
|
|
60
|
+
scopes: string[];
|
|
61
|
+
website: string;
|
|
62
|
+
}): Promise<InstanceClient | {
|
|
63
|
+
error: string;
|
|
64
|
+
}>;
|
|
65
|
+
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../../../src/services/connections/instance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAE1D,kEAAkE;AAClE,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CA6B7D;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5E,OAAO,CAAC,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAkE7C"}
|