@app-vitals/agent-admin 0.0.1 → 0.1.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/Dockerfile +43 -0
- package/README.md +72 -2
- package/e2e/agents-page.e2e.ts +338 -0
- package/e2e/chat-degraded.e2e.ts +153 -0
- package/e2e/chat-page.e2e.ts +169 -0
- package/e2e/chat-progress.e2e.ts +206 -0
- package/e2e/chat-thread-page.e2e.ts +444 -0
- package/e2e/login-page.e2e.ts +148 -0
- package/e2e/test-server.ts +427 -0
- package/openapi.json +6098 -0
- package/openapi.platform.json +5553 -0
- package/package.json +62 -4
- package/playwright.config.ts +25 -0
- package/prisma/client/browser.ts +134 -0
- package/prisma/client/client.ts +158 -0
- package/prisma/client/commonInputTypes.ts +578 -0
- package/prisma/client/enums.ts +15 -0
- package/prisma/client/internal/class.ts +424 -0
- package/prisma/client/internal/prismaNamespace.ts +2898 -0
- package/prisma/client/internal/prismaNamespaceBrowser.ts +476 -0
- package/prisma/client/models/Account.ts +1774 -0
- package/prisma/client/models/AccountInvite.ts +1386 -0
- package/prisma/client/models/AccountMember.ts +1351 -0
- package/prisma/client/models/Agent.ts +4554 -0
- package/prisma/client/models/AgentAsk.ts +1373 -0
- package/prisma/client/models/AgentChatTokenUsageDailyByModel.ts +1638 -0
- package/prisma/client/models/AgentCronJob.ts +2416 -0
- package/prisma/client/models/AgentCronRun.ts +2858 -0
- package/prisma/client/models/AgentCronRunModelBreakdown.ts +1532 -0
- package/prisma/client/models/AgentCronRunSkillUsage.ts +1642 -0
- package/prisma/client/models/AgentEnv.ts +1421 -0
- package/prisma/client/models/AgentGitHubInstallationsSnapshot.ts +1289 -0
- package/prisma/client/models/AgentMember.ts +1316 -0
- package/prisma/client/models/AgentPhaseMethodology.ts +1355 -0
- package/prisma/client/models/AgentPlugin.ts +1421 -0
- package/prisma/client/models/AgentToken.ts +1380 -0
- package/prisma/client/models/AgentTool.ts +1351 -0
- package/prisma/client/models/AgentWorkQueueSnapshot.ts +1297 -0
- package/prisma/client/models/ChatThreadWatch.ts +1183 -0
- package/prisma/client/models/PushSubscription.ts +1233 -0
- package/prisma/client/models/SessionAlertState.ts +1187 -0
- package/prisma/client/models/SessionFollow.ts +1187 -0
- package/prisma/client/models/UserNotificationPrefs.ts +1221 -0
- package/prisma/client/models.ts +34 -0
- package/prisma/migrations/20260608000000_init/migration.sql +112 -0
- package/prisma/migrations/20260616000000_agent_members/migration.sql +18 -0
- package/prisma/migrations/20260624000000_add_agent_self_hosted/migration.sql +2 -0
- package/prisma/migrations/20260624120000_add_agent_repos/migration.sql +3 -0
- package/prisma/migrations/20260625000000_add_agent_cron_run/migration.sql +26 -0
- package/prisma/migrations/20260626000000_add_cron_run_token_fields/migration.sql +10 -0
- package/prisma/migrations/20260627000000_add_agent_chat_token_usage_daily/migration.sql +18 -0
- package/prisma/migrations/20260627010000_add_agent_chat_token_usage_fk/migration.sql +2 -0
- package/prisma/migrations/20260701000000_add_chat_threads_messages/migration.sql +37 -0
- package/prisma/migrations/20260701010000_drop_chat_threads_messages/migration.sql +17 -0
- package/prisma/migrations/20260701020000_add_cron_run_model_breakdown/migration.sql +23 -0
- package/prisma/migrations/20260701020000_chat_token_by_model/migration.sql +25 -0
- package/prisma/migrations/20260701030000_add_secret_flag_to_agent_env/migration.sql +2 -0
- package/prisma/migrations/20260701030000_drop_cron_run_legacy_columns/migration.sql +5 -0
- package/prisma/migrations/20260706000000_consolidate_cron_run_token_accounting/migration.sql +54 -0
- package/prisma/migrations/20260709000000_add_phase_to_agent_cron_run/migration.sql +8 -0
- package/prisma/migrations/20260717000000_add_item_tracking_to_agent_cron_run/migration.sql +10 -0
- package/prisma/migrations/20260717010000_add_agent_work_queue_snapshot/migration.sql +20 -0
- package/prisma/migrations/20260718000000_add_cron_phase_columns/migration.sql +25 -0
- package/prisma/migrations/20260718100000_drop_agent_cron_run_phase_column/migration.sql +8 -0
- package/prisma/migrations/20260724000000_add_agent_type_name/migration.sql +3 -0
- package/prisma/migrations/20260725232433_add_agent_author_allowlist/migration.sql +2 -0
- package/prisma/migrations/20260727120000_add_not_null_to_agent_author_allowlist/migration.sql +3 -0
- package/prisma/migrations/20260731000000_add_session_id_to_agent_cron_run/migration.sql +2 -0
- package/prisma/migrations/20260821000000_add_agent_restrict_slack_to_members/migration.sql +3 -0
- package/prisma/migrations/20260901000000_add_push_subscription_and_chat_thread_watch/migration.sql +40 -0
- package/prisma/migrations/20260903000000_add_agent_patch_author_allowlist/migration.sql +2 -0
- package/prisma/migrations/20260903120000_add_agent_review_author_allowlist/migration.sql +18 -0
- package/prisma/migrations/20260903150000_drop_agent_author_allowlist/migration.sql +14 -0
- package/prisma/migrations/20260905000000_add_started_at_index_to_agent_cron_run/migration.sql +11 -0
- package/prisma/migrations/20260906000000_add_session_follow_notification_prefs_alert_state/migration.sql +47 -0
- package/prisma/migrations/20260911000000_backfill_auto_follow_since/migration.sql +16 -0
- package/prisma/migrations/20260923115814_add_last_heartbeat_at_to_agent_cron_run/migration.sql +2 -0
- package/prisma/migrations/20260924120000_add_trial_expiry_fields_to_agent/migration.sql +6 -0
- package/prisma/migrations/20260929000000_add_agent_phase_methodology/migration.sql +21 -0
- package/prisma/migrations/20260929120000_add_agent_policy_fields/migration.sql +15 -0
- package/prisma/migrations/20261005000000_add_agent_github_installations_snapshot/migration.sql +21 -0
- package/prisma/migrations/20261008000000_add_cron_run_telemetry/migration.sql +50 -0
- package/prisma/migrations/20261008010000_add_account_models/migration.sql +48 -0
- package/prisma/migrations/20261008020000_add_cron_lockdown_disabled_at/migration.sql +3 -0
- package/prisma/migrations/20261009000000_chat_token_usage_bigint/migration.sql +7 -0
- package/prisma/migrations/20261010000000_add_cron_run_command_variant/migration.sql +2 -0
- package/prisma/migrations/20261019000000_add_agent_anthropic_identity/migration.sql +9 -0
- package/prisma/migrations/20261025000000_add_agent_ask/migration.sql +23 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema/coding.prisma +85 -0
- package/prisma/schema/schema.prisma +506 -0
- package/prisma.config.ts +34 -0
- package/pwa-assets/icons/apple-touch-icon.png +0 -0
- package/pwa-assets/icons/favicon-32.png +0 -0
- package/pwa-assets/icons/icon-192.png +0 -0
- package/pwa-assets/icons/icon-512.png +0 -0
- package/pwa-assets/icons/icon-maskable-192.png +0 -0
- package/pwa-assets/icons/icon-maskable-512.png +0 -0
- package/src/account-agent-create.ts +42 -0
- package/src/account-agent-create.unit.test.ts +28 -0
- package/src/account-created-notifier.ts +71 -0
- package/src/account-created-notifier.unit.test.ts +70 -0
- package/src/account-email.ts +9 -0
- package/src/account-email.unit.test.ts +21 -0
- package/src/account-invites.ts +70 -0
- package/src/account-lifecycle.integration.test.ts +329 -0
- package/src/account-lifecycle.ts +206 -0
- package/src/account-lifecycle.unit.test.ts +108 -0
- package/src/account-members.ts +128 -0
- package/src/account-onboarding.integration.test.ts +101 -0
- package/src/account-onboarding.ts +95 -0
- package/src/account-trial-expiry-sweeper.ts +85 -0
- package/src/account-trial-warning-sweeper.integration.test.ts +228 -0
- package/src/account-trial-warning-sweeper.ts +216 -0
- package/src/accounts-api.integration.test.ts +196 -0
- package/src/accounts-api.smoke.test.ts +292 -0
- package/src/accounts-api.ts +289 -0
- package/src/accounts-api.unit.test.ts +93 -0
- package/src/accounts.integration.test.ts +178 -0
- package/src/accounts.ts +208 -0
- package/src/admin-boot-config.ts +574 -0
- package/src/admin-boot-config.unit.test.ts +28 -0
- package/src/admin-boot.boot-order.unit.test.ts +91 -0
- package/src/admin-boot.ts +690 -0
- package/src/admin-dev-login.smoke.test.ts +317 -0
- package/src/admin-extension.ts +432 -0
- package/src/admin-extension.unit.test.ts +532 -0
- package/src/admin-local-agent.smoke.test.ts +1643 -0
- package/src/admin-spec.smoke.test.ts +96 -0
- package/src/admin-spec.ts +186 -0
- package/src/admin-ui-account-nav.ts +20 -0
- package/src/admin-ui-account-pages.ts +131 -0
- package/src/admin-ui-account-pages.unit.test.ts +112 -0
- package/src/admin-ui-account.smoke.test.ts +286 -0
- package/src/admin-ui-account.ts +185 -0
- package/src/admin-ui-accounts-pages.ts +202 -0
- package/src/admin-ui-accounts-pages.unit.test.ts +138 -0
- package/src/admin-ui-accounts.smoke.test.ts +434 -0
- package/src/admin-ui-accounts.ts +266 -0
- package/src/admin-ui-layout.ts +60 -0
- package/src/admin-ui-layout.unit.test.ts +140 -0
- package/src/admin-ui-pages.ts +3489 -0
- package/src/admin-ui-pages.unit.test.ts +4355 -0
- package/src/admin-ui-push-test.smoke.test.ts +125 -0
- package/src/admin-ui-push-test.ts +102 -0
- package/src/admin-ui-styles.ts +656 -0
- package/src/admin-ui-styles.unit.test.ts +103 -0
- package/src/admin-ui.fixtures.ts +457 -0
- package/src/admin-ui.smoke.test.ts +7227 -0
- package/src/admin-ui.ts +3824 -0
- package/src/agent-account-assignment.ts +49 -0
- package/src/agent-account-assignment.unit.test.ts +99 -0
- package/src/agent-anthropic-identity.integration.test.ts +99 -0
- package/src/agent-anthropic-identity.ts +78 -0
- package/src/agent-anthropic-identity.unit.test.ts +77 -0
- package/src/agent-ask-config.ts +59 -0
- package/src/agent-ask-config.unit.test.ts +70 -0
- package/src/agent-ask.integration.test.ts +175 -0
- package/src/agent-ask.smoke.test.ts +457 -0
- package/src/agent-ask.ts +378 -0
- package/src/agent-chat-tokens.integration.test.ts +420 -0
- package/src/agent-chat-tokens.smoke.test.ts +551 -0
- package/src/agent-chat-tokens.ts +259 -0
- package/src/agent-cron-jobs.integration.test.ts +582 -0
- package/src/agent-cron-jobs.ts +615 -0
- package/src/agent-cron-jobs.unit.test.ts +420 -0
- package/src/agent-cron-run-stats.integration.test.ts +1551 -0
- package/src/agent-cron-run-stats.smoke.test.ts +953 -0
- package/src/agent-cron-run-stats.ts +752 -0
- package/src/agent-cron-runs.integration.test.ts +1491 -0
- package/src/agent-cron-runs.ts +489 -0
- package/src/agent-deletion-checklist.ts +128 -0
- package/src/agent-deletion-checklist.unit.test.ts +201 -0
- package/src/agent-deletion-per-agent.integration.test.ts +323 -0
- package/src/agent-deletion.integration.test.ts +323 -0
- package/src/agent-deletion.ts +329 -0
- package/src/agent-deletion.unit.test.ts +412 -0
- package/src/agent-envs.integration.test.ts +323 -0
- package/src/agent-envs.ts +244 -0
- package/src/agent-github-installations.integration.test.ts +115 -0
- package/src/agent-github-installations.ts +52 -0
- package/src/agent-manifest.ts +685 -0
- package/src/agent-manifest.unit.test.ts +870 -0
- package/src/agent-members.ts +69 -0
- package/src/agent-members.unit.test.ts +250 -0
- package/src/agent-patch-author-allowlist.integration.test.ts +218 -0
- package/src/agent-plugins.integration.test.ts +157 -0
- package/src/agent-plugins.ts +95 -0
- package/src/agent-plugins.unit.test.ts +43 -0
- package/src/agent-provisioner-per-agent.integration.test.ts +949 -0
- package/src/agent-provisioner.integration.test.ts +1245 -0
- package/src/agent-provisioner.ts +1650 -0
- package/src/agent-provisioner.unit.test.ts +1852 -0
- package/src/agent-tokens.integration.test.ts +150 -0
- package/src/agent-tokens.ts +112 -0
- package/src/agent-tools.integration.test.ts +129 -0
- package/src/agent-tools.ts +111 -0
- package/src/agents-api.integration.test.ts +705 -0
- package/src/agents-api.sentry.smoke.test.ts +478 -0
- package/src/agents-api.smoke.test.ts +5986 -0
- package/src/agents-api.ts +2826 -0
- package/src/agents.integration.test.ts +512 -0
- package/src/agents.ts +1097 -0
- package/src/agents.unit.test.ts +1736 -0
- package/src/anthropic-credential-guard.ts +44 -0
- package/src/anthropic-credential-guard.unit.test.ts +88 -0
- package/src/anthropic-federated-token-provider.integration.test.ts +248 -0
- package/src/anthropic-federated-token-provider.ts +249 -0
- package/src/anthropic-identity-client.fixtures.ts +237 -0
- package/src/anthropic-identity-client.integration.test.ts +342 -0
- package/src/anthropic-identity-client.ts +473 -0
- package/src/anthropic-identity-fixture-spec.integration.test.ts +169 -0
- package/src/anthropic-identity-name.integration.test.ts +83 -0
- package/src/anthropic-identity-name.ts +163 -0
- package/src/anthropic-identity-name.unit.test.ts +345 -0
- package/src/anthropic-openapi-contract.fixtures.ts +192 -0
- package/src/api-auth.ts +383 -0
- package/src/api-auth.unit.test.ts +837 -0
- package/src/api.smoke.test.ts +1225 -0
- package/src/api.ts +376 -0
- package/src/attachment-validation.ts +124 -0
- package/src/attachment-validation.unit.test.ts +218 -0
- package/src/caller-scope.ts +131 -0
- package/src/caller-scope.unit.test.ts +116 -0
- package/src/chat-credential-config.ts +22 -0
- package/src/chat-credentials-logging.unit.test.ts +92 -0
- package/src/chat-markers.ts +114 -0
- package/src/chat-markers.unit.test.ts +116 -0
- package/src/chat-service-provisioning-client.integration.test.ts +412 -0
- package/src/chat-service-provisioning-client.ts +221 -0
- package/src/chat.smoke.test.ts +1875 -0
- package/src/clock.ts +47 -0
- package/src/coding-task-store-provisioning-client.integration.test.ts +372 -0
- package/src/coding-task-store-provisioning-client.ts +156 -0
- package/src/crypto.ts +83 -0
- package/src/dev-auth-guard.ts +29 -0
- package/src/dev-auth-guard.unit.test.ts +51 -0
- package/src/errors.ts +77 -0
- package/src/errors.unit.test.ts +52 -0
- package/src/fixtures/anthropic-identity-recorded-fixtures.json +850 -0
- package/src/fixtures/anthropic-openapi/SDK_VERSION +1 -0
- package/src/fixtures/anthropic-openapi/mock-spec.json.gz +0 -0
- package/src/fixtures/chat-service-provisioning-cassette.json +156 -0
- package/src/fixtures/github-app-manifest-cassette.json +44 -0
- package/src/fixtures/google-auth-cassette.json +36 -0
- package/src/fixtures/http-chat-client-cassette.json +226 -0
- package/src/fixtures/k8s-cassette.json +470 -0
- package/src/fixtures/okta-auth-cassette.json +36 -0
- package/src/fixtures/slack-provision-cassette.json +12 -0
- package/src/fixtures/slack-provisioning-http-cassette.json +98 -0
- package/src/fixtures/task-store-provisioning-cassette.json +85 -0
- package/src/github-app-provisioning-client.integration.test.ts +149 -0
- package/src/github-app-provisioning-client.ts +161 -0
- package/src/github-app-provisioning-client.unit.test.ts +114 -0
- package/src/github-provisioning-service.ts +569 -0
- package/src/github-provisioning-service.unit.test.ts +123 -0
- package/src/google-auth-client.integration.test.ts +195 -0
- package/src/google-auth-client.ts +121 -0
- package/src/http-chat-client.integration.test.ts +554 -0
- package/src/http-chat-client.ts +533 -0
- package/src/http-chat-client.unit.test.ts +119 -0
- package/src/import-boundary.unit.test.ts +240 -0
- package/src/kubernetes-client.integration.test.ts +697 -0
- package/src/kubernetes-client.ts +1027 -0
- package/src/kubernetes-client.unit.test.ts +726 -0
- package/src/main.smoke.test.ts +91 -0
- package/src/main.ts +21 -0
- package/src/main.unit.test.ts +801 -0
- package/src/okta-auth-client.integration.test.ts +263 -0
- package/src/okta-auth-client.ts +152 -0
- package/src/openapi-schemas.ts +1310 -0
- package/src/openapi-schemas.unit.test.ts +348 -0
- package/src/per-agent-identity.fixtures.ts +305 -0
- package/src/platform-doc-route.ts +40 -0
- package/src/prisma-client.integration.test.ts +57 -0
- package/src/prisma-client.ts +187 -0
- package/src/prisma-client.unit.test.ts +178 -0
- package/src/prisma-tx.ts +23 -0
- package/src/push-content.ts +177 -0
- package/src/push-content.unit.test.ts +213 -0
- package/src/push-crypto.ts +135 -0
- package/src/push-crypto.unit.test.ts +66 -0
- package/src/push-sender.ts +169 -0
- package/src/push-sender.unit.test.ts +107 -0
- package/src/push-service.ts +332 -0
- package/src/push-service.unit.test.ts +679 -0
- package/src/push-toggle.ts +135 -0
- package/src/push-toggle.unit.test.ts +78 -0
- package/src/pwa-https-gating.smoke.test.ts +229 -0
- package/src/pwa-icons.unit.test.ts +41 -0
- package/src/pwa-routes.smoke.test.ts +276 -0
- package/src/pwa.ts +380 -0
- package/src/pwa.unit.test.ts +321 -0
- package/src/schema.unit.test.ts +122 -0
- package/src/self-serve-config.ts +52 -0
- package/src/self-serve-config.unit.test.ts +79 -0
- package/src/server.smoke.test.ts +273 -0
- package/src/server.ts +50 -0
- package/src/service-integration.ts +67 -0
- package/src/service-integration.unit.test.ts +129 -0
- package/src/slack-provisioning-client.integration.test.ts +308 -0
- package/src/slack-provisioning-client.ts +411 -0
- package/src/slack-provisioning-client.unit.test.ts +80 -0
- package/src/slack-provisioning-service.integration.test.ts +637 -0
- package/src/slack-provisioning-service.ts +451 -0
- package/src/slack-provisioning.integration.test.ts +395 -0
- package/src/specialty-manifest-loader.fixture.integration.test.ts +63 -0
- package/src/specialty-manifest-loader.ts +255 -0
- package/src/specialty-manifest-loader.unit.test.ts +301 -0
- package/src/specialty-registry.schema.unit.test.ts +35 -0
- package/src/specialty-registry.ts +236 -0
- package/src/specialty-registry.unit.test.ts +272 -0
- package/src/startup-policy-reconcile.ts +77 -0
- package/src/startup-policy-reconcile.unit.test.ts +251 -0
- package/src/theme-tokens.json +12 -0
- package/src/token-crypto.ts +60 -0
- package/src/token-crypto.unit.test.ts +182 -0
- package/src/trial-expiry-sweeper.integration.test.ts +318 -0
- package/src/trial-expiry-sweeper.ts +132 -0
- package/src/trial-expiry-sweeper.unit.test.ts +391 -0
- package/src/trial-expiry-warning-sweeper.integration.test.ts +468 -0
- package/src/trial-expiry-warning-sweeper.ts +447 -0
- package/src/trial-expiry-warning-sweeper.unit.test.ts +148 -0
- package/src/voice-contract.unit.test.ts +102 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* admin/src/chat-service-provisioning-client.ts
|
|
3
|
+
*
|
|
4
|
+
* Thin interface + implementations for minting/revoking per-agent chat-service
|
|
5
|
+
* tokens during agent provisioning, and for cleaning up chat-service state
|
|
6
|
+
* (tokens + threads) when an agent is deleted.
|
|
7
|
+
*
|
|
8
|
+
* The interface is the DI boundary. Tests inject a stub; production wires in
|
|
9
|
+
* HttpChatServiceProvisioningClient (or skips chat-service wiring entirely by
|
|
10
|
+
* omitting the client from KubernetesAgentProvisionerConfig).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// ─── Interface ───────────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
export interface ChatServiceProvisioningClient {
|
|
16
|
+
mintToken(
|
|
17
|
+
label: string,
|
|
18
|
+
agentId?: string,
|
|
19
|
+
): Promise<{ id: string; rawToken: string }>;
|
|
20
|
+
|
|
21
|
+
revokeToken(id: string): Promise<void>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* List the ids of every chat-service token scoped to `agentId`.
|
|
25
|
+
*
|
|
26
|
+
* chat-service's GET /tokens has no server-side agentId filter — it returns
|
|
27
|
+
* every token in the store — so this fetches the full list and filters
|
|
28
|
+
* client-side. Intended to be paired with `revokeToken` by the caller (e.g.
|
|
29
|
+
* agent-deletion cleanup): list, then revoke each match.
|
|
30
|
+
*/
|
|
31
|
+
listTokensForAgent(
|
|
32
|
+
agentId: string,
|
|
33
|
+
): Promise<{ id: string; label?: string | null }[]>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Delete every chat Thread scoped to `agentId`. Deleting a thread cascades
|
|
37
|
+
* its Message rows at the DB level, so no separate message cleanup is
|
|
38
|
+
* needed. Tolerates an individual thread already being gone (404) so this
|
|
39
|
+
* is safe to re-run (idempotent retry).
|
|
40
|
+
*
|
|
41
|
+
* Returns the number of threads *attempted* to delete — a tolerated 404
|
|
42
|
+
* still counts, since a re-run over an already-partially-cleaned agent
|
|
43
|
+
* should report those threads as handled rather than looking like it did
|
|
44
|
+
* nothing.
|
|
45
|
+
*/
|
|
46
|
+
deleteThreadsForAgent(agentId: string): Promise<{ deleted: number }>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ─── HTTP implementation ──────────────────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Real HTTP client for the chat-service token + thread APIs.
|
|
53
|
+
*
|
|
54
|
+
* POST /tokens → { id, rawToken, ... }
|
|
55
|
+
* GET /tokens (no server-side agentId filter — filtered client-side)
|
|
56
|
+
* DELETE /tokens/:id
|
|
57
|
+
* GET /threads?agentId= (server-side agentId filter; paginated via offset)
|
|
58
|
+
* DELETE /threads/:id
|
|
59
|
+
*
|
|
60
|
+
* The admin token is passed via Bearer auth and is never stored in the Secret
|
|
61
|
+
* or handed to the agent — only the per-agent rawToken is.
|
|
62
|
+
*/
|
|
63
|
+
export class HttpChatServiceProvisioningClient
|
|
64
|
+
implements ChatServiceProvisioningClient
|
|
65
|
+
{
|
|
66
|
+
private readonly fetchFn: typeof fetch;
|
|
67
|
+
|
|
68
|
+
constructor(
|
|
69
|
+
private readonly baseUrl: string,
|
|
70
|
+
private readonly adminToken: string,
|
|
71
|
+
opts?: { fetchFn?: typeof fetch },
|
|
72
|
+
) {
|
|
73
|
+
this.fetchFn = opts?.fetchFn ?? fetch;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async mintToken(
|
|
77
|
+
label: string,
|
|
78
|
+
agentId?: string,
|
|
79
|
+
): Promise<{ id: string; rawToken: string }> {
|
|
80
|
+
const res = await this.fetchFn(`${this.baseUrl}/tokens`, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
Authorization: `Bearer ${this.adminToken}`,
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify({ label, ...(agentId ? { agentId } : {}) }),
|
|
87
|
+
});
|
|
88
|
+
if (!res.ok) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`chat-service POST /tokens failed: ${res.status} ${res.statusText}`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
const body = (await res.json()) as { id: string; rawToken: string };
|
|
94
|
+
return { id: body.id, rawToken: body.rawToken };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async revokeToken(id: string): Promise<void> {
|
|
98
|
+
const res = await this.fetchFn(`${this.baseUrl}/tokens/${id}`, {
|
|
99
|
+
method: "DELETE",
|
|
100
|
+
headers: {
|
|
101
|
+
Authorization: `Bearer ${this.adminToken}`,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
if (!res.ok && res.status !== 404) {
|
|
105
|
+
throw new Error(
|
|
106
|
+
`chat-service DELETE /tokens/${id} failed: ${res.status} ${res.statusText}`,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async listTokensForAgent(
|
|
112
|
+
agentId: string,
|
|
113
|
+
): Promise<{ id: string; label?: string | null }[]> {
|
|
114
|
+
const res = await this.fetchFn(`${this.baseUrl}/tokens`, {
|
|
115
|
+
method: "GET",
|
|
116
|
+
headers: {
|
|
117
|
+
Authorization: `Bearer ${this.adminToken}`,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
if (!res.ok) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`chat-service GET /tokens failed: ${res.status} ${res.statusText}`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
const tokens = (await res.json()) as {
|
|
126
|
+
id: string;
|
|
127
|
+
label?: string | null;
|
|
128
|
+
agentId?: string | null;
|
|
129
|
+
}[];
|
|
130
|
+
return tokens
|
|
131
|
+
.filter((token) => token.agentId === agentId)
|
|
132
|
+
.map((token) => ({ id: token.id, label: token.label ?? null }));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async deleteThreadsForAgent(agentId: string): Promise<{ deleted: number }> {
|
|
136
|
+
const threadIds = await this.listThreadIdsForAgent(agentId);
|
|
137
|
+
|
|
138
|
+
let deleted = 0;
|
|
139
|
+
for (const threadId of threadIds) {
|
|
140
|
+
const res = await this.fetchFn(`${this.baseUrl}/threads/${threadId}`, {
|
|
141
|
+
method: "DELETE",
|
|
142
|
+
headers: {
|
|
143
|
+
Authorization: `Bearer ${this.adminToken}`,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
if (!res.ok && res.status !== 404) {
|
|
147
|
+
throw new Error(
|
|
148
|
+
`chat-service DELETE /threads/${threadId} failed: ${res.status} ${res.statusText}`,
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
// A tolerated 404 still counts as attempted/completed — see the
|
|
152
|
+
// interface doc comment on deleteThreadsForAgent.
|
|
153
|
+
deleted++;
|
|
154
|
+
}
|
|
155
|
+
return { deleted };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Fetch every thread id scoped to `agentId`, looping on `offset` while the
|
|
160
|
+
* response's `total` exceeds what's been collected so far. Orphan cleanup
|
|
161
|
+
* must not silently leave rows behind, so (unlike listTokensForAgent, which
|
|
162
|
+
* chat-service returns in one unfiltered page) this follows pagination
|
|
163
|
+
* rather than assuming a single page covers every thread.
|
|
164
|
+
*/
|
|
165
|
+
private async listThreadIdsForAgent(agentId: string): Promise<string[]> {
|
|
166
|
+
const ids: string[] = [];
|
|
167
|
+
let offset = 0;
|
|
168
|
+
|
|
169
|
+
for (;;) {
|
|
170
|
+
const res = await this.fetchFn(
|
|
171
|
+
`${this.baseUrl}/threads?agentId=${encodeURIComponent(agentId)}&offset=${offset}`,
|
|
172
|
+
{
|
|
173
|
+
method: "GET",
|
|
174
|
+
headers: {
|
|
175
|
+
Authorization: `Bearer ${this.adminToken}`,
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
);
|
|
179
|
+
if (!res.ok) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
`chat-service GET /threads failed: ${res.status} ${res.statusText}`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
const body = (await res.json()) as {
|
|
185
|
+
threads: { id: string }[];
|
|
186
|
+
total: number;
|
|
187
|
+
};
|
|
188
|
+
for (const thread of body.threads) ids.push(thread.id);
|
|
189
|
+
offset += body.threads.length;
|
|
190
|
+
|
|
191
|
+
if (body.threads.length === 0 || offset >= body.total) break;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return ids;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ─── No-op implementation ─────────────────────────────────────────────────────
|
|
199
|
+
|
|
200
|
+
export class NoopChatServiceProvisioningClient
|
|
201
|
+
implements ChatServiceProvisioningClient
|
|
202
|
+
{
|
|
203
|
+
async mintToken(
|
|
204
|
+
_label: string,
|
|
205
|
+
_agentId?: string,
|
|
206
|
+
): Promise<{ id: string; rawToken: string }> {
|
|
207
|
+
return { id: "", rawToken: "" };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async revokeToken(_id: string): Promise<void> {
|
|
211
|
+
// intentionally a no-op
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async listTokensForAgent(_agentId: string): Promise<{ id: string }[]> {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
async deleteThreadsForAgent(_agentId: string): Promise<{ deleted: number }> {
|
|
219
|
+
return { deleted: 0 };
|
|
220
|
+
}
|
|
221
|
+
}
|