@amodalai/runtime 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/LICENSE +21 -0
- package/dist/.last_build +0 -0
- package/dist/src/agent/agent-runner.d.ts +13 -0
- package/dist/src/agent/agent-runner.js +827 -0
- package/dist/src/agent/agent-runner.js.map +1 -0
- package/dist/src/agent/agent-runner.test.d.ts +6 -0
- package/dist/src/agent/agent-runner.test.js +552 -0
- package/dist/src/agent/agent-runner.test.js.map +1 -0
- package/dist/src/agent/agent-types.d.ts +57 -0
- package/dist/src/agent/agent-types.js +17 -0
- package/dist/src/agent/agent-types.js.map +1 -0
- package/dist/src/agent/agent-types.test.d.ts +6 -0
- package/dist/src/agent/agent-types.test.js +44 -0
- package/dist/src/agent/agent-types.test.js.map +1 -0
- package/dist/src/agent/automation-bridge.d.ts +24 -0
- package/dist/src/agent/automation-bridge.js +24 -0
- package/dist/src/agent/automation-bridge.js.map +1 -0
- package/dist/src/agent/automation-bridge.test.d.ts +6 -0
- package/dist/src/agent/automation-bridge.test.js +67 -0
- package/dist/src/agent/automation-bridge.test.js.map +1 -0
- package/dist/src/agent/config-watcher.d.ts +20 -0
- package/dist/src/agent/config-watcher.js +68 -0
- package/dist/src/agent/config-watcher.js.map +1 -0
- package/dist/src/agent/config-watcher.test.d.ts +6 -0
- package/dist/src/agent/config-watcher.test.js +83 -0
- package/dist/src/agent/config-watcher.test.js.map +1 -0
- package/dist/src/agent/custom-tools-e2e.test.d.ts +6 -0
- package/dist/src/agent/custom-tools-e2e.test.js +566 -0
- package/dist/src/agent/custom-tools-e2e.test.js.map +1 -0
- package/dist/src/agent/local-server.d.ts +15 -0
- package/dist/src/agent/local-server.js +158 -0
- package/dist/src/agent/local-server.js.map +1 -0
- package/dist/src/agent/local-server.test.d.ts +6 -0
- package/dist/src/agent/local-server.test.js +126 -0
- package/dist/src/agent/local-server.test.js.map +1 -0
- package/dist/src/agent/proactive/delivery.d.ts +21 -0
- package/dist/src/agent/proactive/delivery.js +68 -0
- package/dist/src/agent/proactive/delivery.js.map +1 -0
- package/dist/src/agent/proactive/delivery.test.d.ts +6 -0
- package/dist/src/agent/proactive/delivery.test.js +65 -0
- package/dist/src/agent/proactive/delivery.test.js.map +1 -0
- package/dist/src/agent/proactive/proactive-runner.d.ts +76 -0
- package/dist/src/agent/proactive/proactive-runner.js +201 -0
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -0
- package/dist/src/agent/proactive/proactive-runner.test.d.ts +6 -0
- package/dist/src/agent/proactive/proactive-runner.test.js +265 -0
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -0
- package/dist/src/agent/request-helper.d.ts +16 -0
- package/dist/src/agent/request-helper.js +87 -0
- package/dist/src/agent/request-helper.js.map +1 -0
- package/dist/src/agent/routes/automations.d.ts +19 -0
- package/dist/src/agent/routes/automations.js +58 -0
- package/dist/src/agent/routes/automations.js.map +1 -0
- package/dist/src/agent/routes/automations.test.d.ts +6 -0
- package/dist/src/agent/routes/automations.test.js +117 -0
- package/dist/src/agent/routes/automations.test.js.map +1 -0
- package/dist/src/agent/routes/chat.d.ts +35 -0
- package/dist/src/agent/routes/chat.js +88 -0
- package/dist/src/agent/routes/chat.js.map +1 -0
- package/dist/src/agent/routes/chat.test.d.ts +6 -0
- package/dist/src/agent/routes/chat.test.js +115 -0
- package/dist/src/agent/routes/chat.test.js.map +1 -0
- package/dist/src/agent/routes/inspect.d.ts +12 -0
- package/dist/src/agent/routes/inspect.js +40 -0
- package/dist/src/agent/routes/inspect.js.map +1 -0
- package/dist/src/agent/routes/inspect.test.d.ts +6 -0
- package/dist/src/agent/routes/inspect.test.js +80 -0
- package/dist/src/agent/routes/inspect.test.js.map +1 -0
- package/dist/src/agent/routes/stores.d.ts +20 -0
- package/dist/src/agent/routes/stores.js +137 -0
- package/dist/src/agent/routes/stores.js.map +1 -0
- package/dist/src/agent/routes/stores.test.d.ts +6 -0
- package/dist/src/agent/routes/stores.test.js +191 -0
- package/dist/src/agent/routes/stores.test.js.map +1 -0
- package/dist/src/agent/routes/task.d.ts +11 -0
- package/dist/src/agent/routes/task.js +116 -0
- package/dist/src/agent/routes/task.js.map +1 -0
- package/dist/src/agent/routes/task.test.d.ts +6 -0
- package/dist/src/agent/routes/task.test.js +91 -0
- package/dist/src/agent/routes/task.test.js.map +1 -0
- package/dist/src/agent/routes/webhooks.d.ts +17 -0
- package/dist/src/agent/routes/webhooks.js +53 -0
- package/dist/src/agent/routes/webhooks.js.map +1 -0
- package/dist/src/agent/routes/webhooks.test.d.ts +6 -0
- package/dist/src/agent/routes/webhooks.test.js +100 -0
- package/dist/src/agent/routes/webhooks.test.js.map +1 -0
- package/dist/src/agent/session-manager.d.ts +72 -0
- package/dist/src/agent/session-manager.js +214 -0
- package/dist/src/agent/session-manager.js.map +1 -0
- package/dist/src/agent/session-manager.test.d.ts +6 -0
- package/dist/src/agent/session-manager.test.js +145 -0
- package/dist/src/agent/session-manager.test.js.map +1 -0
- package/dist/src/agent/shell-executor-local.d.ts +16 -0
- package/dist/src/agent/shell-executor-local.js +51 -0
- package/dist/src/agent/shell-executor-local.js.map +1 -0
- package/dist/src/agent/shell-executor-local.test.d.ts +6 -0
- package/dist/src/agent/shell-executor-local.test.js +46 -0
- package/dist/src/agent/shell-executor-local.test.js.map +1 -0
- package/dist/src/agent/snapshot-server.d.ts +38 -0
- package/dist/src/agent/snapshot-server.js +114 -0
- package/dist/src/agent/snapshot-server.js.map +1 -0
- package/dist/src/agent/stores-e2e.test.d.ts +6 -0
- package/dist/src/agent/stores-e2e.test.js +433 -0
- package/dist/src/agent/stores-e2e.test.js.map +1 -0
- package/dist/src/agent/tool-context-builder.d.ts +11 -0
- package/dist/src/agent/tool-context-builder.js +84 -0
- package/dist/src/agent/tool-context-builder.js.map +1 -0
- package/dist/src/agent/tool-context-builder.test.d.ts +6 -0
- package/dist/src/agent/tool-context-builder.test.js +152 -0
- package/dist/src/agent/tool-context-builder.test.js.map +1 -0
- package/dist/src/agent/tool-executor-local.d.ts +15 -0
- package/dist/src/agent/tool-executor-local.js +74 -0
- package/dist/src/agent/tool-executor-local.js.map +1 -0
- package/dist/src/agent/tool-executor-local.test.d.ts +6 -0
- package/dist/src/agent/tool-executor-local.test.js +116 -0
- package/dist/src/agent/tool-executor-local.test.js.map +1 -0
- package/dist/src/agent/tool-harness-template.d.ts +23 -0
- package/dist/src/agent/tool-harness-template.js +94 -0
- package/dist/src/agent/tool-harness-template.js.map +1 -0
- package/dist/src/agent/user-context-fetcher.d.ts +25 -0
- package/dist/src/agent/user-context-fetcher.js +79 -0
- package/dist/src/agent/user-context-fetcher.js.map +1 -0
- package/dist/src/agent/user-context-fetcher.test.d.ts +6 -0
- package/dist/src/agent/user-context-fetcher.test.js +121 -0
- package/dist/src/agent/user-context-fetcher.test.js.map +1 -0
- package/dist/src/audit/audit-client.d.ts +46 -0
- package/dist/src/audit/audit-client.js +83 -0
- package/dist/src/audit/audit-client.js.map +1 -0
- package/dist/src/cron/heartbeat-runner.d.ts +24 -0
- package/dist/src/cron/heartbeat-runner.js +87 -0
- package/dist/src/cron/heartbeat-runner.js.map +1 -0
- package/dist/src/cron/heartbeat-runner.test.d.ts +6 -0
- package/dist/src/cron/heartbeat-runner.test.js +120 -0
- package/dist/src/cron/heartbeat-runner.test.js.map +1 -0
- package/dist/src/cron/heartbeat-scheduler.d.ts +26 -0
- package/dist/src/cron/heartbeat-scheduler.js +54 -0
- package/dist/src/cron/heartbeat-scheduler.js.map +1 -0
- package/dist/src/cron/heartbeat-scheduler.test.d.ts +6 -0
- package/dist/src/cron/heartbeat-scheduler.test.js +61 -0
- package/dist/src/cron/heartbeat-scheduler.test.js.map +1 -0
- package/dist/src/index.d.ts +24 -0
- package/dist/src/index.js +118 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/middleware/auth.d.ts +40 -0
- package/dist/src/middleware/auth.js +135 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/middleware/auth.test.d.ts +6 -0
- package/dist/src/middleware/auth.test.js +268 -0
- package/dist/src/middleware/auth.test.js.map +1 -0
- package/dist/src/middleware/error-handler.d.ts +20 -0
- package/dist/src/middleware/error-handler.js +48 -0
- package/dist/src/middleware/error-handler.js.map +1 -0
- package/dist/src/middleware/error-handler.test.d.ts +6 -0
- package/dist/src/middleware/error-handler.test.js +68 -0
- package/dist/src/middleware/error-handler.test.js.map +1 -0
- package/dist/src/middleware/request-validation.d.ts +13 -0
- package/dist/src/middleware/request-validation.js +26 -0
- package/dist/src/middleware/request-validation.js.map +1 -0
- package/dist/src/middleware/request-validation.test.d.ts +6 -0
- package/dist/src/middleware/request-validation.test.js +57 -0
- package/dist/src/middleware/request-validation.test.js.map +1 -0
- package/dist/src/output/email-output.d.ts +10 -0
- package/dist/src/output/email-output.js +12 -0
- package/dist/src/output/email-output.js.map +1 -0
- package/dist/src/output/output-router.d.ts +12 -0
- package/dist/src/output/output-router.js +36 -0
- package/dist/src/output/output-router.js.map +1 -0
- package/dist/src/output/output-router.test.d.ts +6 -0
- package/dist/src/output/output-router.test.js +132 -0
- package/dist/src/output/output-router.test.js.map +1 -0
- package/dist/src/output/slack-output.d.ts +10 -0
- package/dist/src/output/slack-output.js +54 -0
- package/dist/src/output/slack-output.js.map +1 -0
- package/dist/src/output/webhook-output.d.ts +10 -0
- package/dist/src/output/webhook-output.js +25 -0
- package/dist/src/output/webhook-output.js.map +1 -0
- package/dist/src/routes/ai-stream.d.ts +159 -0
- package/dist/src/routes/ai-stream.js +309 -0
- package/dist/src/routes/ai-stream.js.map +1 -0
- package/dist/src/routes/ai-stream.test.d.ts +6 -0
- package/dist/src/routes/ai-stream.test.js +586 -0
- package/dist/src/routes/ai-stream.test.js.map +1 -0
- package/dist/src/routes/ask-user-response.d.ts +30 -0
- package/dist/src/routes/ask-user-response.js +61 -0
- package/dist/src/routes/ask-user-response.js.map +1 -0
- package/dist/src/routes/ask-user-response.test.d.ts +6 -0
- package/dist/src/routes/ask-user-response.test.js +88 -0
- package/dist/src/routes/ask-user-response.test.js.map +1 -0
- package/dist/src/routes/chat-stream.d.ts +14 -0
- package/dist/src/routes/chat-stream.js +84 -0
- package/dist/src/routes/chat-stream.js.map +1 -0
- package/dist/src/routes/chat-stream.test.d.ts +6 -0
- package/dist/src/routes/chat-stream.test.js +155 -0
- package/dist/src/routes/chat-stream.test.js.map +1 -0
- package/dist/src/routes/chat.d.ts +13 -0
- package/dist/src/routes/chat.js +55 -0
- package/dist/src/routes/chat.js.map +1 -0
- package/dist/src/routes/chat.test.d.ts +6 -0
- package/dist/src/routes/chat.test.js +99 -0
- package/dist/src/routes/chat.test.js.map +1 -0
- package/dist/src/routes/health.d.ts +13 -0
- package/dist/src/routes/health.js +23 -0
- package/dist/src/routes/health.js.map +1 -0
- package/dist/src/routes/health.test.d.ts +6 -0
- package/dist/src/routes/health.test.js +45 -0
- package/dist/src/routes/health.test.js.map +1 -0
- package/dist/src/routes/sessions.d.ts +14 -0
- package/dist/src/routes/sessions.js +82 -0
- package/dist/src/routes/sessions.js.map +1 -0
- package/dist/src/routes/webhooks.d.ts +13 -0
- package/dist/src/routes/webhooks.js +43 -0
- package/dist/src/routes/webhooks.js.map +1 -0
- package/dist/src/routes/webhooks.test.d.ts +6 -0
- package/dist/src/routes/webhooks.test.js +80 -0
- package/dist/src/routes/webhooks.test.js.map +1 -0
- package/dist/src/routes/widget-actions.d.ts +49 -0
- package/dist/src/routes/widget-actions.js +78 -0
- package/dist/src/routes/widget-actions.js.map +1 -0
- package/dist/src/server.d.ts +31 -0
- package/dist/src/server.js +129 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/server.test.d.ts +6 -0
- package/dist/src/server.test.js +153 -0
- package/dist/src/server.test.js.map +1 -0
- package/dist/src/session/history-converter.d.ts +21 -0
- package/dist/src/session/history-converter.js +59 -0
- package/dist/src/session/history-converter.js.map +1 -0
- package/dist/src/session/history-converter.test.d.ts +6 -0
- package/dist/src/session/history-converter.test.js +130 -0
- package/dist/src/session/history-converter.test.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +117 -0
- package/dist/src/session/session-manager.js +480 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/session-manager.test.d.ts +6 -0
- package/dist/src/session/session-manager.test.js +586 -0
- package/dist/src/session/session-manager.test.js.map +1 -0
- package/dist/src/session/session-runner.d.ts +30 -0
- package/dist/src/session/session-runner.js +771 -0
- package/dist/src/session/session-runner.js.map +1 -0
- package/dist/src/session/session-runner.test.d.ts +6 -0
- package/dist/src/session/session-runner.test.js +842 -0
- package/dist/src/session/session-runner.test.js.map +1 -0
- package/dist/src/stores/index.d.ts +8 -0
- package/dist/src/stores/index.js +9 -0
- package/dist/src/stores/index.js.map +1 -0
- package/dist/src/stores/key-resolver.d.ts +21 -0
- package/dist/src/stores/key-resolver.js +30 -0
- package/dist/src/stores/key-resolver.js.map +1 -0
- package/dist/src/stores/key-resolver.test.d.ts +6 -0
- package/dist/src/stores/key-resolver.test.js +31 -0
- package/dist/src/stores/key-resolver.test.js.map +1 -0
- package/dist/src/stores/pglite-store-backend.d.ts +36 -0
- package/dist/src/stores/pglite-store-backend.js +227 -0
- package/dist/src/stores/pglite-store-backend.js.map +1 -0
- package/dist/src/stores/pglite-store-backend.test.d.ts +6 -0
- package/dist/src/stores/pglite-store-backend.test.js +150 -0
- package/dist/src/stores/pglite-store-backend.test.js.map +1 -0
- package/dist/src/stores/ttl-resolver.d.ts +24 -0
- package/dist/src/stores/ttl-resolver.js +64 -0
- package/dist/src/stores/ttl-resolver.js.map +1 -0
- package/dist/src/stores/ttl-resolver.test.d.ts +6 -0
- package/dist/src/stores/ttl-resolver.test.js +68 -0
- package/dist/src/stores/ttl-resolver.test.js.map +1 -0
- package/dist/src/types.d.ts +227 -0
- package/dist/src/types.js +50 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/types.test.d.ts +6 -0
- package/dist/src/types.test.js +68 -0
- package/dist/src/types.test.js.map +1 -0
- package/dist/src/utils/jwt-verify.d.ts +20 -0
- package/dist/src/utils/jwt-verify.js +34 -0
- package/dist/src/utils/jwt-verify.js.map +1 -0
- package/dist/src/utils/jwt-verify.test.d.ts +6 -0
- package/dist/src/utils/jwt-verify.test.js +156 -0
- package/dist/src/utils/jwt-verify.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { AmodalConfig, Scheduler, ROOT_SCHEDULER_ID, ApprovalMode, PolicyDecision, AgentSDK, buildDefaultPrompt, } from '@amodalai/core';
|
|
8
|
+
import { convertSessionMessagesToHistory } from './history-converter.js';
|
|
9
|
+
const DEFAULT_TTL_MS = 30 * 60 * 1000; // 30 minutes
|
|
10
|
+
const DEFAULT_CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
11
|
+
const ASK_USER_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
12
|
+
export class SessionManager {
|
|
13
|
+
sessions = new Map();
|
|
14
|
+
baseParams;
|
|
15
|
+
ttlMs;
|
|
16
|
+
platformApiUrl;
|
|
17
|
+
cleanupTimer = null;
|
|
18
|
+
/** Deduplicates concurrent hydration requests for the same conversation */
|
|
19
|
+
pendingHydrations = new Map();
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.baseParams = options.baseParams;
|
|
22
|
+
this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
23
|
+
this.platformApiUrl = options.platformApiUrl;
|
|
24
|
+
const cleanupIntervalMs = options.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS;
|
|
25
|
+
this.cleanupTimer = setInterval(() => void this.cleanup(), cleanupIntervalMs);
|
|
26
|
+
// Don't keep the process alive just for cleanup
|
|
27
|
+
this.cleanupTimer.unref();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a new session with optional role override and auth context.
|
|
31
|
+
* When auth context is provided, the session is configured with
|
|
32
|
+
* the caller's API key and org/app/tenant context.
|
|
33
|
+
*/
|
|
34
|
+
async create(role, auth, sessionType, pinnedModel, deployId) {
|
|
35
|
+
const sessionId = randomUUID();
|
|
36
|
+
const sessionParams = {
|
|
37
|
+
...this.baseParams,
|
|
38
|
+
sessionId,
|
|
39
|
+
approvalMode: ApprovalMode.YOLO,
|
|
40
|
+
interactive: false,
|
|
41
|
+
noBrowser: true,
|
|
42
|
+
// Disable all upstream Gemini CLI tools by default.
|
|
43
|
+
// Only Amodal platform tools (request, present, etc.) are registered.
|
|
44
|
+
coreTools: [],
|
|
45
|
+
policyEngineConfig: {
|
|
46
|
+
approvalMode: ApprovalMode.YOLO,
|
|
47
|
+
defaultDecision: PolicyDecision.ALLOW,
|
|
48
|
+
rules: [
|
|
49
|
+
// Global ALLOW at high priority — overrides any TOML rules
|
|
50
|
+
// that might require ASK_USER (which fails in non-interactive mode)
|
|
51
|
+
{ decision: PolicyDecision.ALLOW, priority: 9999 },
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
if (role) {
|
|
56
|
+
sessionParams.activeRole = role;
|
|
57
|
+
}
|
|
58
|
+
let config;
|
|
59
|
+
// Platform session: use AgentSDK to fetch KB docs, org details, secrets
|
|
60
|
+
if (auth?.token && this.platformApiUrl) {
|
|
61
|
+
process.stderr.write(`[SESSION] Creating platform session: app=${auth.applicationId}, tenant=${auth.tenantId}, ` +
|
|
62
|
+
`org=${auth.orgId}, key=${auth.token.slice(0, 12)}..., sessionType=${sessionType ?? '(none)'}\n`);
|
|
63
|
+
const sdk = new AgentSDK({
|
|
64
|
+
platform: {
|
|
65
|
+
apiUrl: this.platformApiUrl,
|
|
66
|
+
apiKey: auth.token, // JWT or ak_ key — both work as Bearer tokens
|
|
67
|
+
},
|
|
68
|
+
applicationId: auth.applicationId,
|
|
69
|
+
tenantId: auth.tenantId,
|
|
70
|
+
// base_prompt and agent_context fetched from application record during SDK initialize
|
|
71
|
+
activeRole: role,
|
|
72
|
+
sessionType,
|
|
73
|
+
deployId,
|
|
74
|
+
},
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- AmodalConfigParameters → Record for AgentSDK constructor
|
|
76
|
+
sessionParams);
|
|
77
|
+
await sdk.initialize();
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- AgentSDK returns AmodalConfig
|
|
79
|
+
config = sdk.getConfig();
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Non-platform session: use Config directly
|
|
83
|
+
if (auth && this.platformApiUrl) {
|
|
84
|
+
sessionParams.platformApiUrl = this.platformApiUrl;
|
|
85
|
+
sessionParams.applicationId = auth.applicationId;
|
|
86
|
+
sessionParams.tenantId = auth.tenantId;
|
|
87
|
+
if (auth.apiKey) {
|
|
88
|
+
sessionParams.platformApiKey = auth.apiKey;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
config = new AmodalConfig(sessionParams);
|
|
92
|
+
await config.initialize();
|
|
93
|
+
}
|
|
94
|
+
// Inject tenant secrets as process env vars so shell_exec commands can
|
|
95
|
+
// reference them (e.g. $API_BASE_URL in curl commands). The shell execution
|
|
96
|
+
// service inherits process.env for child processes.
|
|
97
|
+
// Also add secret names to the sanitization allowlist — without this,
|
|
98
|
+
// names like API_KEY get stripped by the /KEY/i pattern.
|
|
99
|
+
const connections = config.getConnections();
|
|
100
|
+
const connKeys = Object.keys(connections).filter((k) => k !== '_secrets');
|
|
101
|
+
process.stderr.write(`[SESSION] connections: ${connKeys.join(', ') || '(none)'}\n`);
|
|
102
|
+
if (sessionType === 'onboarding' && !connections['platform-api']) {
|
|
103
|
+
process.stderr.write(`[SESSION] WARNING: onboarding session has no platform-api connection — ` +
|
|
104
|
+
`the request tool cannot create resources. Check that ADMIN_APP_ID is set ` +
|
|
105
|
+
`and the seed has run.\n`);
|
|
106
|
+
}
|
|
107
|
+
// Tenant secrets are available to tools via session-scoped getSessionEnv()
|
|
108
|
+
// (through ToolContext). They are NOT injected into process.env to prevent
|
|
109
|
+
// cross-tenant secret leakage in multi-session runtimes.
|
|
110
|
+
const secrets = connections['_secrets'];
|
|
111
|
+
if (secrets && typeof secrets === 'object') {
|
|
112
|
+
const secretCount = Object.keys(secrets).length;
|
|
113
|
+
process.stderr.write(`[SESSION] ${secretCount} secrets available via session env\n`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
process.stderr.write(`[SESSION] no _secrets found in connections\n`);
|
|
117
|
+
}
|
|
118
|
+
// Platform tool disabling is now handled entirely via the DB-backed
|
|
119
|
+
// disabled_platform_tools field on the application record. AgentSDK reads
|
|
120
|
+
// this during initialize() and calls config.setDisabledTools().
|
|
121
|
+
// Pinned model (from hydrated session) takes highest priority
|
|
122
|
+
if (pinnedModel) {
|
|
123
|
+
config.setModelConfig({
|
|
124
|
+
provider: pinnedModel.provider,
|
|
125
|
+
model: pinnedModel.model,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Build modelConfig from env vars if not already set by the SDK or pinned model.
|
|
129
|
+
// This enables non-Gemini providers for non-platform sessions.
|
|
130
|
+
// Runtime default: anthropic/claude-sonnet-4-20250514 (matches platform-api default).
|
|
131
|
+
if (!config.getModelConfig()) {
|
|
132
|
+
const llmProvider = process.env['LLM_PROVIDER'] ?? 'anthropic';
|
|
133
|
+
if (llmProvider !== 'google') {
|
|
134
|
+
config.setModelConfig({
|
|
135
|
+
provider: llmProvider,
|
|
136
|
+
model: process.env['MODEL'] ?? 'claude-sonnet-4-20250514',
|
|
137
|
+
baseUrl: process.env['PROVIDER_BASE_URL'],
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Initialize store backend if stores are configured.
|
|
142
|
+
// Must happen before initializeAuth/tool registration so store tools
|
|
143
|
+
// are available when registerAmodalTools runs.
|
|
144
|
+
const stores = config.getStores();
|
|
145
|
+
let storeBackend;
|
|
146
|
+
if (stores.length > 0) {
|
|
147
|
+
try {
|
|
148
|
+
const { PGLiteStoreBackend } = await import('../stores/pglite-store-backend.js');
|
|
149
|
+
const backend = new PGLiteStoreBackend();
|
|
150
|
+
await backend.initialize(stores);
|
|
151
|
+
config.setStoreBackend(backend);
|
|
152
|
+
storeBackend = backend;
|
|
153
|
+
process.stderr.write(`[SESSION] Initialized store backend (${String(stores.length)} store(s))\n`);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
process.stderr.write(`[SESSION] Failed to init store backend: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Initialize the LLM content generator. This must always run — the
|
|
160
|
+
// upstream GeminiClient requires an initialized content generator even
|
|
161
|
+
// when the runtime uses non-Gemini providers (Anthropic, OpenAI).
|
|
162
|
+
await config.initializeAuth();
|
|
163
|
+
const geminiClient = config.getGeminiClient();
|
|
164
|
+
// Override the upstream Gemini CLI system prompt with the Amodal default
|
|
165
|
+
// or the user's custom basePrompt. The upstream prompt is Gemini CLI-specific
|
|
166
|
+
// and not appropriate for the Amodal agent runtime.
|
|
167
|
+
const systemPrompt = config.getBasePrompt() ?? buildDefaultPrompt({
|
|
168
|
+
name: config.getAgentName() ?? 'Amodal Agent',
|
|
169
|
+
description: config.getAgentDescription(),
|
|
170
|
+
agentContext: config.getAgentContext(),
|
|
171
|
+
connectionNames: Object.keys(config.getConnections()).filter((k) => k !== '_secrets'),
|
|
172
|
+
});
|
|
173
|
+
try {
|
|
174
|
+
geminiClient.getChat().setSystemInstruction(systemPrompt);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Chat may not be initialized yet in some edge cases — non-fatal
|
|
178
|
+
}
|
|
179
|
+
// Remove upstream Gemini CLI built-in agents that aren't relevant to Amodal,
|
|
180
|
+
// then register Amodal subagents loaded via the SDK.
|
|
181
|
+
const UPSTREAM_AGENTS_TO_REMOVE = ['codebase_investigator', 'cli_help', 'generalist'];
|
|
182
|
+
try {
|
|
183
|
+
const upstream = config.getUpstreamConfig();
|
|
184
|
+
const agentRegistry = upstream.getAgentRegistry();
|
|
185
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
186
|
+
const registryRaw = agentRegistry;
|
|
187
|
+
const toolRegistry = upstream.getToolRegistry();
|
|
188
|
+
// Remove upstream built-in agents
|
|
189
|
+
for (const name of UPSTREAM_AGENTS_TO_REMOVE) {
|
|
190
|
+
registryRaw.agents.delete(name);
|
|
191
|
+
registryRaw.allDefinitions.delete(name);
|
|
192
|
+
try {
|
|
193
|
+
toolRegistry.unregisterTool(name);
|
|
194
|
+
}
|
|
195
|
+
catch { /* may not exist as tool */ }
|
|
196
|
+
}
|
|
197
|
+
// Register Amodal subagents from the deployment.
|
|
198
|
+
// Bundle subagents (from SDK/platform) override platform defaults with the same name.
|
|
199
|
+
// disabledSubagents from amodal.json config filters out specific agents.
|
|
200
|
+
const bundleSubagents = config.getBundleSubagents();
|
|
201
|
+
const disabledSubagents = new Set(config.getDisabledSubagents());
|
|
202
|
+
for (const sub of bundleSubagents) {
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
204
|
+
const sa = sub;
|
|
205
|
+
// Skip disabled subagents
|
|
206
|
+
if (disabledSubagents.has(sa.name))
|
|
207
|
+
continue;
|
|
208
|
+
const agentDef = {
|
|
209
|
+
kind: 'local',
|
|
210
|
+
name: sa.name,
|
|
211
|
+
displayName: sa.displayName,
|
|
212
|
+
description: sa.description,
|
|
213
|
+
inputConfig: {
|
|
214
|
+
inputSchema: {
|
|
215
|
+
type: 'object',
|
|
216
|
+
properties: {
|
|
217
|
+
request: { type: 'string', description: `The task for the ${sa.displayName} agent.` },
|
|
218
|
+
},
|
|
219
|
+
required: ['request'],
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
modelConfig: { model: 'inherit' },
|
|
223
|
+
promptConfig: { systemPrompt: sa.prompt },
|
|
224
|
+
runConfig: { maxSteps: 15 },
|
|
225
|
+
toolConfig: sa.tools ? { tools: sa.tools } : undefined,
|
|
226
|
+
};
|
|
227
|
+
registryRaw.agents.set(sa.name, agentDef);
|
|
228
|
+
registryRaw.allDefinitions.set(sa.name, agentDef);
|
|
229
|
+
}
|
|
230
|
+
// Re-register all agents as SubagentTools so the LLM can invoke them
|
|
231
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
232
|
+
const configWithSubagents = upstream;
|
|
233
|
+
if (typeof configWithSubagents.registerSubAgentTools === 'function') {
|
|
234
|
+
configWithSubagents.registerSubAgentTools(toolRegistry);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Non-fatal — registry may not be initialized
|
|
239
|
+
}
|
|
240
|
+
// Register store tools on the upstream tool registry.
|
|
241
|
+
// This happens after config.initialize() (which ran registerAmodalTools),
|
|
242
|
+
// so we need to register them separately here.
|
|
243
|
+
if (storeBackend && stores.length > 0) {
|
|
244
|
+
try {
|
|
245
|
+
const { StoreWriteTool, StoreQueryTool } = await import('@amodalai/core');
|
|
246
|
+
const upstream = config.getUpstreamConfig();
|
|
247
|
+
const toolRegistry = upstream.getToolRegistry();
|
|
248
|
+
const messageBus = config.getMessageBus();
|
|
249
|
+
const tenantId = config.getTenantId() ?? 'default';
|
|
250
|
+
for (const store of stores) {
|
|
251
|
+
toolRegistry.registerTool(
|
|
252
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- tool types match upstream interface
|
|
253
|
+
new StoreWriteTool(store, storeBackend, tenantId, messageBus));
|
|
254
|
+
}
|
|
255
|
+
toolRegistry.registerTool(
|
|
256
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
257
|
+
new StoreQueryTool(stores, storeBackend, tenantId, messageBus));
|
|
258
|
+
// Refresh the GeminiClient's tool list so the LLM sees the new tools
|
|
259
|
+
await geminiClient.setTools();
|
|
260
|
+
process.stderr.write(`[SESSION] Registered ${String(stores.length)} store tool(s) + query_store\n`);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
process.stderr.write(`[SESSION] Failed to register store tools: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const scheduler = new Scheduler({
|
|
267
|
+
config: config.getUpstreamConfig(),
|
|
268
|
+
messageBus: config.getMessageBus(),
|
|
269
|
+
getPreferredEditor: () => undefined,
|
|
270
|
+
schedulerId: ROOT_SCHEDULER_ID,
|
|
271
|
+
});
|
|
272
|
+
const now = Date.now();
|
|
273
|
+
const mc = config.getModelConfig();
|
|
274
|
+
const session = {
|
|
275
|
+
id: sessionId,
|
|
276
|
+
config,
|
|
277
|
+
geminiClient,
|
|
278
|
+
scheduler,
|
|
279
|
+
createdAt: now,
|
|
280
|
+
lastAccessedAt: now,
|
|
281
|
+
orgId: auth?.orgId,
|
|
282
|
+
sessionType,
|
|
283
|
+
pendingAskUser: new Map(),
|
|
284
|
+
accumulatedMessages: [],
|
|
285
|
+
model: mc?.model ?? config.getModel(),
|
|
286
|
+
provider: mc?.provider,
|
|
287
|
+
storeBackend,
|
|
288
|
+
};
|
|
289
|
+
this.sessions.set(sessionId, session);
|
|
290
|
+
return session;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Get an existing session by ID, updating its last-accessed timestamp.
|
|
294
|
+
* Returns undefined if the session doesn't exist.
|
|
295
|
+
*/
|
|
296
|
+
get(id) {
|
|
297
|
+
const session = this.sessions.get(id);
|
|
298
|
+
if (session) {
|
|
299
|
+
session.lastAccessedAt = Date.now();
|
|
300
|
+
}
|
|
301
|
+
return session;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Hydrate a session from stored conversation history in the platform API.
|
|
305
|
+
*
|
|
306
|
+
* When a user sends a message to a session that expired from the in-memory
|
|
307
|
+
* cache, this method fetches the conversation from the DB, creates a fresh
|
|
308
|
+
* runtime session (new config, tools, KB, secrets), seeds its LLM history
|
|
309
|
+
* with the stored messages, and registers it under the original conversation ID.
|
|
310
|
+
*
|
|
311
|
+
* Returns null if hydration cannot proceed (no platform API, missing auth,
|
|
312
|
+
* fetch failure, or no stored messages).
|
|
313
|
+
*/
|
|
314
|
+
async hydrate(conversationId, role, auth, sessionType) {
|
|
315
|
+
// Guard: need platform API and auth to fetch stored conversation
|
|
316
|
+
if (!this.platformApiUrl)
|
|
317
|
+
return null;
|
|
318
|
+
if (!auth?.tenantId || !auth.token)
|
|
319
|
+
return null;
|
|
320
|
+
// Deduplicate concurrent hydration requests for the same conversation
|
|
321
|
+
const pending = this.pendingHydrations.get(conversationId);
|
|
322
|
+
if (pending)
|
|
323
|
+
return pending;
|
|
324
|
+
const hydrationPromise = this.doHydrate(conversationId, role, auth, sessionType);
|
|
325
|
+
this.pendingHydrations.set(conversationId, hydrationPromise);
|
|
326
|
+
try {
|
|
327
|
+
return await hydrationPromise;
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
this.pendingHydrations.delete(conversationId);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async doHydrate(conversationId, role, auth, sessionType) {
|
|
334
|
+
// Fetch stored conversation from platform-api
|
|
335
|
+
const url = `${this.platformApiUrl}/api/tenants/${auth.tenantId}/sessions/${conversationId}`;
|
|
336
|
+
let record;
|
|
337
|
+
try {
|
|
338
|
+
const controller = new AbortController();
|
|
339
|
+
const timer = setTimeout(() => controller.abort(), 10_000);
|
|
340
|
+
const response = await fetch(url, {
|
|
341
|
+
signal: controller.signal,
|
|
342
|
+
headers: {
|
|
343
|
+
Authorization: `Bearer ${auth.token}`,
|
|
344
|
+
Accept: 'application/json',
|
|
345
|
+
},
|
|
346
|
+
});
|
|
347
|
+
clearTimeout(timer);
|
|
348
|
+
if (!response.ok) {
|
|
349
|
+
process.stderr.write(`[HYDRATE] Failed to fetch conversation ${conversationId}: HTTP ${response.status}\n`);
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- API response shape
|
|
353
|
+
record = (await response.json());
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
process.stderr.write(`[HYDRATE] Error fetching conversation ${conversationId}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
// No messages → nothing to hydrate
|
|
360
|
+
if (!record.messages || record.messages.length === 0)
|
|
361
|
+
return null;
|
|
362
|
+
// Create a fully initialized session (fresh config, tools, KB, secrets).
|
|
363
|
+
// Pin the model/provider from the original session so it survives model changes.
|
|
364
|
+
const pinnedModel = record.model && record.provider
|
|
365
|
+
? { provider: record.provider, model: record.model }
|
|
366
|
+
: undefined;
|
|
367
|
+
const session = await this.create(role, auth, sessionType, pinnedModel);
|
|
368
|
+
// Remove auto-generated ID from the Map, re-register under the original conversationId
|
|
369
|
+
this.sessions.delete(session.id);
|
|
370
|
+
session.id = conversationId;
|
|
371
|
+
this.sessions.set(conversationId, session);
|
|
372
|
+
// Convert stored messages to Gemini Content[] and seed LLM history
|
|
373
|
+
const history = convertSessionMessagesToHistory(record.messages);
|
|
374
|
+
if (history.length > 0) {
|
|
375
|
+
session.geminiClient.setHistory(history);
|
|
376
|
+
}
|
|
377
|
+
// Pre-populate accumulatedMessages so saveSessionHistory() appends correctly
|
|
378
|
+
session.accumulatedMessages = [...record.messages];
|
|
379
|
+
process.stderr.write(`[HYDRATE] Hydrated conversation ${conversationId} with ${record.messages.length} messages (${history.length} history entries)\n`);
|
|
380
|
+
return session;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Destroy a session, flushing its audit log.
|
|
384
|
+
*/
|
|
385
|
+
async destroy(id) {
|
|
386
|
+
const session = this.sessions.get(id);
|
|
387
|
+
if (!session)
|
|
388
|
+
return;
|
|
389
|
+
this.sessions.delete(id);
|
|
390
|
+
if (session.storeBackend) {
|
|
391
|
+
try {
|
|
392
|
+
await session.storeBackend.close();
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
// Best-effort — PGLite may already be closed
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
await session.config.shutdownAudit();
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Remove sessions that have been idle longer than the TTL.
|
|
402
|
+
*/
|
|
403
|
+
async cleanup() {
|
|
404
|
+
const now = Date.now();
|
|
405
|
+
const expired = [];
|
|
406
|
+
for (const [id, session] of this.sessions) {
|
|
407
|
+
if (now - session.lastAccessedAt > this.ttlMs) {
|
|
408
|
+
expired.push(id);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
for (const id of expired) {
|
|
412
|
+
await this.destroy(id);
|
|
413
|
+
}
|
|
414
|
+
return expired.length;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Shutdown all sessions and stop the cleanup timer.
|
|
418
|
+
*/
|
|
419
|
+
async shutdown() {
|
|
420
|
+
if (this.cleanupTimer) {
|
|
421
|
+
clearInterval(this.cleanupTimer);
|
|
422
|
+
this.cleanupTimer = null;
|
|
423
|
+
}
|
|
424
|
+
const ids = [...this.sessions.keys()];
|
|
425
|
+
for (const id of ids) {
|
|
426
|
+
await this.destroy(id);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Wait for a user's response to an ask_user prompt.
|
|
431
|
+
* Resolves when the user submits answers via the HTTP endpoint.
|
|
432
|
+
* Rejects on timeout or if the signal is aborted.
|
|
433
|
+
*/
|
|
434
|
+
waitForAskUserResponse(session, askId, signal) {
|
|
435
|
+
return new Promise((resolve, reject) => {
|
|
436
|
+
const timer = setTimeout(() => {
|
|
437
|
+
session.pendingAskUser.delete(askId);
|
|
438
|
+
reject(new Error('ask_user response timed out'));
|
|
439
|
+
}, ASK_USER_TIMEOUT_MS);
|
|
440
|
+
const onAbort = () => {
|
|
441
|
+
clearTimeout(timer);
|
|
442
|
+
session.pendingAskUser.delete(askId);
|
|
443
|
+
reject(new Error('ask_user aborted'));
|
|
444
|
+
};
|
|
445
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
446
|
+
session.pendingAskUser.set(askId, {
|
|
447
|
+
resolve: (answers) => {
|
|
448
|
+
clearTimeout(timer);
|
|
449
|
+
signal.removeEventListener('abort', onAbort);
|
|
450
|
+
session.pendingAskUser.delete(askId);
|
|
451
|
+
resolve(answers);
|
|
452
|
+
},
|
|
453
|
+
reject: (reason) => {
|
|
454
|
+
clearTimeout(timer);
|
|
455
|
+
signal.removeEventListener('abort', onAbort);
|
|
456
|
+
session.pendingAskUser.delete(askId);
|
|
457
|
+
reject(reason);
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Resolve a pending ask_user with user-provided answers.
|
|
464
|
+
* Returns true if the ask_id was found and resolved, false otherwise.
|
|
465
|
+
*/
|
|
466
|
+
resolveAskUser(session, askId, answers) {
|
|
467
|
+
const pending = session.pendingAskUser.get(askId);
|
|
468
|
+
if (!pending)
|
|
469
|
+
return false;
|
|
470
|
+
pending.resolve(answers);
|
|
471
|
+
return true;
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Number of active sessions.
|
|
475
|
+
*/
|
|
476
|
+
get size() {
|
|
477
|
+
return this.sessions.size;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|