@undefineds.co/xpod 0.3.1 → 0.3.4
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/config/cli.json +1 -1
- package/config/local.json +8 -8
- package/config/resolver.json +2 -2
- package/config/xpod.json +8 -8
- package/dist/api/chatkit/service.js +3 -9
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/container/common.js +1 -0
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/routes.js +1 -1
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/handlers/InngestHandler.js +8 -0
- package/dist/api/handlers/InngestHandler.js.map +1 -1
- package/dist/api/runs/EmbeddedInngestService.d.ts +5 -4
- package/dist/api/runs/EmbeddedInngestService.js +18 -6
- package/dist/api/runs/EmbeddedInngestService.js.map +1 -1
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +1 -0
- package/dist/api/runs/InngestRunExecutionBackend.js +1 -1
- package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -1
- package/dist/api/runs/RunStateCenter.js +2 -5
- package/dist/api/runs/RunStateCenter.js.map +1 -1
- package/dist/api/runtime.js +6 -1
- package/dist/api/runtime.js.map +1 -1
- package/dist/cli/commands/start.js +20 -20
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/components/context.jsonld +8 -8
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
- package/dist/main.js +22 -19
- package/dist/main.js.map +1 -1
- package/dist/runtime/bootstrap.js +1 -1
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/css-process.d.ts +24 -0
- package/dist/runtime/css-process.js +52 -0
- package/dist/runtime/css-process.js.map +1 -0
- package/package.json +2 -2
|
@@ -47,28 +47,32 @@ class EmbeddedInngestService {
|
|
|
47
47
|
if (this.config) {
|
|
48
48
|
return this.config;
|
|
49
49
|
}
|
|
50
|
+
if (this.options.enabled === false || !this.isConfigured()) {
|
|
51
|
+
this.config = {
|
|
52
|
+
enabled: false,
|
|
53
|
+
durableDelivery: false,
|
|
54
|
+
};
|
|
55
|
+
this.logger.info('Embedded Inngest disabled by config');
|
|
56
|
+
return this.config;
|
|
57
|
+
}
|
|
50
58
|
const mode = this.options.mode ?? (this.options.edition === 'cloud' ? 'managed' : 'spawn');
|
|
51
59
|
if ((this.options.edition === 'cloud' || mode === 'managed') && (!this.options.eventKey || !this.options.signingKey)) {
|
|
52
60
|
throw new Error('Managed/cloud Inngest requires explicit eventKey and signingKey');
|
|
53
61
|
}
|
|
54
62
|
const eventKey = this.options.eventKey || 'xpod-local-event-key';
|
|
55
|
-
const signingKey = this.options.signingKey || '
|
|
63
|
+
const signingKey = this.options.signingKey || '78706f642d6c6f63616c2d7369676e696e672d6b6579';
|
|
56
64
|
const host = this.options.host || '127.0.0.1';
|
|
57
65
|
const port = this.options.port ?? (mode === 'spawn' ? await (0, runtime_1.getFreePort)(8288, host) : 8288);
|
|
58
66
|
const baseUrl = this.options.baseUrl || (mode === 'spawn' ? `http://${host}:${port}` : 'http://xpod-inngest:8288');
|
|
59
67
|
const functionEndpoint = new URL(this.options.apiPath ?? '/api/inngest', this.options.apiBaseUrl).toString();
|
|
60
68
|
this.config = {
|
|
61
|
-
enabled:
|
|
69
|
+
enabled: true,
|
|
62
70
|
durableDelivery: false,
|
|
63
71
|
baseUrl,
|
|
64
72
|
eventKey,
|
|
65
73
|
signingKey,
|
|
66
74
|
functionEndpoint,
|
|
67
75
|
};
|
|
68
|
-
if (this.options.enabled === false) {
|
|
69
|
-
this.logger.info('Embedded Inngest disabled by config');
|
|
70
|
-
return this.config;
|
|
71
|
-
}
|
|
72
76
|
if (mode === 'managed') {
|
|
73
77
|
this.config.durableDelivery = this.config.enabled;
|
|
74
78
|
this.logger.info(`Using managed embedded Inngest at ${baseUrl}, function endpoint ${functionEndpoint}`);
|
|
@@ -195,6 +199,14 @@ class EmbeddedInngestService {
|
|
|
195
199
|
env.INNGEST_SQLITE_DIR = sqliteDir;
|
|
196
200
|
return env;
|
|
197
201
|
}
|
|
202
|
+
isConfigured() {
|
|
203
|
+
return Boolean(this.options.mode
|
|
204
|
+
|| this.options.baseUrl
|
|
205
|
+
|| this.options.eventKey
|
|
206
|
+
|| this.options.signingKey
|
|
207
|
+
|| this.options.binaryPath
|
|
208
|
+
|| this.options.sqliteDir);
|
|
209
|
+
}
|
|
198
210
|
isPostgresUrl(value) {
|
|
199
211
|
return value.startsWith('postgres://') || value.startsWith('postgresql://');
|
|
200
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmbeddedInngestService.js","sourceRoot":"","sources":["../../../src/api/runs/EmbeddedInngestService.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { spawn, spawnSync, type ChildProcess } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { getFreePort, PACKAGE_ROOT } from '../../runtime';\n\nexport interface EmbeddedInngestServiceOptions {\n edition: 'cloud' | 'local';\n apiBaseUrl: string;\n apiPath?: string;\n databaseUrl: string;\n redisUrl?: string;\n enabled?: boolean;\n mode?: 'managed' | 'spawn';\n host?: string;\n port?: number;\n baseUrl?: string;\n eventKey?: string;\n signingKey?: string;\n binaryPath?: string;\n sqliteDir?: string;\n}\n\nexport interface EmbeddedInngestRuntimeConfig {\n enabled: boolean;\n durableDelivery: boolean;\n baseUrl: string;\n eventKey: string;\n signingKey: string;\n functionEndpoint: string;\n}\n\n/**\n * Xpod-owned Inngest runtime process.\n *\n * The JS SDK is only the client/function adapter; the durable executor is the\n * Inngest CLI/server. In local mode Xpod may spawn that server as a managed\n * child process. In cloud/cluster mode the deployment supplies a stable\n * cluster-scoped Inngest URL, still owned by the Xpod deployment rather than\n * user-provided SaaS. Xpod Run/RunStep remain the business source of truth.\n */\nexport class EmbeddedInngestService {\n private readonly logger = getLoggerFor(this);\n private readonly options: EmbeddedInngestServiceOptions;\n private child?: ChildProcess;\n private config?: EmbeddedInngestRuntimeConfig;\n\n public constructor(options: EmbeddedInngestServiceOptions) {\n this.options = options;\n }\n\n public async start(): Promise<EmbeddedInngestRuntimeConfig> {\n if (this.config) {\n return this.config;\n }\n\n const mode = this.options.mode ?? (this.options.edition === 'cloud' ? 'managed' : 'spawn');\n if ((this.options.edition === 'cloud' || mode === 'managed') && (!this.options.eventKey || !this.options.signingKey)) {\n throw new Error('Managed/cloud Inngest requires explicit eventKey and signingKey');\n }\n\n const eventKey = this.options.eventKey || 'xpod-local-event-key';\n const signingKey = this.options.signingKey || 'signkey-test-xpod-local-signing-key';\n const host = this.options.host || '127.0.0.1';\n const port = this.options.port ?? (mode === 'spawn' ? await getFreePort(8288, host) : 8288);\n const baseUrl = this.options.baseUrl || (mode === 'spawn' ? `http://${host}:${port}` : 'http://xpod-inngest:8288');\n const functionEndpoint = new URL(this.options.apiPath ?? '/api/inngest', this.options.apiBaseUrl).toString();\n\n this.config = {\n enabled: this.options.enabled !== false,\n durableDelivery: false,\n baseUrl,\n eventKey,\n signingKey,\n functionEndpoint,\n };\n\n if (this.options.enabled === false) {\n this.logger.info('Embedded Inngest disabled by config');\n return this.config;\n }\n\n if (mode === 'managed') {\n this.config.durableDelivery = this.config.enabled;\n this.logger.info(`Using managed embedded Inngest at ${baseUrl}, function endpoint ${functionEndpoint}`);\n return this.config;\n }\n\n const binary = this.resolveUsableBinaryPath();\n if (!binary) {\n this.logger.warn('Embedded Inngest binary not found; Xpod will still expose the function endpoint, but durable delivery is unavailable.');\n return this.config;\n }\n\n const env = this.buildEnvironment({\n baseUrl,\n eventKey,\n signingKey,\n functionEndpoint,\n });\n const args = this.buildArguments(host, port, functionEndpoint);\n\n this.child = spawn(binary, args, {\n cwd: PACKAGE_ROOT,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.child.stdout?.on('data', (chunk) => {\n this.logger.info(`[Inngest] ${String(chunk).trim()}`);\n });\n this.child.stderr?.on('data', (chunk) => {\n this.logger.warn(`[Inngest] ${String(chunk).trim()}`);\n });\n this.child.once('exit', (code, signal) => {\n const message = `Embedded Inngest exited: code=${code ?? 'null'} signal=${signal ?? 'null'}`;\n if (code && code !== 0) {\n this.logger.error(message);\n } else {\n this.logger.info(message);\n }\n this.child = undefined;\n });\n this.child.once('error', (error) => {\n this.logger.error(`Failed to start embedded Inngest: ${error}`);\n this.child = undefined;\n });\n\n this.logger.info(`Embedded Inngest starting at ${baseUrl}, function endpoint ${functionEndpoint}`);\n this.config.durableDelivery = true;\n return this.config;\n }\n\n public async stop(): Promise<void> {\n const child = this.child;\n if (!child) {\n return;\n }\n this.child = undefined;\n\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n child.kill('SIGKILL');\n resolve();\n }, 5_000);\n timer.unref?.();\n\n child.once('exit', () => {\n clearTimeout(timer);\n resolve();\n });\n child.kill('SIGTERM');\n });\n }\n\n private resolveUsableBinaryPath(): string | undefined {\n const configured = this.options.binaryPath;\n if (configured) {\n return this.isUsableBinary(configured) ? configured : undefined;\n }\n\n const candidates = [\n path.join(PACKAGE_ROOT, 'node_modules', '.bin', process.platform === 'win32' ? 'inngest.cmd' : 'inngest'),\n path.join(PACKAGE_ROOT, 'node_modules', 'inngest-cli', 'bin', process.platform === 'win32' ? 'inngest.exe' : 'inngest'),\n 'inngest',\n ];\n\n return candidates.find((candidate) => this.isUsableBinary(candidate));\n }\n\n private isUsableBinary(candidate: string): boolean {\n const isPathLike = candidate.includes('/') || candidate.includes('\\\\');\n if (isPathLike && !fs.existsSync(candidate)) {\n return false;\n }\n\n const result = spawnSync(candidate, ['--help'], {\n cwd: PACKAGE_ROOT,\n env: process.env,\n stdio: 'ignore',\n timeout: 5_000,\n });\n return !result.error && result.status === 0;\n }\n\n private buildArguments(host: string, port: number, functionEndpoint: string): string[] {\n return [\n 'dev',\n '--no-discovery',\n '--host',\n host,\n '--port',\n String(port),\n '-u',\n functionEndpoint,\n ];\n }\n\n private buildEnvironment(config: {\n baseUrl: string;\n eventKey: string;\n signingKey: string;\n functionEndpoint: string;\n }): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n INNGEST_DEV: config.baseUrl,\n INNGEST_BASE_URL: config.baseUrl,\n INNGEST_EVENT_API_BASE_URL: config.baseUrl,\n INNGEST_API_BASE_URL: config.baseUrl,\n INNGEST_EVENT_KEY: config.eventKey,\n INNGEST_SIGNING_KEY: config.signingKey,\n };\n\n if (this.options.edition === 'cloud') {\n if (this.isPostgresUrl(this.options.databaseUrl)) {\n env.INNGEST_POSTGRES_URI = this.options.databaseUrl;\n }\n if (this.options.redisUrl) {\n env.INNGEST_REDIS_URI = this.options.redisUrl;\n }\n return env;\n }\n\n const sqliteDir = this.options.sqliteDir ?? path.join(process.env.CSS_ROOT_FILE_PATH || './data', '.inngest');\n fs.mkdirSync(sqliteDir, { recursive: true });\n env.INNGEST_SQLITE_DIR = sqliteDir;\n return env;\n }\n\n private isPostgresUrl(value: string): boolean {\n return value.startsWith('postgres://') || value.startsWith('postgresql://');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"EmbeddedInngestService.js","sourceRoot":"","sources":["../../../src/api/runs/EmbeddedInngestService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,gDAAkC;AAClC,2DAAyE;AACzE,iEAAqD;AACrD,2CAA0D;AA4B1D;;;;;;;;GAQG;AACH,MAAa,sBAAsB;IAMjC,YAAmB,OAAsC;QALxC,WAAM,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAM3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,GAAG;gBACZ,OAAO,EAAE,KAAK;gBACd,eAAe,EAAE,KAAK;aACvB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACrH,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,sBAAsB,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,8CAA8C,CAAC;QAC7F,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,IAAA,qBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;QACnH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7G,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,KAAK;YACtB,OAAO;YACP,QAAQ;YACR,UAAU;YACV,gBAAgB;SACjB,CAAC;QAEF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,OAAO,uBAAuB,gBAAgB,EAAE,CAAC,CAAC;YACxG,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uHAAuH,CAAC,CAAC;YAC1I,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAChC,OAAO;YACP,QAAQ;YACR,UAAU;YACV,gBAAgB;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAE/D,IAAI,CAAC,KAAK,GAAG,IAAA,0BAAK,EAAC,MAAM,EAAE,IAAI,EAAE;YAC/B,GAAG,EAAE,sBAAY;YACjB,GAAG;YACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,iCAAiC,IAAI,IAAI,MAAM,WAAW,MAAM,IAAI,MAAM,EAAE,CAAC;YAC7F,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,uBAAuB,gBAAgB,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QAEvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAEhB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,uBAAuB;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,CAAC;QAED,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,CAAC,sBAAY,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;YACzG,IAAI,CAAC,IAAI,CAAC,sBAAY,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;YACvH,SAAS;SACV,CAAC;QAEF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,cAAc,CAAC,SAAiB;QACtC,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,8BAAS,EAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;YAC9C,GAAG,EAAE,sBAAY;YACjB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9C,CAAC;IAEO,cAAc,CAAC,IAAY,EAAE,IAAY,EAAE,gBAAwB;QACzE,OAAO;YACL,KAAK;YACL,gBAAgB;YAChB,QAAQ;YACR,IAAI;YACJ,QAAQ;YACR,MAAM,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,MAKxB;QACC,MAAM,GAAG,GAAsB;YAC7B,GAAG,OAAO,CAAC,GAAG;YACd,WAAW,EAAE,MAAM,CAAC,OAAO;YAC3B,gBAAgB,EAAE,MAAM,CAAC,OAAO;YAChC,0BAA0B,EAAE,MAAM,CAAC,OAAO;YAC1C,oBAAoB,EAAE,MAAM,CAAC,OAAO;YACpC,iBAAiB,EAAE,MAAM,CAAC,QAAQ;YAClC,mBAAmB,EAAE,MAAM,CAAC,UAAU;SACvC,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YACtD,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC1B,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChD,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC9G,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,GAAG,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,YAAY;QAClB,OAAO,OAAO,CACZ,IAAI,CAAC,OAAO,CAAC,IAAI;eACd,IAAI,CAAC,OAAO,CAAC,OAAO;eACpB,IAAI,CAAC,OAAO,CAAC,QAAQ;eACrB,IAAI,CAAC,OAAO,CAAC,UAAU;eACvB,IAAI,CAAC,OAAO,CAAC,UAAU;eACvB,IAAI,CAAC,OAAO,CAAC,SAAS,CAC1B,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,OAAO,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAC9E,CAAC;CACF;AA/MD,wDA+MC","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { spawn, spawnSync, type ChildProcess } from 'node:child_process';\nimport { getLoggerFor } from 'global-logger-factory';\nimport { getFreePort, PACKAGE_ROOT } from '../../runtime';\n\nexport interface EmbeddedInngestServiceOptions {\n edition: 'cloud' | 'local';\n apiBaseUrl: string;\n apiPath?: string;\n databaseUrl: string;\n redisUrl?: string;\n enabled?: boolean;\n mode?: 'managed' | 'spawn';\n host?: string;\n port?: number;\n baseUrl?: string;\n eventKey?: string;\n signingKey?: string;\n binaryPath?: string;\n sqliteDir?: string;\n}\n\nexport interface EmbeddedInngestRuntimeConfig {\n enabled: boolean;\n durableDelivery: boolean;\n baseUrl?: string;\n eventKey?: string;\n signingKey?: string;\n functionEndpoint?: string;\n}\n\n/**\n * Xpod-owned Inngest runtime process.\n *\n * The JS SDK is only the client/function adapter; the durable executor is the\n * Inngest CLI/server. In local mode Xpod may spawn that server as a managed\n * child process. In cloud/cluster mode the deployment supplies a stable\n * cluster-scoped Inngest URL, still owned by the Xpod deployment rather than\n * user-provided SaaS. Xpod Run/RunStep remain the business source of truth.\n */\nexport class EmbeddedInngestService {\n private readonly logger = getLoggerFor(this);\n private readonly options: EmbeddedInngestServiceOptions;\n private child?: ChildProcess;\n private config?: EmbeddedInngestRuntimeConfig;\n\n public constructor(options: EmbeddedInngestServiceOptions) {\n this.options = options;\n }\n\n public async start(): Promise<EmbeddedInngestRuntimeConfig> {\n if (this.config) {\n return this.config;\n }\n\n if (this.options.enabled === false || !this.isConfigured()) {\n this.config = {\n enabled: false,\n durableDelivery: false,\n };\n this.logger.info('Embedded Inngest disabled by config');\n return this.config;\n }\n\n const mode = this.options.mode ?? (this.options.edition === 'cloud' ? 'managed' : 'spawn');\n if ((this.options.edition === 'cloud' || mode === 'managed') && (!this.options.eventKey || !this.options.signingKey)) {\n throw new Error('Managed/cloud Inngest requires explicit eventKey and signingKey');\n }\n\n const eventKey = this.options.eventKey || 'xpod-local-event-key';\n const signingKey = this.options.signingKey || '78706f642d6c6f63616c2d7369676e696e672d6b6579';\n const host = this.options.host || '127.0.0.1';\n const port = this.options.port ?? (mode === 'spawn' ? await getFreePort(8288, host) : 8288);\n const baseUrl = this.options.baseUrl || (mode === 'spawn' ? `http://${host}:${port}` : 'http://xpod-inngest:8288');\n const functionEndpoint = new URL(this.options.apiPath ?? '/api/inngest', this.options.apiBaseUrl).toString();\n\n this.config = {\n enabled: true,\n durableDelivery: false,\n baseUrl,\n eventKey,\n signingKey,\n functionEndpoint,\n };\n\n if (mode === 'managed') {\n this.config.durableDelivery = this.config.enabled;\n this.logger.info(`Using managed embedded Inngest at ${baseUrl}, function endpoint ${functionEndpoint}`);\n return this.config;\n }\n\n const binary = this.resolveUsableBinaryPath();\n if (!binary) {\n this.logger.warn('Embedded Inngest binary not found; Xpod will still expose the function endpoint, but durable delivery is unavailable.');\n return this.config;\n }\n\n const env = this.buildEnvironment({\n baseUrl,\n eventKey,\n signingKey,\n functionEndpoint,\n });\n const args = this.buildArguments(host, port, functionEndpoint);\n\n this.child = spawn(binary, args, {\n cwd: PACKAGE_ROOT,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n this.child.stdout?.on('data', (chunk) => {\n this.logger.info(`[Inngest] ${String(chunk).trim()}`);\n });\n this.child.stderr?.on('data', (chunk) => {\n this.logger.warn(`[Inngest] ${String(chunk).trim()}`);\n });\n this.child.once('exit', (code, signal) => {\n const message = `Embedded Inngest exited: code=${code ?? 'null'} signal=${signal ?? 'null'}`;\n if (code && code !== 0) {\n this.logger.error(message);\n } else {\n this.logger.info(message);\n }\n this.child = undefined;\n });\n this.child.once('error', (error) => {\n this.logger.error(`Failed to start embedded Inngest: ${error}`);\n this.child = undefined;\n });\n\n this.logger.info(`Embedded Inngest starting at ${baseUrl}, function endpoint ${functionEndpoint}`);\n this.config.durableDelivery = true;\n return this.config;\n }\n\n public async stop(): Promise<void> {\n const child = this.child;\n if (!child) {\n return;\n }\n this.child = undefined;\n\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n child.kill('SIGKILL');\n resolve();\n }, 5_000);\n timer.unref?.();\n\n child.once('exit', () => {\n clearTimeout(timer);\n resolve();\n });\n child.kill('SIGTERM');\n });\n }\n\n private resolveUsableBinaryPath(): string | undefined {\n const configured = this.options.binaryPath;\n if (configured) {\n return this.isUsableBinary(configured) ? configured : undefined;\n }\n\n const candidates = [\n path.join(PACKAGE_ROOT, 'node_modules', '.bin', process.platform === 'win32' ? 'inngest.cmd' : 'inngest'),\n path.join(PACKAGE_ROOT, 'node_modules', 'inngest-cli', 'bin', process.platform === 'win32' ? 'inngest.exe' : 'inngest'),\n 'inngest',\n ];\n\n return candidates.find((candidate) => this.isUsableBinary(candidate));\n }\n\n private isUsableBinary(candidate: string): boolean {\n const isPathLike = candidate.includes('/') || candidate.includes('\\\\');\n if (isPathLike && !fs.existsSync(candidate)) {\n return false;\n }\n\n const result = spawnSync(candidate, ['--help'], {\n cwd: PACKAGE_ROOT,\n env: process.env,\n stdio: 'ignore',\n timeout: 5_000,\n });\n return !result.error && result.status === 0;\n }\n\n private buildArguments(host: string, port: number, functionEndpoint: string): string[] {\n return [\n 'dev',\n '--no-discovery',\n '--host',\n host,\n '--port',\n String(port),\n '-u',\n functionEndpoint,\n ];\n }\n\n private buildEnvironment(config: {\n baseUrl: string;\n eventKey: string;\n signingKey: string;\n functionEndpoint: string;\n }): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n INNGEST_DEV: config.baseUrl,\n INNGEST_BASE_URL: config.baseUrl,\n INNGEST_EVENT_API_BASE_URL: config.baseUrl,\n INNGEST_API_BASE_URL: config.baseUrl,\n INNGEST_EVENT_KEY: config.eventKey,\n INNGEST_SIGNING_KEY: config.signingKey,\n };\n\n if (this.options.edition === 'cloud') {\n if (this.isPostgresUrl(this.options.databaseUrl)) {\n env.INNGEST_POSTGRES_URI = this.options.databaseUrl;\n }\n if (this.options.redisUrl) {\n env.INNGEST_REDIS_URI = this.options.redisUrl;\n }\n return env;\n }\n\n const sqliteDir = this.options.sqliteDir ?? path.join(process.env.CSS_ROOT_FILE_PATH || './data', '.inngest');\n fs.mkdirSync(sqliteDir, { recursive: true });\n env.INNGEST_SQLITE_DIR = sqliteDir;\n return env;\n }\n\n private isConfigured(): boolean {\n return Boolean(\n this.options.mode\n || this.options.baseUrl\n || this.options.eventKey\n || this.options.signingKey\n || this.options.binaryPath\n || this.options.sqliteDir\n );\n }\n\n private isPostgresUrl(value: string): boolean {\n return value.startsWith('postgres://') || value.startsWith('postgresql://');\n }\n}\n"]}
|
|
@@ -23,6 +23,7 @@ export interface InngestRunExecutionBackendOptions {
|
|
|
23
23
|
baseUrl?: string;
|
|
24
24
|
eventKey?: string;
|
|
25
25
|
signingKey?: string;
|
|
26
|
+
isDev?: boolean;
|
|
26
27
|
runtimeDriver?: RunExecutionBackend;
|
|
27
28
|
store?: ManagedRunStore<StoreContext>;
|
|
28
29
|
managedRunWorker?: ManagedRunWorker<StoreContext>;
|
|
@@ -26,7 +26,7 @@ class InngestRunExecutionBackend {
|
|
|
26
26
|
baseUrl: options.baseUrl,
|
|
27
27
|
eventKey: options.eventKey,
|
|
28
28
|
signingKey: options.signingKey,
|
|
29
|
-
isDev:
|
|
29
|
+
isDev: options.isDev ?? !options.durableDelivery,
|
|
30
30
|
});
|
|
31
31
|
this.runtimeDriver = options.runtimeDriver ?? new PiAgentRuntimeDriver_1.PiAgentRuntimeDriver();
|
|
32
32
|
this.managedRunWorker = options.managedRunWorker
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InngestRunExecutionBackend.js","sourceRoot":"","sources":["../../../src/api/runs/InngestRunExecutionBackend.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAIlC,yDAA4E;AAC5E,iEAA8D;AAGjD,QAAA,wBAAwB,GAAG,oBAAoB,CAAC;AAChD,QAAA,iCAAiC,GAAG,6BAA6B,CAAC;AAClE,QAAA,0BAA0B,GAAG,gBAAgB,CAAC;AAgD3D;;;;;;;;;;GAUG;AACH,MAAa,0BAA0B;IAYrC,YAAmB,UAA6C,EAAE;QAJjD,gBAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;QAK3D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,iBAAO,CAAC;YAC1C,EAAE,EAAE,qBAAqB;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,2CAAoB,EAAE,CAAC;QACzE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB;eAC3C,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,mCAAgB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrH,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAC/C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAC/C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAChD;YACE,EAAE,EAAE,kCAA0B;YAC9B,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE;gBACR,EAAE,KAAK,EAAE,gCAAwB,EAAE;gBACnC,EAAE,KAAK,EAAE,yCAAiC,EAAE;aAC7C;YACD,WAAW,EAAE,yBAAyB;SACvC,EACD,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAA4B,CAAC,CAChE,CAAC;IACJ,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,CAAC,KAAK,CAAC,KAAwB;QAC1C,MAAM,KAAK,GAAG,IAAI,cAAc,EAAqB,CAAC;QACtD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,GAAI,KAAwD,CAAC,OAAO,CAAC;QAClF,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY;YAClC,CAAC,CAAC,yCAAiC;YACnC,CAAC,CAAC,gCAAwB,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjD,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,iFAAiF;iBAC3F,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACrB,EAAE,EAAE,YAAY;oBAChB,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE;wBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,YAAY;wBACZ,YAAY,EAAE,KAAK,CAAC,YAAY;wBAChC,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;qBACzC;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACxE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAChE,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1C,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAA0B;QACrD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACtC,CAAC;YACD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBACzC,IAAI,CAAC;oBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACpD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACnE,OAAO,IAAI,CAAC,gBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,KAAa,EAAE,OAAqB;QACrE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAEO,mBAAmB,CAAC,KAAwB;QAClD,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO;YACL,KAAK,EAAE;gBACL,EAAE,EAAE,YAAY;gBAChB,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,yCAAiC,CAAC,CAAC,CAAC,gCAAwB;gBACvF,IAAI,EAAE;oBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,YAAY;oBACZ,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAG,KAAwD,CAAC,OAAO,CAAC;iBACnG;aACF;YACD,KAAK,EAAE,UAAU,YAAY,EAAE;YAC/B,IAAI,EAAE;gBACJ,GAAG,EAAE,KAAK,EAAK,GAAW,EAAE,EAAwB,EAAc,EAAE,CAAC,EAAE,EAAE;aAC1E;SACF,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAEO,oBAAoB,CAAC,KAAwB;QACnD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,OAAO,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;IACzG,CAAC;IAEO,gBAAgB,CAAC,KAAwB,EAAE,OAAiC;QAClF,MAAM,IAAI,GAAG,OAAO,EAAE,IAAuD,CAAC;QAC9E,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;gBACL,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3F,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF;AAjMD,gEAiMC;AAED,MAAM,cAAc;IAApB;QACmB,UAAK,GAAQ,EAAE,CAAC;QACzB,cAAS,GAAsB,EAAE,CAAC;QAClC,WAAM,GAAG,KAAK,CAAC;IAkCzB,CAAC;IAhCQ,IAAI,CAAC,IAAO;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxC,QAAQ,EAAE,EAAE,CAAC;IACf,CAAC;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,CAAC,OAAO;QACnB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF","sourcesContent":["import { Inngest } from 'inngest';\nimport type { EventPayload } from 'inngest/types';\nimport type { StoreContext } from '../chatkit/store';\nimport type { AgentRuntimeEvent } from './AgentRuntimeTypes';\nimport { ManagedRunWorker, type ManagedRunStore } from './ManagedRunWorker';\nimport { PiAgentRuntimeDriver } from './PiAgentRuntimeDriver';\nimport type { RunExecutionBackend, RunExecutionInput } from './RunExecutionBackend';\n\nexport const XPOD_RUN_REQUESTED_EVENT = 'xpod/run.requested';\nexport const XPOD_RUN_CONTINUE_REQUESTED_EVENT = 'xpod/run.continue_requested';\nexport const XPOD_AGENT_RUN_FUNCTION_ID = 'xpod-agent-run';\n\nexport interface XpodRunRequestedEventData {\n runId: string;\n threadId: string;\n executionKey?: string;\n authBindingId?: string;\n webId?: string;\n continuation?: RunExecutionInput['continuation'];\n}\n\nexport type XpodRunRequestedEvent = EventPayload<XpodRunRequestedEventData> & {\n name: typeof XPOD_RUN_REQUESTED_EVENT | typeof XPOD_RUN_CONTINUE_REQUESTED_EVENT;\n};\n\nexport interface InngestRunExecutionBackendOptions {\n client?: Inngest;\n baseUrl?: string;\n eventKey?: string;\n signingKey?: string;\n runtimeDriver?: RunExecutionBackend;\n store?: ManagedRunStore<StoreContext>;\n managedRunWorker?: ManagedRunWorker<StoreContext>;\n contextResolver?: (data: XpodRunRequestedEventData) => StoreContext | Promise<StoreContext | undefined> | undefined;\n contextRecorder?: (context: StoreContext | undefined) => void;\n durableDelivery?: boolean;\n /**\n * When true, execute the registered Inngest handler in-process after sending\n * the event. This keeps Chat streaming low-latency while preserving the\n * Inngest event/function boundary for the managed-agents backend.\n */\n executeInline?: boolean;\n}\n\ntype PendingRun = {\n input: RunExecutionInput;\n queue: AsyncPushQueue<AgentRuntimeEvent>;\n started: boolean;\n};\n\ntype InngestHandlerContext = {\n event: XpodRunRequestedEvent;\n runId: string;\n step: {\n run<T>(id: string, fn: () => Promise<T> | T): Promise<T>;\n };\n};\n\n/**\n * Inngest-backed managed-agent execution backend.\n *\n * Xpod owns the Run facts; Inngest owns durable function delivery. In this\n * first API-facing implementation the function can execute inline so ChatKit\n * still receives a normal SSE stream without waiting for external polling.\n *\n * The in-memory pending map is only the streaming bridge for an active HTTP\n * request. When no pending stream exists, the registered Inngest function can\n * restore the Run from store through ManagedRunWorker.\n */\nexport class InngestRunExecutionBackend implements RunExecutionBackend {\n private readonly client: Inngest;\n private readonly runtimeDriver: RunExecutionBackend;\n private readonly managedRunWorker?: ManagedRunWorker<StoreContext>;\n private readonly contextResolver?: InngestRunExecutionBackendOptions['contextResolver'];\n private readonly contextRecorder?: InngestRunExecutionBackendOptions['contextRecorder'];\n private readonly executeInline: boolean;\n private readonly durableDelivery: boolean;\n private readonly pendingRuns = new Map<string, PendingRun>();\n\n public readonly agentRunFunction;\n\n public constructor(options: InngestRunExecutionBackendOptions = {}) {\n this.client = options.client ?? new Inngest({\n id: 'xpod-managed-agents',\n baseUrl: options.baseUrl,\n eventKey: options.eventKey,\n signingKey: options.signingKey,\n isDev: true,\n });\n this.runtimeDriver = options.runtimeDriver ?? new PiAgentRuntimeDriver();\n this.managedRunWorker = options.managedRunWorker\n ?? (options.store ? new ManagedRunWorker({ store: options.store, runtimeDriver: this.runtimeDriver }) : undefined);\n this.contextResolver = options.contextResolver;\n this.contextRecorder = options.contextRecorder;\n this.durableDelivery = options.durableDelivery ?? true;\n this.executeInline = options.executeInline ?? true;\n this.agentRunFunction = this.client.createFunction(\n {\n id: XPOD_AGENT_RUN_FUNCTION_ID,\n name: 'Xpod Agent Run',\n triggers: [\n { event: XPOD_RUN_REQUESTED_EVENT },\n { event: XPOD_RUN_CONTINUE_REQUESTED_EVENT },\n ],\n idempotency: 'event.data.executionKey',\n },\n (ctx: any) => this.handleAgentRun(ctx as InngestHandlerContext),\n );\n }\n\n public getClient(): Inngest {\n return this.client;\n }\n\n public async *start(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n this.pendingRuns.set(input.runId, { input, queue, started: false });\n const context = (input as RunExecutionInput & { context?: StoreContext }).context;\n this.contextRecorder?.(context);\n const eventName = input.continuation\n ? XPOD_RUN_CONTINUE_REQUESTED_EVENT\n : XPOD_RUN_REQUESTED_EVENT;\n const executionKey = this.executionKeyForInput(input);\n\n try {\n if (!this.durableDelivery && !this.executeInline) {\n yield {\n type: 'error',\n message: 'Run execution backend has neither durable delivery nor inline execution enabled',\n };\n return;\n }\n\n if (this.durableDelivery) {\n await this.client.send({\n id: executionKey,\n name: eventName,\n data: {\n runId: input.runId,\n threadId: input.threadId,\n executionKey,\n continuation: input.continuation,\n ...this.contextEventData(input, context),\n },\n });\n }\n\n if (!this.executeInline) {\n queue.close();\n return;\n }\n\n if (this.executeInline) {\n void this.handleAgentRun(this.createInlineContext(input)).catch((error) => {\n queue.push({ type: 'error', message: this.formatError(error) });\n queue.close();\n });\n }\n\n for await (const event of queue.iterate()) {\n yield event;\n }\n } catch (error) {\n yield { type: 'error', message: this.formatError(error) };\n } finally {\n this.pendingRuns.delete(input.runId);\n queue.close();\n }\n }\n\n private async handleAgentRun(ctx: InngestHandlerContext): Promise<{ runId: string; status: string }> {\n const runId = ctx.event.data?.runId;\n if (!runId) {\n return { runId: 'unknown', status: 'missing_run_id' };\n }\n const pending = this.pendingRuns.get(runId);\n if (pending) {\n if (pending.started) {\n return { runId, status: 'skipped' };\n }\n pending.started = true;\n await ctx.step.run('run-agent', async () => {\n try {\n for await (const event of this.runtimeDriver.start(pending.input)) {\n pending.queue.push(event);\n }\n } finally {\n pending.queue.close();\n }\n });\n\n return { runId, status: 'completed' };\n }\n\n if (!this.managedRunWorker || !this.contextResolver) {\n return { runId, status: 'not_found' };\n }\n\n const context = await this.contextResolver(ctx.event.data!);\n if (!context) {\n return { runId, status: 'not_found' };\n }\n\n const result = await ctx.step.run('run-agent-from-store', async () => {\n return this.managedRunWorker!.executeRun(runId, context);\n });\n\n return { runId, status: result.status };\n }\n\n public async restoreExecutionInput(runId: string, context: StoreContext): Promise<RunExecutionInput> {\n if (!this.managedRunWorker) {\n throw new Error('Managed Run worker is not configured');\n }\n return this.managedRunWorker.loadExecutionInput(runId, context);\n }\n\n private createInlineContext(input: RunExecutionInput): InngestHandlerContext {\n const executionKey = this.executionKeyForInput(input);\n return {\n event: {\n id: executionKey,\n name: input.continuation ? XPOD_RUN_CONTINUE_REQUESTED_EVENT : XPOD_RUN_REQUESTED_EVENT,\n data: {\n runId: input.runId,\n threadId: input.threadId,\n executionKey,\n continuation: input.continuation,\n ...this.contextEventData(input, (input as RunExecutionInput & { context?: StoreContext }).context),\n },\n },\n runId: `inline:${executionKey}`,\n step: {\n run: async <T>(_id: string, fn: () => Promise<T> | T): Promise<T> => fn(),\n },\n };\n }\n\n private formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private executionKeyForInput(input: RunExecutionInput): string {\n if (!input.continuation) {\n return `run:${input.runId}`;\n }\n return `run:${input.runId}:continue:${input.continuation.kind}:${input.continuation.itemId ?? 'none'}`;\n }\n\n private contextEventData(input: RunExecutionInput, context: StoreContext | undefined): Partial<XpodRunRequestedEventData> {\n const auth = context?.auth as { type?: unknown; webId?: unknown } | undefined;\n if (input.authBindingId) {\n return {\n authBindingId: input.authBindingId,\n ...(auth?.type === 'solid' && typeof auth.webId === 'string' ? { webId: auth.webId } : {}),\n };\n }\n if (auth?.type !== 'solid' || typeof auth.webId !== 'string') {\n return {};\n }\n return { webId: auth.webId };\n }\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private closed = false;\n\n public push(item: T): void {\n if (this.closed) {\n return;\n }\n this.items.push(item);\n const resolver = this.resolvers.shift();\n resolver?.();\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const resolver of this.resolvers) {\n resolver();\n }\n this.resolvers = [];\n }\n\n public async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this.closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"InngestRunExecutionBackend.js","sourceRoot":"","sources":["../../../src/api/runs/InngestRunExecutionBackend.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inngest } from 'inngest';\nimport type { EventPayload } from 'inngest/types';\nimport type { StoreContext } from '../chatkit/store';\nimport type { AgentRuntimeEvent } from './AgentRuntimeTypes';\nimport { ManagedRunWorker, type ManagedRunStore } from './ManagedRunWorker';\nimport { PiAgentRuntimeDriver } from './PiAgentRuntimeDriver';\nimport type { RunExecutionBackend, RunExecutionInput } from './RunExecutionBackend';\n\nexport const XPOD_RUN_REQUESTED_EVENT = 'xpod/run.requested';\nexport const XPOD_RUN_CONTINUE_REQUESTED_EVENT = 'xpod/run.continue_requested';\nexport const XPOD_AGENT_RUN_FUNCTION_ID = 'xpod-agent-run';\n\nexport interface XpodRunRequestedEventData {\n runId: string;\n threadId: string;\n executionKey?: string;\n authBindingId?: string;\n webId?: string;\n continuation?: RunExecutionInput['continuation'];\n}\n\nexport type XpodRunRequestedEvent = EventPayload<XpodRunRequestedEventData> & {\n name: typeof XPOD_RUN_REQUESTED_EVENT | typeof XPOD_RUN_CONTINUE_REQUESTED_EVENT;\n};\n\nexport interface InngestRunExecutionBackendOptions {\n client?: Inngest;\n baseUrl?: string;\n eventKey?: string;\n signingKey?: string;\n isDev?: boolean;\n runtimeDriver?: RunExecutionBackend;\n store?: ManagedRunStore<StoreContext>;\n managedRunWorker?: ManagedRunWorker<StoreContext>;\n contextResolver?: (data: XpodRunRequestedEventData) => StoreContext | Promise<StoreContext | undefined> | undefined;\n contextRecorder?: (context: StoreContext | undefined) => void;\n durableDelivery?: boolean;\n /**\n * When true, execute the registered Inngest handler in-process after sending\n * the event. This keeps Chat streaming low-latency while preserving the\n * Inngest event/function boundary for the managed-agents backend.\n */\n executeInline?: boolean;\n}\n\ntype PendingRun = {\n input: RunExecutionInput;\n queue: AsyncPushQueue<AgentRuntimeEvent>;\n started: boolean;\n};\n\ntype InngestHandlerContext = {\n event: XpodRunRequestedEvent;\n runId: string;\n step: {\n run<T>(id: string, fn: () => Promise<T> | T): Promise<T>;\n };\n};\n\n/**\n * Inngest-backed managed-agent execution backend.\n *\n * Xpod owns the Run facts; Inngest owns durable function delivery. In this\n * first API-facing implementation the function can execute inline so ChatKit\n * still receives a normal SSE stream without waiting for external polling.\n *\n * The in-memory pending map is only the streaming bridge for an active HTTP\n * request. When no pending stream exists, the registered Inngest function can\n * restore the Run from store through ManagedRunWorker.\n */\nexport class InngestRunExecutionBackend implements RunExecutionBackend {\n private readonly client: Inngest;\n private readonly runtimeDriver: RunExecutionBackend;\n private readonly managedRunWorker?: ManagedRunWorker<StoreContext>;\n private readonly contextResolver?: InngestRunExecutionBackendOptions['contextResolver'];\n private readonly contextRecorder?: InngestRunExecutionBackendOptions['contextRecorder'];\n private readonly executeInline: boolean;\n private readonly durableDelivery: boolean;\n private readonly pendingRuns = new Map<string, PendingRun>();\n\n public readonly agentRunFunction;\n\n public constructor(options: InngestRunExecutionBackendOptions = {}) {\n this.client = options.client ?? new Inngest({\n id: 'xpod-managed-agents',\n baseUrl: options.baseUrl,\n eventKey: options.eventKey,\n signingKey: options.signingKey,\n isDev: options.isDev ?? !options.durableDelivery,\n });\n this.runtimeDriver = options.runtimeDriver ?? new PiAgentRuntimeDriver();\n this.managedRunWorker = options.managedRunWorker\n ?? (options.store ? new ManagedRunWorker({ store: options.store, runtimeDriver: this.runtimeDriver }) : undefined);\n this.contextResolver = options.contextResolver;\n this.contextRecorder = options.contextRecorder;\n this.durableDelivery = options.durableDelivery ?? true;\n this.executeInline = options.executeInline ?? true;\n this.agentRunFunction = this.client.createFunction(\n {\n id: XPOD_AGENT_RUN_FUNCTION_ID,\n name: 'Xpod Agent Run',\n triggers: [\n { event: XPOD_RUN_REQUESTED_EVENT },\n { event: XPOD_RUN_CONTINUE_REQUESTED_EVENT },\n ],\n idempotency: 'event.data.executionKey',\n },\n (ctx: any) => this.handleAgentRun(ctx as InngestHandlerContext),\n );\n }\n\n public getClient(): Inngest {\n return this.client;\n }\n\n public async *start(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n this.pendingRuns.set(input.runId, { input, queue, started: false });\n const context = (input as RunExecutionInput & { context?: StoreContext }).context;\n this.contextRecorder?.(context);\n const eventName = input.continuation\n ? XPOD_RUN_CONTINUE_REQUESTED_EVENT\n : XPOD_RUN_REQUESTED_EVENT;\n const executionKey = this.executionKeyForInput(input);\n\n try {\n if (!this.durableDelivery && !this.executeInline) {\n yield {\n type: 'error',\n message: 'Run execution backend has neither durable delivery nor inline execution enabled',\n };\n return;\n }\n\n if (this.durableDelivery) {\n await this.client.send({\n id: executionKey,\n name: eventName,\n data: {\n runId: input.runId,\n threadId: input.threadId,\n executionKey,\n continuation: input.continuation,\n ...this.contextEventData(input, context),\n },\n });\n }\n\n if (!this.executeInline) {\n queue.close();\n return;\n }\n\n if (this.executeInline) {\n void this.handleAgentRun(this.createInlineContext(input)).catch((error) => {\n queue.push({ type: 'error', message: this.formatError(error) });\n queue.close();\n });\n }\n\n for await (const event of queue.iterate()) {\n yield event;\n }\n } catch (error) {\n yield { type: 'error', message: this.formatError(error) };\n } finally {\n this.pendingRuns.delete(input.runId);\n queue.close();\n }\n }\n\n private async handleAgentRun(ctx: InngestHandlerContext): Promise<{ runId: string; status: string }> {\n const runId = ctx.event.data?.runId;\n if (!runId) {\n return { runId: 'unknown', status: 'missing_run_id' };\n }\n const pending = this.pendingRuns.get(runId);\n if (pending) {\n if (pending.started) {\n return { runId, status: 'skipped' };\n }\n pending.started = true;\n await ctx.step.run('run-agent', async () => {\n try {\n for await (const event of this.runtimeDriver.start(pending.input)) {\n pending.queue.push(event);\n }\n } finally {\n pending.queue.close();\n }\n });\n\n return { runId, status: 'completed' };\n }\n\n if (!this.managedRunWorker || !this.contextResolver) {\n return { runId, status: 'not_found' };\n }\n\n const context = await this.contextResolver(ctx.event.data!);\n if (!context) {\n return { runId, status: 'not_found' };\n }\n\n const result = await ctx.step.run('run-agent-from-store', async () => {\n return this.managedRunWorker!.executeRun(runId, context);\n });\n\n return { runId, status: result.status };\n }\n\n public async restoreExecutionInput(runId: string, context: StoreContext): Promise<RunExecutionInput> {\n if (!this.managedRunWorker) {\n throw new Error('Managed Run worker is not configured');\n }\n return this.managedRunWorker.loadExecutionInput(runId, context);\n }\n\n private createInlineContext(input: RunExecutionInput): InngestHandlerContext {\n const executionKey = this.executionKeyForInput(input);\n return {\n event: {\n id: executionKey,\n name: input.continuation ? XPOD_RUN_CONTINUE_REQUESTED_EVENT : XPOD_RUN_REQUESTED_EVENT,\n data: {\n runId: input.runId,\n threadId: input.threadId,\n executionKey,\n continuation: input.continuation,\n ...this.contextEventData(input, (input as RunExecutionInput & { context?: StoreContext }).context),\n },\n },\n runId: `inline:${executionKey}`,\n step: {\n run: async <T>(_id: string, fn: () => Promise<T> | T): Promise<T> => fn(),\n },\n };\n }\n\n private formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private executionKeyForInput(input: RunExecutionInput): string {\n if (!input.continuation) {\n return `run:${input.runId}`;\n }\n return `run:${input.runId}:continue:${input.continuation.kind}:${input.continuation.itemId ?? 'none'}`;\n }\n\n private contextEventData(input: RunExecutionInput, context: StoreContext | undefined): Partial<XpodRunRequestedEventData> {\n const auth = context?.auth as { type?: unknown; webId?: unknown } | undefined;\n if (input.authBindingId) {\n return {\n authBindingId: input.authBindingId,\n ...(auth?.type === 'solid' && typeof auth.webId === 'string' ? { webId: auth.webId } : {}),\n };\n }\n if (auth?.type !== 'solid' || typeof auth.webId !== 'string') {\n return {};\n }\n return { webId: auth.webId };\n }\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private closed = false;\n\n public push(item: T): void {\n if (this.closed) {\n return;\n }\n this.items.push(item);\n const resolver = this.resolvers.shift();\n resolver?.();\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const resolver of this.resolvers) {\n resolver();\n }\n this.resolvers = [];\n }\n\n public async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this.closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
|
|
@@ -42,7 +42,7 @@ class RunStateCenter {
|
|
|
42
42
|
const protocol = this.resolveRunnerProtocol(runtime.runner.protocol);
|
|
43
43
|
const allowCustomArgv = runtime.runner.allowCustomArgv === true;
|
|
44
44
|
const argv = allowCustomArgv ? runtime.runner.argv : undefined;
|
|
45
|
-
const workspace = this.resolveWorkspaceUri(
|
|
45
|
+
const workspace = this.resolveWorkspaceUri(thread.workspace);
|
|
46
46
|
if (!workspace) {
|
|
47
47
|
throw new Error('Invalid thread runtime: workspace URI is required');
|
|
48
48
|
}
|
|
@@ -69,10 +69,7 @@ class RunStateCenter {
|
|
|
69
69
|
}
|
|
70
70
|
return 'pi';
|
|
71
71
|
}
|
|
72
|
-
resolveWorkspaceUri(
|
|
73
|
-
if ((0, types_2.isWorkspaceUri)(runtimeWorkspace)) {
|
|
74
|
-
return runtimeWorkspace;
|
|
75
|
-
}
|
|
72
|
+
resolveWorkspaceUri(threadWorkspace) {
|
|
76
73
|
return (0, types_2.isWorkspaceUri)(threadWorkspace) ? threadWorkspace : undefined;
|
|
77
74
|
}
|
|
78
75
|
async *startAgentRun(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunStateCenter.js","sourceRoot":"","sources":["../../../src/api/runs/RunStateCenter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChatKitStore, StoreContext } from '../chatkit/store';\nimport type {\n AssistantMessageItem,\n ClientEffect,\n ClientToolCallItem,\n ThreadItem,\n ThreadMetadata,\n ThreadRef,\n UserMessageItem,\n} from '../chatkit/types';\nimport {\n DEFAULT_THREAD_CHAT_ID,\n extractAssistantMessageText,\n extractUserMessageText,\n generateId,\n toThreadRef,\n nowTimestamp,\n} from '../chatkit/types';\nimport type { AgentRuntimeConfig, RunnerProtocol, RunnerType } from './AgentRuntimeTypes';\nimport type { AgentRuntimeEvent } from './AgentRuntimeTypes';\nimport { InngestRunExecutionBackend } from './InngestRunExecutionBackend';\nimport type { RunExecutionBackend } from './RunExecutionBackend';\nimport { isWorkspaceUri } from '../workspace/types';\nimport { XpodRunStepType as RunStepType, RunStatus } from './schema';\nimport {\n generateRunResourceId,\n generateRunStepResourceId,\n resolveDataResourceIri,\n resolveRunUrn,\n type RunRecordData,\n type RunStepRecordData,\n type RunStore,\n} from './store';\n\nexport type RunStateEvent =\n | { type: 'item_added'; item: ThreadItem }\n | { type: 'item_updated'; itemId: string; delta: string }\n | { type: 'item_done'; item: ThreadItem }\n | { type: 'client_effect'; effect: ClientEffect }\n | { type: 'error'; code: string; message: string };\n\nconst RUN_WAITING_STATUSES = new Set<string>([\n RunStatus.WAITING_INPUT,\n RunStatus.WAITING_RUNNER,\n]);\n\ntype ActiveAssistant = {\n item: AssistantMessageItem;\n fullText: string;\n};\n\ntype RuntimeProjectionResult =\n | { action: 'continue' }\n | { action: 'return' }\n | { action: 'error'; message: string };\n\nexport interface RunStateCenterOptions<TContext = StoreContext> {\n store: ChatKitStore<TContext>;\n enableAgentRuntime?: boolean;\n executionBackend?: RunExecutionBackend;\n}\n\n/**\n * Run is the xpod-side state center for Agent execution.\n *\n * ChatKit and Task APIs are command surfaces. They hand execution to this\n * center, which persists first-class Run/RunStep facts through the configured\n * RunStore while projecting visible output back to Thread/Message.\n */\nexport class RunStateCenter<TContext = StoreContext> {\n private readonly store: ChatKitStore<TContext>;\n private readonly runStore?: RunStore<TContext>;\n private readonly enableAgentRuntime: boolean;\n private readonly executionBackend: RunExecutionBackend;\n\n public constructor(options: RunStateCenterOptions<TContext>) {\n this.store = options.store;\n this.runStore = this.resolveRunStore(options.store);\n this.enableAgentRuntime = options.enableAgentRuntime ?? false;\n this.executionBackend = options.executionBackend ?? new InngestRunExecutionBackend();\n }\n\n public getAgentRuntimeConfig(thread: ThreadMetadata, context?: TContext): AgentRuntimeConfig | null {\n if (!this.enableAgentRuntime) {\n return null;\n }\n const runtime = (thread.metadata as any)?.runtime;\n if (!runtime) {\n return null;\n }\n if (!runtime.runner) {\n throw new Error('Invalid thread.metadata.runtime: runner is required');\n }\n const runnerType = runtime.runner.type as RunnerType;\n if (!runnerType) {\n throw new Error('Invalid thread.metadata.runtime.runner.type');\n }\n\n const protocol = this.resolveRunnerProtocol(runtime.runner.protocol);\n const allowCustomArgv = runtime.runner.allowCustomArgv === true;\n const argv = allowCustomArgv ? runtime.runner.argv : undefined;\n const workspace = this.resolveWorkspaceUri(runtime.workspace, thread.workspace);\n if (!workspace) {\n throw new Error('Invalid thread runtime: workspace URI is required');\n }\n\n return {\n ...runtime,\n workspace,\n runner: {\n ...runtime.runner,\n argv,\n protocol,\n },\n agentConfig: runtime.agentConfig,\n } as AgentRuntimeConfig;\n }\n\n public getDefaultAgentRuntimeConfig(context: TContext): AgentRuntimeConfig | null {\n if (!this.enableAgentRuntime) {\n return null;\n }\n return null;\n }\n\n private resolveRunnerProtocol(protocol: unknown): RunnerProtocol {\n if (protocol === 'acp' || protocol === 'pi') {\n return protocol;\n }\n return 'pi';\n }\n\n private resolveWorkspaceUri(runtimeWorkspace: unknown, threadWorkspace: AgentRuntimeConfig['workspace'] | undefined): AgentRuntimeConfig['workspace'] | undefined {\n if (isWorkspaceUri(runtimeWorkspace)) {\n return runtimeWorkspace;\n }\n return isWorkspaceUri(threadWorkspace) ? threadWorkspace : undefined;\n }\n\n public async *startAgentRun(input: {\n thread: ThreadMetadata;\n userMessage: UserMessageItem;\n context: TContext;\n runtimeConfig: AgentRuntimeConfig;\n }): AsyncIterable<RunStateEvent> {\n const { thread, userMessage, context, runtimeConfig } = input;\n const prompt = extractUserMessageText(userMessage.content);\n if (!prompt.trim()) {\n return;\n }\n\n const threadRef = this.threadRefFromThread(thread);\n const assistantItem = await this.createAssistantMessage(thread, context);\n const run = await this.createRun({\n thread,\n userMessage,\n prompt,\n runtimeConfig,\n context,\n });\n\n await this.store.addThreadItem(threadRef, assistantItem, context);\n yield { type: 'item_added', item: assistantItem };\n await this.markRunStarted(run, context);\n\n const assistantState: ActiveAssistant = { item: assistantItem, fullText: '' };\n let runtimeError: string | undefined;\n\n for await (\n const event of this.executionBackend.start({\n runId: run.id,\n threadId: thread.id,\n prompt,\n conversation: await this.loadConversation(threadRef, userMessage.id, context),\n config: runtimeConfig,\n context: context as StoreContext,\n })\n ) {\n const cancellation = await this.checkCancellation(run, threadRef, assistantState, context);\n if (cancellation) {\n yield { type: 'item_done', item: cancellation };\n yield { type: 'error', code: 'runtime_cancelled', message: 'Run cancellation requested' };\n return;\n }\n\n const result = yield* this.projectRuntimeEvent(event, {\n run,\n thread,\n threadRef,\n assistant: assistantState,\n context,\n });\n if (result.action === 'continue') {\n continue;\n }\n if (result.action === 'return') {\n return;\n }\n\n runtimeError = result.message;\n break;\n }\n\n const finalStatus = runtimeError ? 'incomplete' : 'completed';\n const finalItem = this.finalizeAssistantMessage(assistantState.item, assistantState.fullText, finalStatus);\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(\n run,\n runtimeError ? RunStatus.FAILED : RunStatus.COMPLETED,\n context,\n runtimeError,\n );\n yield { type: 'item_done', item: finalItem };\n }\n\n public async *completeClientToolOutput(input: {\n threadRef: ThreadRef;\n itemId: string;\n output: string;\n context: TContext;\n }): AsyncIterable<RunStateEvent> {\n const { threadRef, itemId, output, context } = input;\n const item = await this.store.loadItem(threadRef, itemId, context);\n if (item.type !== 'client_tool_call') {\n return;\n }\n\n const updatedItem: ClientToolCallItem = {\n ...item,\n output,\n status: 'completed',\n };\n await this.store.saveItem(threadRef, updatedItem, context);\n yield { type: 'item_done', item: updatedItem };\n\n const run = await this.resolveWaitingRunForToolOutput(updatedItem, threadRef, context);\n if (!run) {\n return;\n }\n\n const now = nowTimestamp();\n await this.appendRunStep(run, RunStepType.CLIENT_TOOL_OUTPUT, context, {\n message: updatedItem.name,\n data: {\n itemId: updatedItem.id,\n callId: updatedItem.call_id,\n output,\n },\n });\n await this.appendRunStep(run, RunStepType.CONTINUE_REQUESTED, context, {\n message: 'Run continuation requested',\n data: {\n kind: 'client_tool_output',\n itemId: updatedItem.id,\n },\n });\n run.status = RunStatus.QUEUED;\n run.leaseOwner = undefined;\n run.leaseExpiresAt = undefined;\n run.completedAt = undefined;\n run.error = undefined;\n run.updatedAt = now;\n run.metadata = {\n ...(run.metadata ?? {}),\n continuation: {\n kind: 'client_tool_output',\n itemId: updatedItem.id,\n output,\n queuedAt: now,\n },\n };\n await this.saveRun(run, context);\n\n const thread = await this.store.loadThread(threadRef, context);\n const assistantItemId = typeof run.metadata?.assistantItemId === 'string' ? run.metadata.assistantItemId : undefined;\n const assistantItem = assistantItemId\n ? await this.store.loadItem(threadRef, assistantItemId, context) as AssistantMessageItem\n : await this.createAssistantMessage(thread, context);\n if (!assistantItemId) {\n await this.store.addThreadItem(threadRef, assistantItem, context);\n yield { type: 'item_added', item: assistantItem };\n }\n const assistantState: ActiveAssistant = {\n item: assistantItem,\n fullText: extractAssistantMessageText(assistantItem.content),\n };\n await this.markRunStarted(run, context);\n\n for await (\n const event of this.executionBackend.start({\n runId: run.id,\n threadId: this.extractThreadIdFromRef(threadRef),\n prompt: this.buildContinuationPrompt(updatedItem),\n conversation: await this.loadConversation(threadRef, String(run.metadata?.userMessageId ?? updatedItem.id), context),\n config: this.resolveRuntimeConfigForContinuation(run),\n continuation: {\n kind: 'client_tool_output',\n itemId: updatedItem.id,\n },\n context: context as StoreContext,\n })\n ) {\n const cancellation = await this.checkCancellation(run, threadRef, assistantState, context);\n if (cancellation) {\n yield { type: 'item_done', item: cancellation };\n yield { type: 'error', code: 'runtime_cancelled', message: 'Run cancellation requested' };\n return;\n }\n\n const result = yield* this.projectRuntimeEvent(event, {\n run,\n thread,\n threadRef,\n assistant: assistantState,\n context,\n });\n if (result.action === 'continue') {\n continue;\n }\n if (result.action === 'return') {\n return;\n }\n const finalItem = this.finalizeAssistantMessage(assistantState.item, assistantState.fullText, 'incomplete');\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(run, RunStatus.FAILED, context, result.message);\n yield { type: 'item_done', item: finalItem };\n return;\n }\n\n const finalItem = this.finalizeAssistantMessage(assistantState.item, assistantState.fullText, 'completed');\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(run, RunStatus.COMPLETED, context);\n yield { type: 'item_done', item: finalItem };\n }\n\n private resolveRunStore(store: ChatKitStore<TContext>): RunStore<TContext> | undefined {\n if (\n typeof store.saveRun === 'function'\n && typeof store.loadRun === 'function'\n && typeof store.listRuns === 'function'\n && typeof store.appendRunStep === 'function'\n && typeof store.loadRunSteps === 'function'\n ) {\n return store as RunStore<TContext>;\n }\n return undefined;\n }\n\n private async createRun(input: {\n thread: ThreadMetadata;\n userMessage: UserMessageItem;\n prompt: string;\n runtimeConfig: AgentRuntimeConfig;\n context: TContext;\n }): Promise<RunRecordData> {\n const { thread, userMessage, prompt, runtimeConfig, context } = input;\n const now = nowTimestamp();\n const commandKind = thread.metadata?.commandKind === 'task' ? 'task' : 'chat';\n const surfaceId = this.resolveSurfaceId(thread);\n const run: RunRecordData = {\n id: generateRunResourceId({\n key: generateId('run'),\n commandKind,\n surfaceId,\n createdAt: now,\n }),\n thread: this.resolveThreadUri(thread, context),\n workspace: runtimeConfig.workspace,\n commandKind,\n surfaceId,\n status: RunStatus.QUEUED,\n runner: `${runtimeConfig.runner.protocol ?? 'pi'}:${runtimeConfig.runner.type}`,\n prompt,\n metadata: {\n threadId: thread.id,\n userMessageId: userMessage.id,\n runtimeConfig,\n surfaceId,\n },\n createdAt: now,\n updatedAt: now,\n };\n await this.saveRun(run, context);\n await this.appendRunStep(run, RunStepType.CREATED, context, {\n message: 'Run created',\n data: {\n commandKind: run.commandKind,\n thread: run.thread,\n workspace: run.workspace,\n runner: run.runner,\n },\n });\n return run;\n }\n\n private async markRunStarted(run: RunRecordData, context: TContext): Promise<void> {\n const now = nowTimestamp();\n run.status = RunStatus.RUNNING;\n run.startedAt = now;\n run.updatedAt = now;\n await this.saveRun(run, context);\n await this.appendRunStep(run, RunStepType.STARTED, context, {\n message: 'Run started',\n });\n }\n\n private async finishRun(\n run: RunRecordData,\n status: RunRecordData['status'],\n context: TContext,\n error?: string,\n ): Promise<void> {\n const now = nowTimestamp();\n run.status = status;\n run.completedAt = now;\n run.updatedAt = now;\n run.error = error;\n await this.saveRun(run, context);\n await this.appendRunStep(\n run,\n this.stepTypeForTerminalStatus(status),\n context,\n {\n message: error ?? `Run ${status}`,\n data: { status },\n },\n );\n }\n\n private async pauseRun(\n run: RunRecordData,\n status: RunRecordData['status'],\n context: TContext,\n message: string,\n ): Promise<void> {\n const now = nowTimestamp();\n run.status = status;\n run.completedAt = undefined;\n run.heartbeatAt = now;\n run.leaseOwner = undefined;\n run.leaseExpiresAt = undefined;\n run.updatedAt = now;\n run.error = message;\n await this.saveRun(run, context);\n }\n\n private async *projectRuntimeEvent(\n event: AgentRuntimeEvent,\n input: {\n run: RunRecordData;\n thread: ThreadMetadata;\n threadRef: ThreadRef;\n assistant: ActiveAssistant;\n context: TContext;\n },\n ): AsyncGenerator<RunStateEvent, RuntimeProjectionResult> {\n const { run, thread, threadRef, assistant, context } = input;\n\n if (event.type === 'text') {\n assistant.fullText += event.text;\n await this.appendRunStep(run, RunStepType.TEXT_DELTA, context, {\n message: event.text,\n data: { delta: event.text },\n });\n yield { type: 'item_updated', itemId: assistant.item.id, delta: event.text };\n return { action: 'continue' };\n }\n\n if (event.type === 'auth_required') {\n await this.appendRunStep(run, RunStepType.AUTH_REQUIRED, context, {\n message: event.message,\n data: {\n method: event.method,\n url: event.url,\n options: event.options,\n },\n });\n yield {\n type: 'client_effect',\n effect: {\n effect_type: 'runtime.auth_required',\n data: {\n method: event.method,\n url: event.url,\n message: event.message,\n options: event.options,\n },\n },\n };\n return { action: 'continue' };\n }\n\n if (event.type === 'tool_call') {\n await this.appendRunStep(run, RunStepType.TOOL_CALL, context, {\n message: event.name,\n data: {\n requestId: event.requestId,\n name: event.name,\n arguments: event.arguments,\n },\n });\n const toolItem: ClientToolCallItem = {\n id: this.store.generateItemId('client_tool_call', thread, context),\n thread_id: thread.id,\n type: 'client_tool_call',\n name: event.name,\n arguments: event.arguments,\n call_id: event.requestId,\n status: 'pending',\n metadata: {\n runId: run.id,\n assistantItemId: assistant.item.id,\n },\n created_at: nowTimestamp(),\n };\n await this.store.addThreadItem(threadRef, toolItem, context);\n yield { type: 'item_added', item: toolItem };\n\n const incomplete = this.finalizeAssistantMessage(assistant.item, assistant.fullText, 'incomplete');\n assistant.item = incomplete;\n await this.store.saveItem(threadRef, incomplete, context);\n yield { type: 'item_done', item: incomplete };\n run.metadata = {\n ...(run.metadata ?? {}),\n assistantItemId: assistant.item.id,\n waitingTool: {\n itemId: toolItem.id,\n requestId: event.requestId,\n name: event.name,\n },\n };\n await this.pauseRun(run, RunStatus.WAITING_INPUT, context, `Waiting for client tool output: ${event.name}`);\n yield {\n type: 'error',\n code: 'runtime_waiting_input',\n message: `Run is waiting for client tool output: ${event.name}`,\n };\n return { action: 'return' };\n }\n\n if (event.type === 'waiting_runner') {\n await this.appendRunStep(run, RunStepType.WAITING_RUNNER, context, {\n message: event.message,\n data: {\n workspace: event.workspace,\n },\n });\n yield { type: 'error', code: 'waiting_runner', message: event.message };\n await this.finishRun(run, RunStatus.WAITING_RUNNER, context, event.message);\n return { action: 'return' };\n }\n\n await this.appendRunStep(run, RunStepType.ERROR, context, {\n message: event.message,\n });\n yield { type: 'error', code: 'runtime_error', message: event.message };\n return { action: 'error', message: event.message };\n }\n\n private async checkCancellation(\n run: RunRecordData,\n threadRef: ThreadRef,\n assistant: ActiveAssistant,\n context: TContext,\n ): Promise<AssistantMessageItem | undefined> {\n if (!this.runStore?.loadRun) {\n return undefined;\n }\n const latest = await this.runStore.loadRun(run.id, context);\n if (!latest.cancelRequestedAt) {\n return undefined;\n }\n run.cancelRequestedAt = latest.cancelRequestedAt;\n const finalItem = this.finalizeAssistantMessage(assistant.item, assistant.fullText, 'incomplete');\n assistant.item = finalItem;\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(run, RunStatus.CANCELLED, context, 'Run cancellation requested');\n return finalItem;\n }\n\n private stepTypeForTerminalStatus(status: RunRecordData['status']): RunStepRecordData['type'] {\n if (status === RunStatus.COMPLETED) {\n return RunStepType.COMPLETED;\n }\n if (status === RunStatus.CANCELLED) {\n return RunStepType.CANCELLED;\n }\n if (RUN_WAITING_STATUSES.has(status)) {\n return status === RunStatus.WAITING_RUNNER ? RunStepType.WAITING_RUNNER : RunStepType.WAITING_INPUT;\n }\n return RunStepType.FAILED;\n }\n\n private async saveRun(run: RunRecordData, context: TContext): Promise<void> {\n await this.runStore?.saveRun(run, context);\n }\n\n private async appendRunStep(\n run: RunRecordData,\n type: RunStepRecordData['type'],\n context: TContext,\n options: {\n message?: string;\n data?: Record<string, unknown>;\n } = {},\n ): Promise<void> {\n const createdAt = nowTimestamp();\n await this.runStore?.appendRunStep({\n id: generateRunStepResourceId({\n key: generateId('run-step'),\n runId: run.id,\n commandKind: run.commandKind,\n surfaceId: run.surfaceId,\n createdAt,\n }),\n commandKind: run.commandKind,\n surfaceId: run.surfaceId,\n runId: run.id,\n run: this.resolveRunUri(run, context),\n type,\n message: options.message,\n data: options.data,\n createdAt,\n }, context);\n }\n\n private resolveThreadUri(thread: ThreadMetadata, context: TContext): string {\n const threadId = thread.id;\n if (/^https?:\\/\\//.test(threadId)) {\n return threadId;\n }\n\n const commandKind = thread.metadata?.commandKind === 'task' ? 'task' : 'chat';\n const surfaceId = this.resolveSurfaceId(thread);\n const podBaseUrl = this.resolvePodBaseUrl(context);\n if (podBaseUrl) {\n if (threadId.includes('#') && !threadId.startsWith('#')) {\n return resolveDataResourceIri(podBaseUrl, threadId);\n }\n return `${podBaseUrl}/.data/${commandKind}/${surfaceId}/index.ttl#${threadId}`;\n }\n return `urn:xpod:thread:${commandKind}:${encodeURIComponent(surfaceId)}:${encodeURIComponent(threadId)}`;\n }\n\n private resolveRunUri(run: RunRecordData, context: TContext): string {\n const podBaseUrl = this.resolvePodBaseUrl(context);\n if (podBaseUrl) {\n return resolveDataResourceIri(podBaseUrl, run.id);\n }\n return resolveRunUrn(run.id);\n }\n\n private async resolveWaitingRunForToolOutput(\n item: ClientToolCallItem,\n threadRef: ThreadRef,\n context: TContext,\n ): Promise<RunRecordData | undefined> {\n const metadataRunId = item.metadata?.runId;\n if (typeof metadataRunId === 'string' && this.runStore?.loadRun) {\n const run = await this.runStore.loadRun(metadataRunId, context);\n if (run.status === RunStatus.WAITING_INPUT) {\n return run;\n }\n }\n\n if (!this.runStore?.listRuns) {\n return undefined;\n }\n\n const threadCandidates = this.threadCandidatesForRunLookup(threadRef, context);\n for (const thread of threadCandidates) {\n const candidates = await this.runStore.listRuns({\n thread,\n status: RunStatus.WAITING_INPUT,\n limit: 10,\n }, context);\n const match = candidates.find((run) => {\n const tool = run.metadata?.waitingTool;\n return !tool || typeof tool !== 'object' || (tool as any).itemId === item.id;\n }) ?? candidates[0];\n if (match) {\n return match;\n }\n }\n return undefined;\n }\n\n private extractThreadIdFromRef(threadRef: ThreadRef): string {\n if ('chat_id' in threadRef) {\n return threadRef.thread_id;\n }\n return threadRef.thread_id;\n }\n\n private threadCandidatesForRunLookup(threadRef: ThreadRef, context: TContext): string[] {\n const candidates: string[] = [];\n const add = (value: string | undefined): void => {\n if (value && !candidates.includes(value)) {\n candidates.push(value);\n }\n };\n\n const threadId = this.extractThreadIdFromRef(threadRef);\n add(threadId);\n const relative = this.extractBaseRelativeThreadId(threadId);\n add(relative);\n const podBaseUrl = this.resolvePodBaseUrl(context);\n if (podBaseUrl && relative) {\n add(resolveDataResourceIri(podBaseUrl, relative));\n }\n return candidates;\n }\n\n private extractBaseRelativeThreadId(threadId: string): string | undefined {\n if (/^(chat|task)\\/[^/]+\\/index\\.ttl#[^#]+$/.test(threadId)) {\n return threadId;\n }\n if (!/^https?:\\/\\//.test(threadId)) {\n return undefined;\n }\n try {\n const url = new URL(threadId);\n const marker = '/.data/';\n const index = url.pathname.indexOf(marker);\n if (index >= 0 && url.hash) {\n return `${url.pathname.slice(index + marker.length)}${url.hash}`;\n }\n } catch {\n return undefined;\n }\n return undefined;\n }\n\n private buildContinuationPrompt(item: ClientToolCallItem): string {\n return `Continue the previous run after client tool output.\\n\\nTool: ${item.name}\\nOutput:\\n${item.output ?? ''}`;\n }\n\n private resolveRuntimeConfigForContinuation(run: RunRecordData): AgentRuntimeConfig {\n const runtimeConfig = run.metadata?.runtimeConfig;\n if (runtimeConfig && typeof runtimeConfig === 'object') {\n return runtimeConfig as AgentRuntimeConfig;\n }\n if (!isWorkspaceUri(run.workspace)) {\n throw new Error('Run workspace URI is required');\n }\n const [protocol, type] = run.runner.split(':');\n return {\n workspace: run.workspace,\n runner: {\n protocol: protocol === 'acp' ? 'acp' : 'pi',\n type: this.isRunnerType(type) ? type : 'pi',\n },\n };\n }\n\n private isRunnerType(value: unknown): value is RunnerType {\n return value === 'pi' || value === 'codex' || value === 'claude' || value === 'codebuddy';\n }\n\n private resolveSurfaceId(thread: ThreadMetadata): string {\n if (typeof thread.metadata?.surface_id === 'string') {\n return thread.metadata.surface_id;\n }\n if (typeof thread.metadata?.chat_id === 'string') {\n return thread.metadata.chat_id;\n }\n return DEFAULT_THREAD_CHAT_ID;\n }\n\n private resolvePodBaseUrl(context: TContext): string | undefined {\n const auth = (context as Record<string, unknown>).auth as { webId?: unknown } | undefined;\n const webId = typeof auth?.webId === 'string' ? auth.webId : undefined;\n if (!webId) {\n return undefined;\n }\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return undefined;\n }\n const podPath = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n url.pathname = podPath;\n return url.toString().replace(/\\/$/, '');\n } catch {\n return undefined;\n }\n }\n\n private async createAssistantMessage(\n thread: ThreadMetadata,\n context: TContext,\n ): Promise<AssistantMessageItem> {\n return {\n id: this.store.generateItemId('assistant_message', thread, context),\n thread_id: thread.id,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n }\n\n private finalizeAssistantMessage(\n item: AssistantMessageItem,\n text: string,\n status: 'completed' | 'incomplete',\n ): AssistantMessageItem {\n return {\n ...item,\n content: [{ type: 'output_text', text }],\n status,\n };\n }\n\n private threadRefFromThread(thread: ThreadMetadata): ThreadRef {\n return toThreadRef({\n thread_id: thread.id,\n chat_id: typeof thread.metadata?.chat_id === 'string' ? thread.metadata.chat_id : DEFAULT_THREAD_CHAT_ID,\n });\n }\n\n private async loadConversation(\n threadRef: ThreadRef,\n currentUserMessageId: string,\n context: TContext,\n ): Promise<Array<{ role: 'user' | 'assistant'; text: string; createdAt: number }>> {\n const items = await this.store.loadThreadItems(threadRef, undefined, 1000, 'asc', context);\n const conversation: Array<{ role: 'user' | 'assistant'; text: string; createdAt: number }> = [];\n\n for (const item of items.data) {\n if (item.id === currentUserMessageId) {\n break;\n }\n if (item.type === 'user_message') {\n const text = extractUserMessageText(item.content).trim();\n if (text) {\n conversation.push({ role: 'user', text, createdAt: item.created_at });\n }\n continue;\n }\n if (item.type === 'assistant_message' && item.status !== 'in_progress') {\n const text = extractAssistantMessageText(item.content).trim();\n if (text) {\n conversation.push({ role: 'assistant', text, createdAt: item.created_at });\n }\n }\n }\n\n return conversation;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RunStateCenter.js","sourceRoot":"","sources":["../../../src/api/runs/RunStateCenter.ts"],"names":[],"mappings":";;;AAUA,4CAO0B;AAG1B,6EAA0E;AAE1E,8CAAoD;AACpD,qCAAqE;AACrE,mCAQiB;AASjB,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;IAC3C,kBAAS,CAAC,aAAa;IACvB,kBAAS,CAAC,cAAc;CACzB,CAAC,CAAC;AAkBH;;;;;;GAMG;AACH,MAAa,cAAc;IAMzB,YAAmB,OAAwC;QACzD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC9D,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,uDAA0B,EAAE,CAAC;IACvF,CAAC;IAEM,qBAAqB,CAAC,MAAsB,EAAE,OAAkB;QACrE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAI,MAAM,CAAC,QAAgB,EAAE,OAAO,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAkB,CAAC;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC;QAChE,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO;YACL,GAAG,OAAO;YACV,SAAS;YACT,MAAM,EAAE;gBACN,GAAG,OAAO,CAAC,MAAM;gBACjB,IAAI;gBACJ,QAAQ;aACT;YACD,WAAW,EAAE,OAAO,CAAC,WAAW;SACX,CAAC;IAC1B,CAAC;IAEM,4BAA4B,CAAC,OAAiB;QACnD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,qBAAqB,CAAC,QAAiB;QAC7C,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,mBAAmB,CAAC,eAA4D;QACtF,OAAO,IAAA,sBAAc,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC;IAEM,KAAK,CAAC,CAAC,aAAa,CAAC,KAK3B;QACC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAA,8BAAsB,EAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;YAC/B,MAAM;YACN,WAAW;YACX,MAAM;YACN,aAAa;YACb,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAClD,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAExC,MAAM,cAAc,GAAoB,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC9E,IAAI,YAAgC,CAAC;QAErC,IAAI,KAAK,EACP,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YACzC,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM;YACN,YAAY,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC;YAC7E,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,OAAuB;SACjC,CAAC,EACF,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAC3F,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBAChD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;gBAC1F,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;gBACpD,GAAG;gBACH,MAAM;gBACN,SAAS;gBACT,SAAS,EAAE,cAAc;gBACzB,OAAO;aACR,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;YAC9B,MAAM;QACR,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3G,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,SAAS,CAClB,GAAG,EACH,YAAY,CAAC,CAAC,CAAC,kBAAS,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAS,CAAC,SAAS,EACrD,OAAO,EACP,YAAY,CACb,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,CAAC,wBAAwB,CAAC,KAKtC;QACC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAuB;YACtC,GAAG,IAAI;YACP,MAAM;YACN,MAAM,EAAE,WAAW;SACpB,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAE/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,8BAA8B,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAA,oBAAY,GAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE;YACrE,OAAO,EAAE,WAAW,CAAC,IAAI;YACzB,IAAI,EAAE;gBACJ,MAAM,EAAE,WAAW,CAAC,EAAE;gBACtB,MAAM,EAAE,WAAW,CAAC,OAAO;gBAC3B,MAAM;aACP;SACF,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE;YACrE,OAAO,EAAE,4BAA4B;YACrC,IAAI,EAAE;gBACJ,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,WAAW,CAAC,EAAE;aACvB;SACF,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,GAAG,kBAAS,CAAC,MAAM,CAAC;QAC9B,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC3B,GAAG,CAAC,cAAc,GAAG,SAAS,CAAC;QAC/B,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;QAC5B,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;QACtB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,QAAQ,GAAG;YACb,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvB,YAAY,EAAE;gBACZ,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,WAAW,CAAC,EAAE;gBACtB,MAAM;gBACN,QAAQ,EAAE,GAAG;aACd;SACF,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,OAAO,GAAG,CAAC,QAAQ,EAAE,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QACrH,MAAM,aAAa,GAAG,eAAe;YACnC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,CAAyB;YACxF,CAAC,CAAC,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACpD,CAAC;QACD,MAAM,cAAc,GAAoB;YACtC,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,IAAA,mCAA2B,EAAC,aAAa,CAAC,OAAO,CAAC;SAC7D,CAAC;QACF,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAExC,IAAI,KAAK,EACP,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YACzC,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,QAAQ,EAAE,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC;YACjD,YAAY,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;YACpH,MAAM,EAAE,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC;YACrD,YAAY,EAAE;gBACZ,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,WAAW,CAAC,EAAE;aACvB;YACD,OAAO,EAAE,OAAuB;SACjC,CAAC,EACF,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAC3F,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBAChD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;gBAC1F,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;gBACpD,GAAG;gBACH,MAAM;gBACN,SAAS;gBACT,SAAS,EAAE,cAAc;gBACzB,OAAO;aACR,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC5G,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,kBAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3G,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,kBAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;IAEO,eAAe,CAAC,KAA6B;QACnD,IACE,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU;eAChC,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU;eACnC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU;eACpC,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU;eACzC,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,EAC3C,CAAC;YACD,OAAO,KAA2B,CAAC;QACrC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAMvB;QACC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QACtE,MAAM,GAAG,GAAG,IAAA,oBAAY,GAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,GAAG,GAAkB;YACzB,EAAE,EAAE,IAAA,6BAAqB,EAAC;gBACxB,GAAG,EAAE,IAAA,kBAAU,EAAC,KAAK,CAAC;gBACtB,WAAW;gBACX,SAAS;gBACT,SAAS,EAAE,GAAG;aACf,CAAC;YACF,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC;YAC9C,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,WAAW;YACX,SAAS;YACT,MAAM,EAAE,kBAAS,CAAC,MAAM;YACxB,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE;YAC/E,MAAM;YACN,QAAQ,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,aAAa,EAAE,WAAW,CAAC,EAAE;gBAC7B,aAAa;gBACb,SAAS;aACV;YACD,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,OAAO,EAAE,OAAO,EAAE;YAC1D,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE;gBACJ,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB;SACF,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAkB,EAAE,OAAiB;QAChE,MAAM,GAAG,GAAG,IAAA,oBAAY,GAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,GAAG,kBAAS,CAAC,OAAO,CAAC;QAC/B,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,OAAO,EAAE,OAAO,EAAE;YAC1D,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,GAAkB,EAClB,MAA+B,EAC/B,OAAiB,EACjB,KAAc;QAEd,MAAM,GAAG,GAAG,IAAA,oBAAY,GAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;QACtB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;QAClB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,aAAa,CACtB,GAAG,EACH,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACtC,OAAO,EACP;YACE,OAAO,EAAE,KAAK,IAAI,OAAO,MAAM,EAAE;YACjC,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,GAAkB,EAClB,MAA+B,EAC/B,OAAiB,EACjB,OAAe;QAEf,MAAM,GAAG,GAAG,IAAA,oBAAY,GAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;QAC5B,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC;QACtB,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC3B,GAAG,CAAC,cAAc,GAAG,SAAS,CAAC;QAC/B,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC;QACpB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,CAAC,mBAAmB,CAChC,KAAwB,EACxB,KAMC;QAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QAE7D,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;YACjC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,UAAU,EAAE,OAAO,EAAE;gBAC7D,OAAO,EAAE,KAAK,CAAC,IAAI;gBACnB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;aAC5B,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,aAAa,EAAE,OAAO,EAAE;gBAChE,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE;oBACJ,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB;aACF,CAAC,CAAC;YACH,MAAM;gBACJ,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE;oBACN,WAAW,EAAE,uBAAuB;oBACpC,IAAI,EAAE;wBACJ,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;wBACd,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB;iBACF;aACF,CAAC;YACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,SAAS,EAAE,OAAO,EAAE;gBAC5D,OAAO,EAAE,KAAK,CAAC,IAAI;gBACnB,IAAI,EAAE;oBACJ,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B;aACF,CAAC,CAAC;YACH,MAAM,QAAQ,GAAuB;gBACnC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,kBAAkB,EAAE,MAAM,EAAE,OAAO,CAAC;gBAClE,SAAS,EAAE,MAAM,CAAC,EAAE;gBACpB,IAAI,EAAE,kBAAkB;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,SAAS;gBACxB,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE;oBACR,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,eAAe,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE;iBACnC;gBACD,UAAU,EAAE,IAAA,oBAAY,GAAE;aAC3B,CAAC;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAE7C,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnG,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC;YAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAC9C,GAAG,CAAC,QAAQ,GAAG;gBACb,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACvB,eAAe,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE;gBAClC,WAAW,EAAE;oBACX,MAAM,EAAE,QAAQ,CAAC,EAAE;oBACnB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB;aACF,CAAC;YACF,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,kBAAS,CAAC,aAAa,EAAE,OAAO,EAAE,mCAAmC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5G,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,0CAA0C,KAAK,CAAC,IAAI,EAAE;aAChE,CAAC;YACF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,cAAc,EAAE,OAAO,EAAE;gBACjE,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE;oBACJ,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B;aACF,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,kBAAS,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,wBAAW,CAAC,KAAK,EAAE,OAAO,EAAE;YACxD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACvE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,GAAkB,EAClB,SAAoB,EACpB,SAA0B,EAC1B,OAAiB;QAEjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC;QAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,kBAAS,CAAC,SAAS,EAAE,OAAO,EAAE,4BAA4B,CAAC,CAAC;QACtF,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,yBAAyB,CAAC,MAA+B;QAC/D,IAAI,MAAM,KAAK,kBAAS,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,wBAAW,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,KAAK,kBAAS,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,wBAAW,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO,MAAM,KAAK,kBAAS,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAW,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAW,CAAC,aAAa,CAAC;QACtG,CAAC;QACD,OAAO,wBAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,GAAkB,EAAE,OAAiB;QACzD,MAAM,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,GAAkB,EAClB,IAA+B,EAC/B,OAAiB,EACjB,UAGI,EAAE;QAEN,MAAM,SAAS,GAAG,IAAA,oBAAY,GAAE,CAAC;QACjC,MAAM,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;YACjC,EAAE,EAAE,IAAA,iCAAyB,EAAC;gBAC5B,GAAG,EAAE,IAAA,kBAAU,EAAC,UAAU,CAAC;gBAC3B,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,SAAS;aACV,CAAC;YACF,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC;YACrC,IAAI;YACJ,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS;SACV,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAEO,gBAAgB,CAAC,MAAsB,EAAE,OAAiB;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;QAC3B,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxD,OAAO,IAAA,8BAAsB,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,GAAG,UAAU,UAAU,WAAW,IAAI,SAAS,cAAc,QAAQ,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,mBAAmB,WAAW,IAAI,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC3G,CAAC;IAEO,aAAa,CAAC,GAAkB,EAAE,OAAiB;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,IAAA,8BAAsB,EAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAA,qBAAa,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,8BAA8B,CAC1C,IAAwB,EACxB,SAAoB,EACpB,OAAiB;QAEjB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC3C,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAChE,IAAI,GAAG,CAAC,MAAM,KAAK,kBAAS,CAAC,aAAa,EAAE,CAAC;gBAC3C,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,4BAA4B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/E,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC9C,MAAM;gBACN,MAAM,EAAE,kBAAS,CAAC,aAAa;gBAC/B,KAAK,EAAE,EAAE;aACV,EAAE,OAAO,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC;gBACvC,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAK,IAAY,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;YAC/E,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,sBAAsB,CAAC,SAAoB;QACjD,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,SAAS,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC,SAAS,CAAC;IAC7B,CAAC;IAEO,4BAA4B,CAAC,SAAoB,EAAE,OAAiB;QAC1E,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,CAAC,KAAyB,EAAQ,EAAE;YAC9C,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACxD,GAAG,CAAC,QAAQ,CAAC,CAAC;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAC5D,GAAG,CAAC,QAAQ,CAAC,CAAC;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAA,8BAAsB,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,2BAA2B,CAAC,QAAgB;QAClD,IAAI,wCAAwC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,SAAS,CAAC;YACzB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3B,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACnE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,uBAAuB,CAAC,IAAwB;QACtD,OAAO,gEAAgE,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IACpH,CAAC;IAEO,mCAAmC,CAAC,GAAkB;QAC5D,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC;QAClD,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,aAAmC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,IAAA,sBAAc,EAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE;gBACN,QAAQ,EAAE,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBAC3C,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;aAC5C;SACF,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,KAAc;QACjC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,WAAW,CAAC;IAC5F,CAAC;IAEO,gBAAgB,CAAC,MAAsB;QAC7C,IAAI,OAAO,MAAM,CAAC,QAAQ,EAAE,UAAU,KAAK,QAAQ,EAAE,CAAC;YACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QACpC,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjD,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QACjC,CAAC;QACD,OAAO,8BAAsB,CAAC;IAChC,CAAC;IAEO,iBAAiB,CAAC,OAAiB;QACzC,MAAM,IAAI,GAAI,OAAmC,CAAC,IAAuC,CAAC;QAC1F,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;YAChB,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC9C,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YACxE,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;YACvB,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,MAAsB,EACtB,OAAiB;QAEjB,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC;YACnE,SAAS,EAAE,MAAM,CAAC,EAAE;YACpB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAC5C,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,IAAA,oBAAY,GAAE;SAC3B,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAC9B,IAA0B,EAC1B,IAAY,EACZ,MAAkC;QAElC,OAAO;YACL,GAAG,IAAI;YACP,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YACxC,MAAM;SACP,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,MAAsB;QAChD,OAAO,IAAA,mBAAW,EAAC;YACjB,SAAS,EAAE,MAAM,CAAC,EAAE;YACpB,OAAO,EAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,8BAAsB;SACzG,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,SAAoB,EACpB,oBAA4B,EAC5B,OAAiB;QAEjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3F,MAAM,YAAY,GAA2E,EAAE,CAAC;QAEhG,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,EAAE,KAAK,oBAAoB,EAAE,CAAC;gBACrC,MAAM;YACR,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAA,8BAAsB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzD,IAAI,IAAI,EAAE,CAAC;oBACT,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxE,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACvE,MAAM,IAAI,GAAG,IAAA,mCAA2B,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9D,IAAI,IAAI,EAAE,CAAC;oBACT,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AA7wBD,wCA6wBC","sourcesContent":["import type { ChatKitStore, StoreContext } from '../chatkit/store';\nimport type {\n AssistantMessageItem,\n ClientEffect,\n ClientToolCallItem,\n ThreadItem,\n ThreadMetadata,\n ThreadRef,\n UserMessageItem,\n} from '../chatkit/types';\nimport {\n DEFAULT_THREAD_CHAT_ID,\n extractAssistantMessageText,\n extractUserMessageText,\n generateId,\n toThreadRef,\n nowTimestamp,\n} from '../chatkit/types';\nimport type { AgentRuntimeConfig, RunnerProtocol, RunnerType } from './AgentRuntimeTypes';\nimport type { AgentRuntimeEvent } from './AgentRuntimeTypes';\nimport { InngestRunExecutionBackend } from './InngestRunExecutionBackend';\nimport type { RunExecutionBackend } from './RunExecutionBackend';\nimport { isWorkspaceUri } from '../workspace/types';\nimport { XpodRunStepType as RunStepType, RunStatus } from './schema';\nimport {\n generateRunResourceId,\n generateRunStepResourceId,\n resolveDataResourceIri,\n resolveRunUrn,\n type RunRecordData,\n type RunStepRecordData,\n type RunStore,\n} from './store';\n\nexport type RunStateEvent =\n | { type: 'item_added'; item: ThreadItem }\n | { type: 'item_updated'; itemId: string; delta: string }\n | { type: 'item_done'; item: ThreadItem }\n | { type: 'client_effect'; effect: ClientEffect }\n | { type: 'error'; code: string; message: string };\n\nconst RUN_WAITING_STATUSES = new Set<string>([\n RunStatus.WAITING_INPUT,\n RunStatus.WAITING_RUNNER,\n]);\n\ntype ActiveAssistant = {\n item: AssistantMessageItem;\n fullText: string;\n};\n\ntype RuntimeProjectionResult =\n | { action: 'continue' }\n | { action: 'return' }\n | { action: 'error'; message: string };\n\nexport interface RunStateCenterOptions<TContext = StoreContext> {\n store: ChatKitStore<TContext>;\n enableAgentRuntime?: boolean;\n executionBackend?: RunExecutionBackend;\n}\n\n/**\n * Run is the xpod-side state center for Agent execution.\n *\n * ChatKit and Task APIs are command surfaces. They hand execution to this\n * center, which persists first-class Run/RunStep facts through the configured\n * RunStore while projecting visible output back to Thread/Message.\n */\nexport class RunStateCenter<TContext = StoreContext> {\n private readonly store: ChatKitStore<TContext>;\n private readonly runStore?: RunStore<TContext>;\n private readonly enableAgentRuntime: boolean;\n private readonly executionBackend: RunExecutionBackend;\n\n public constructor(options: RunStateCenterOptions<TContext>) {\n this.store = options.store;\n this.runStore = this.resolveRunStore(options.store);\n this.enableAgentRuntime = options.enableAgentRuntime ?? false;\n this.executionBackend = options.executionBackend ?? new InngestRunExecutionBackend();\n }\n\n public getAgentRuntimeConfig(thread: ThreadMetadata, context?: TContext): AgentRuntimeConfig | null {\n if (!this.enableAgentRuntime) {\n return null;\n }\n const runtime = (thread.metadata as any)?.runtime;\n if (!runtime) {\n return null;\n }\n if (!runtime.runner) {\n throw new Error('Invalid thread.metadata.runtime: runner is required');\n }\n const runnerType = runtime.runner.type as RunnerType;\n if (!runnerType) {\n throw new Error('Invalid thread.metadata.runtime.runner.type');\n }\n\n const protocol = this.resolveRunnerProtocol(runtime.runner.protocol);\n const allowCustomArgv = runtime.runner.allowCustomArgv === true;\n const argv = allowCustomArgv ? runtime.runner.argv : undefined;\n const workspace = this.resolveWorkspaceUri(thread.workspace);\n if (!workspace) {\n throw new Error('Invalid thread runtime: workspace URI is required');\n }\n\n return {\n ...runtime,\n workspace,\n runner: {\n ...runtime.runner,\n argv,\n protocol,\n },\n agentConfig: runtime.agentConfig,\n } as AgentRuntimeConfig;\n }\n\n public getDefaultAgentRuntimeConfig(context: TContext): AgentRuntimeConfig | null {\n if (!this.enableAgentRuntime) {\n return null;\n }\n return null;\n }\n\n private resolveRunnerProtocol(protocol: unknown): RunnerProtocol {\n if (protocol === 'acp' || protocol === 'pi') {\n return protocol;\n }\n return 'pi';\n }\n\n private resolveWorkspaceUri(threadWorkspace: AgentRuntimeConfig['workspace'] | undefined): AgentRuntimeConfig['workspace'] | undefined {\n return isWorkspaceUri(threadWorkspace) ? threadWorkspace : undefined;\n }\n\n public async *startAgentRun(input: {\n thread: ThreadMetadata;\n userMessage: UserMessageItem;\n context: TContext;\n runtimeConfig: AgentRuntimeConfig;\n }): AsyncIterable<RunStateEvent> {\n const { thread, userMessage, context, runtimeConfig } = input;\n const prompt = extractUserMessageText(userMessage.content);\n if (!prompt.trim()) {\n return;\n }\n\n const threadRef = this.threadRefFromThread(thread);\n const assistantItem = await this.createAssistantMessage(thread, context);\n const run = await this.createRun({\n thread,\n userMessage,\n prompt,\n runtimeConfig,\n context,\n });\n\n await this.store.addThreadItem(threadRef, assistantItem, context);\n yield { type: 'item_added', item: assistantItem };\n await this.markRunStarted(run, context);\n\n const assistantState: ActiveAssistant = { item: assistantItem, fullText: '' };\n let runtimeError: string | undefined;\n\n for await (\n const event of this.executionBackend.start({\n runId: run.id,\n threadId: thread.id,\n prompt,\n conversation: await this.loadConversation(threadRef, userMessage.id, context),\n config: runtimeConfig,\n context: context as StoreContext,\n })\n ) {\n const cancellation = await this.checkCancellation(run, threadRef, assistantState, context);\n if (cancellation) {\n yield { type: 'item_done', item: cancellation };\n yield { type: 'error', code: 'runtime_cancelled', message: 'Run cancellation requested' };\n return;\n }\n\n const result = yield* this.projectRuntimeEvent(event, {\n run,\n thread,\n threadRef,\n assistant: assistantState,\n context,\n });\n if (result.action === 'continue') {\n continue;\n }\n if (result.action === 'return') {\n return;\n }\n\n runtimeError = result.message;\n break;\n }\n\n const finalStatus = runtimeError ? 'incomplete' : 'completed';\n const finalItem = this.finalizeAssistantMessage(assistantState.item, assistantState.fullText, finalStatus);\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(\n run,\n runtimeError ? RunStatus.FAILED : RunStatus.COMPLETED,\n context,\n runtimeError,\n );\n yield { type: 'item_done', item: finalItem };\n }\n\n public async *completeClientToolOutput(input: {\n threadRef: ThreadRef;\n itemId: string;\n output: string;\n context: TContext;\n }): AsyncIterable<RunStateEvent> {\n const { threadRef, itemId, output, context } = input;\n const item = await this.store.loadItem(threadRef, itemId, context);\n if (item.type !== 'client_tool_call') {\n return;\n }\n\n const updatedItem: ClientToolCallItem = {\n ...item,\n output,\n status: 'completed',\n };\n await this.store.saveItem(threadRef, updatedItem, context);\n yield { type: 'item_done', item: updatedItem };\n\n const run = await this.resolveWaitingRunForToolOutput(updatedItem, threadRef, context);\n if (!run) {\n return;\n }\n\n const now = nowTimestamp();\n await this.appendRunStep(run, RunStepType.CLIENT_TOOL_OUTPUT, context, {\n message: updatedItem.name,\n data: {\n itemId: updatedItem.id,\n callId: updatedItem.call_id,\n output,\n },\n });\n await this.appendRunStep(run, RunStepType.CONTINUE_REQUESTED, context, {\n message: 'Run continuation requested',\n data: {\n kind: 'client_tool_output',\n itemId: updatedItem.id,\n },\n });\n run.status = RunStatus.QUEUED;\n run.leaseOwner = undefined;\n run.leaseExpiresAt = undefined;\n run.completedAt = undefined;\n run.error = undefined;\n run.updatedAt = now;\n run.metadata = {\n ...(run.metadata ?? {}),\n continuation: {\n kind: 'client_tool_output',\n itemId: updatedItem.id,\n output,\n queuedAt: now,\n },\n };\n await this.saveRun(run, context);\n\n const thread = await this.store.loadThread(threadRef, context);\n const assistantItemId = typeof run.metadata?.assistantItemId === 'string' ? run.metadata.assistantItemId : undefined;\n const assistantItem = assistantItemId\n ? await this.store.loadItem(threadRef, assistantItemId, context) as AssistantMessageItem\n : await this.createAssistantMessage(thread, context);\n if (!assistantItemId) {\n await this.store.addThreadItem(threadRef, assistantItem, context);\n yield { type: 'item_added', item: assistantItem };\n }\n const assistantState: ActiveAssistant = {\n item: assistantItem,\n fullText: extractAssistantMessageText(assistantItem.content),\n };\n await this.markRunStarted(run, context);\n\n for await (\n const event of this.executionBackend.start({\n runId: run.id,\n threadId: this.extractThreadIdFromRef(threadRef),\n prompt: this.buildContinuationPrompt(updatedItem),\n conversation: await this.loadConversation(threadRef, String(run.metadata?.userMessageId ?? updatedItem.id), context),\n config: this.resolveRuntimeConfigForContinuation(run),\n continuation: {\n kind: 'client_tool_output',\n itemId: updatedItem.id,\n },\n context: context as StoreContext,\n })\n ) {\n const cancellation = await this.checkCancellation(run, threadRef, assistantState, context);\n if (cancellation) {\n yield { type: 'item_done', item: cancellation };\n yield { type: 'error', code: 'runtime_cancelled', message: 'Run cancellation requested' };\n return;\n }\n\n const result = yield* this.projectRuntimeEvent(event, {\n run,\n thread,\n threadRef,\n assistant: assistantState,\n context,\n });\n if (result.action === 'continue') {\n continue;\n }\n if (result.action === 'return') {\n return;\n }\n const finalItem = this.finalizeAssistantMessage(assistantState.item, assistantState.fullText, 'incomplete');\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(run, RunStatus.FAILED, context, result.message);\n yield { type: 'item_done', item: finalItem };\n return;\n }\n\n const finalItem = this.finalizeAssistantMessage(assistantState.item, assistantState.fullText, 'completed');\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(run, RunStatus.COMPLETED, context);\n yield { type: 'item_done', item: finalItem };\n }\n\n private resolveRunStore(store: ChatKitStore<TContext>): RunStore<TContext> | undefined {\n if (\n typeof store.saveRun === 'function'\n && typeof store.loadRun === 'function'\n && typeof store.listRuns === 'function'\n && typeof store.appendRunStep === 'function'\n && typeof store.loadRunSteps === 'function'\n ) {\n return store as RunStore<TContext>;\n }\n return undefined;\n }\n\n private async createRun(input: {\n thread: ThreadMetadata;\n userMessage: UserMessageItem;\n prompt: string;\n runtimeConfig: AgentRuntimeConfig;\n context: TContext;\n }): Promise<RunRecordData> {\n const { thread, userMessage, prompt, runtimeConfig, context } = input;\n const now = nowTimestamp();\n const commandKind = thread.metadata?.commandKind === 'task' ? 'task' : 'chat';\n const surfaceId = this.resolveSurfaceId(thread);\n const run: RunRecordData = {\n id: generateRunResourceId({\n key: generateId('run'),\n commandKind,\n surfaceId,\n createdAt: now,\n }),\n thread: this.resolveThreadUri(thread, context),\n workspace: runtimeConfig.workspace,\n commandKind,\n surfaceId,\n status: RunStatus.QUEUED,\n runner: `${runtimeConfig.runner.protocol ?? 'pi'}:${runtimeConfig.runner.type}`,\n prompt,\n metadata: {\n threadId: thread.id,\n userMessageId: userMessage.id,\n runtimeConfig,\n surfaceId,\n },\n createdAt: now,\n updatedAt: now,\n };\n await this.saveRun(run, context);\n await this.appendRunStep(run, RunStepType.CREATED, context, {\n message: 'Run created',\n data: {\n commandKind: run.commandKind,\n thread: run.thread,\n workspace: run.workspace,\n runner: run.runner,\n },\n });\n return run;\n }\n\n private async markRunStarted(run: RunRecordData, context: TContext): Promise<void> {\n const now = nowTimestamp();\n run.status = RunStatus.RUNNING;\n run.startedAt = now;\n run.updatedAt = now;\n await this.saveRun(run, context);\n await this.appendRunStep(run, RunStepType.STARTED, context, {\n message: 'Run started',\n });\n }\n\n private async finishRun(\n run: RunRecordData,\n status: RunRecordData['status'],\n context: TContext,\n error?: string,\n ): Promise<void> {\n const now = nowTimestamp();\n run.status = status;\n run.completedAt = now;\n run.updatedAt = now;\n run.error = error;\n await this.saveRun(run, context);\n await this.appendRunStep(\n run,\n this.stepTypeForTerminalStatus(status),\n context,\n {\n message: error ?? `Run ${status}`,\n data: { status },\n },\n );\n }\n\n private async pauseRun(\n run: RunRecordData,\n status: RunRecordData['status'],\n context: TContext,\n message: string,\n ): Promise<void> {\n const now = nowTimestamp();\n run.status = status;\n run.completedAt = undefined;\n run.heartbeatAt = now;\n run.leaseOwner = undefined;\n run.leaseExpiresAt = undefined;\n run.updatedAt = now;\n run.error = message;\n await this.saveRun(run, context);\n }\n\n private async *projectRuntimeEvent(\n event: AgentRuntimeEvent,\n input: {\n run: RunRecordData;\n thread: ThreadMetadata;\n threadRef: ThreadRef;\n assistant: ActiveAssistant;\n context: TContext;\n },\n ): AsyncGenerator<RunStateEvent, RuntimeProjectionResult> {\n const { run, thread, threadRef, assistant, context } = input;\n\n if (event.type === 'text') {\n assistant.fullText += event.text;\n await this.appendRunStep(run, RunStepType.TEXT_DELTA, context, {\n message: event.text,\n data: { delta: event.text },\n });\n yield { type: 'item_updated', itemId: assistant.item.id, delta: event.text };\n return { action: 'continue' };\n }\n\n if (event.type === 'auth_required') {\n await this.appendRunStep(run, RunStepType.AUTH_REQUIRED, context, {\n message: event.message,\n data: {\n method: event.method,\n url: event.url,\n options: event.options,\n },\n });\n yield {\n type: 'client_effect',\n effect: {\n effect_type: 'runtime.auth_required',\n data: {\n method: event.method,\n url: event.url,\n message: event.message,\n options: event.options,\n },\n },\n };\n return { action: 'continue' };\n }\n\n if (event.type === 'tool_call') {\n await this.appendRunStep(run, RunStepType.TOOL_CALL, context, {\n message: event.name,\n data: {\n requestId: event.requestId,\n name: event.name,\n arguments: event.arguments,\n },\n });\n const toolItem: ClientToolCallItem = {\n id: this.store.generateItemId('client_tool_call', thread, context),\n thread_id: thread.id,\n type: 'client_tool_call',\n name: event.name,\n arguments: event.arguments,\n call_id: event.requestId,\n status: 'pending',\n metadata: {\n runId: run.id,\n assistantItemId: assistant.item.id,\n },\n created_at: nowTimestamp(),\n };\n await this.store.addThreadItem(threadRef, toolItem, context);\n yield { type: 'item_added', item: toolItem };\n\n const incomplete = this.finalizeAssistantMessage(assistant.item, assistant.fullText, 'incomplete');\n assistant.item = incomplete;\n await this.store.saveItem(threadRef, incomplete, context);\n yield { type: 'item_done', item: incomplete };\n run.metadata = {\n ...(run.metadata ?? {}),\n assistantItemId: assistant.item.id,\n waitingTool: {\n itemId: toolItem.id,\n requestId: event.requestId,\n name: event.name,\n },\n };\n await this.pauseRun(run, RunStatus.WAITING_INPUT, context, `Waiting for client tool output: ${event.name}`);\n yield {\n type: 'error',\n code: 'runtime_waiting_input',\n message: `Run is waiting for client tool output: ${event.name}`,\n };\n return { action: 'return' };\n }\n\n if (event.type === 'waiting_runner') {\n await this.appendRunStep(run, RunStepType.WAITING_RUNNER, context, {\n message: event.message,\n data: {\n workspace: event.workspace,\n },\n });\n yield { type: 'error', code: 'waiting_runner', message: event.message };\n await this.finishRun(run, RunStatus.WAITING_RUNNER, context, event.message);\n return { action: 'return' };\n }\n\n await this.appendRunStep(run, RunStepType.ERROR, context, {\n message: event.message,\n });\n yield { type: 'error', code: 'runtime_error', message: event.message };\n return { action: 'error', message: event.message };\n }\n\n private async checkCancellation(\n run: RunRecordData,\n threadRef: ThreadRef,\n assistant: ActiveAssistant,\n context: TContext,\n ): Promise<AssistantMessageItem | undefined> {\n if (!this.runStore?.loadRun) {\n return undefined;\n }\n const latest = await this.runStore.loadRun(run.id, context);\n if (!latest.cancelRequestedAt) {\n return undefined;\n }\n run.cancelRequestedAt = latest.cancelRequestedAt;\n const finalItem = this.finalizeAssistantMessage(assistant.item, assistant.fullText, 'incomplete');\n assistant.item = finalItem;\n await this.store.saveItem(threadRef, finalItem, context);\n await this.finishRun(run, RunStatus.CANCELLED, context, 'Run cancellation requested');\n return finalItem;\n }\n\n private stepTypeForTerminalStatus(status: RunRecordData['status']): RunStepRecordData['type'] {\n if (status === RunStatus.COMPLETED) {\n return RunStepType.COMPLETED;\n }\n if (status === RunStatus.CANCELLED) {\n return RunStepType.CANCELLED;\n }\n if (RUN_WAITING_STATUSES.has(status)) {\n return status === RunStatus.WAITING_RUNNER ? RunStepType.WAITING_RUNNER : RunStepType.WAITING_INPUT;\n }\n return RunStepType.FAILED;\n }\n\n private async saveRun(run: RunRecordData, context: TContext): Promise<void> {\n await this.runStore?.saveRun(run, context);\n }\n\n private async appendRunStep(\n run: RunRecordData,\n type: RunStepRecordData['type'],\n context: TContext,\n options: {\n message?: string;\n data?: Record<string, unknown>;\n } = {},\n ): Promise<void> {\n const createdAt = nowTimestamp();\n await this.runStore?.appendRunStep({\n id: generateRunStepResourceId({\n key: generateId('run-step'),\n runId: run.id,\n commandKind: run.commandKind,\n surfaceId: run.surfaceId,\n createdAt,\n }),\n commandKind: run.commandKind,\n surfaceId: run.surfaceId,\n runId: run.id,\n run: this.resolveRunUri(run, context),\n type,\n message: options.message,\n data: options.data,\n createdAt,\n }, context);\n }\n\n private resolveThreadUri(thread: ThreadMetadata, context: TContext): string {\n const threadId = thread.id;\n if (/^https?:\\/\\//.test(threadId)) {\n return threadId;\n }\n\n const commandKind = thread.metadata?.commandKind === 'task' ? 'task' : 'chat';\n const surfaceId = this.resolveSurfaceId(thread);\n const podBaseUrl = this.resolvePodBaseUrl(context);\n if (podBaseUrl) {\n if (threadId.includes('#') && !threadId.startsWith('#')) {\n return resolveDataResourceIri(podBaseUrl, threadId);\n }\n return `${podBaseUrl}/.data/${commandKind}/${surfaceId}/index.ttl#${threadId}`;\n }\n return `urn:xpod:thread:${commandKind}:${encodeURIComponent(surfaceId)}:${encodeURIComponent(threadId)}`;\n }\n\n private resolveRunUri(run: RunRecordData, context: TContext): string {\n const podBaseUrl = this.resolvePodBaseUrl(context);\n if (podBaseUrl) {\n return resolveDataResourceIri(podBaseUrl, run.id);\n }\n return resolveRunUrn(run.id);\n }\n\n private async resolveWaitingRunForToolOutput(\n item: ClientToolCallItem,\n threadRef: ThreadRef,\n context: TContext,\n ): Promise<RunRecordData | undefined> {\n const metadataRunId = item.metadata?.runId;\n if (typeof metadataRunId === 'string' && this.runStore?.loadRun) {\n const run = await this.runStore.loadRun(metadataRunId, context);\n if (run.status === RunStatus.WAITING_INPUT) {\n return run;\n }\n }\n\n if (!this.runStore?.listRuns) {\n return undefined;\n }\n\n const threadCandidates = this.threadCandidatesForRunLookup(threadRef, context);\n for (const thread of threadCandidates) {\n const candidates = await this.runStore.listRuns({\n thread,\n status: RunStatus.WAITING_INPUT,\n limit: 10,\n }, context);\n const match = candidates.find((run) => {\n const tool = run.metadata?.waitingTool;\n return !tool || typeof tool !== 'object' || (tool as any).itemId === item.id;\n }) ?? candidates[0];\n if (match) {\n return match;\n }\n }\n return undefined;\n }\n\n private extractThreadIdFromRef(threadRef: ThreadRef): string {\n if ('chat_id' in threadRef) {\n return threadRef.thread_id;\n }\n return threadRef.thread_id;\n }\n\n private threadCandidatesForRunLookup(threadRef: ThreadRef, context: TContext): string[] {\n const candidates: string[] = [];\n const add = (value: string | undefined): void => {\n if (value && !candidates.includes(value)) {\n candidates.push(value);\n }\n };\n\n const threadId = this.extractThreadIdFromRef(threadRef);\n add(threadId);\n const relative = this.extractBaseRelativeThreadId(threadId);\n add(relative);\n const podBaseUrl = this.resolvePodBaseUrl(context);\n if (podBaseUrl && relative) {\n add(resolveDataResourceIri(podBaseUrl, relative));\n }\n return candidates;\n }\n\n private extractBaseRelativeThreadId(threadId: string): string | undefined {\n if (/^(chat|task)\\/[^/]+\\/index\\.ttl#[^#]+$/.test(threadId)) {\n return threadId;\n }\n if (!/^https?:\\/\\//.test(threadId)) {\n return undefined;\n }\n try {\n const url = new URL(threadId);\n const marker = '/.data/';\n const index = url.pathname.indexOf(marker);\n if (index >= 0 && url.hash) {\n return `${url.pathname.slice(index + marker.length)}${url.hash}`;\n }\n } catch {\n return undefined;\n }\n return undefined;\n }\n\n private buildContinuationPrompt(item: ClientToolCallItem): string {\n return `Continue the previous run after client tool output.\\n\\nTool: ${item.name}\\nOutput:\\n${item.output ?? ''}`;\n }\n\n private resolveRuntimeConfigForContinuation(run: RunRecordData): AgentRuntimeConfig {\n const runtimeConfig = run.metadata?.runtimeConfig;\n if (runtimeConfig && typeof runtimeConfig === 'object') {\n return runtimeConfig as AgentRuntimeConfig;\n }\n if (!isWorkspaceUri(run.workspace)) {\n throw new Error('Run workspace URI is required');\n }\n const [protocol, type] = run.runner.split(':');\n return {\n workspace: run.workspace,\n runner: {\n protocol: protocol === 'acp' ? 'acp' : 'pi',\n type: this.isRunnerType(type) ? type : 'pi',\n },\n };\n }\n\n private isRunnerType(value: unknown): value is RunnerType {\n return value === 'pi' || value === 'codex' || value === 'claude' || value === 'codebuddy';\n }\n\n private resolveSurfaceId(thread: ThreadMetadata): string {\n if (typeof thread.metadata?.surface_id === 'string') {\n return thread.metadata.surface_id;\n }\n if (typeof thread.metadata?.chat_id === 'string') {\n return thread.metadata.chat_id;\n }\n return DEFAULT_THREAD_CHAT_ID;\n }\n\n private resolvePodBaseUrl(context: TContext): string | undefined {\n const auth = (context as Record<string, unknown>).auth as { webId?: unknown } | undefined;\n const webId = typeof auth?.webId === 'string' ? auth.webId : undefined;\n if (!webId) {\n return undefined;\n }\n try {\n const url = new URL(webId);\n url.hash = '';\n url.search = '';\n const normalizedPath = url.pathname.replace(/\\/+$/, '');\n if (!normalizedPath.endsWith('/profile/card')) {\n return undefined;\n }\n const podPath = normalizedPath.slice(0, -'/profile/card'.length) || '/';\n url.pathname = podPath;\n return url.toString().replace(/\\/$/, '');\n } catch {\n return undefined;\n }\n }\n\n private async createAssistantMessage(\n thread: ThreadMetadata,\n context: TContext,\n ): Promise<AssistantMessageItem> {\n return {\n id: this.store.generateItemId('assistant_message', thread, context),\n thread_id: thread.id,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n }\n\n private finalizeAssistantMessage(\n item: AssistantMessageItem,\n text: string,\n status: 'completed' | 'incomplete',\n ): AssistantMessageItem {\n return {\n ...item,\n content: [{ type: 'output_text', text }],\n status,\n };\n }\n\n private threadRefFromThread(thread: ThreadMetadata): ThreadRef {\n return toThreadRef({\n thread_id: thread.id,\n chat_id: typeof thread.metadata?.chat_id === 'string' ? thread.metadata.chat_id : DEFAULT_THREAD_CHAT_ID,\n });\n }\n\n private async loadConversation(\n threadRef: ThreadRef,\n currentUserMessageId: string,\n context: TContext,\n ): Promise<Array<{ role: 'user' | 'assistant'; text: string; createdAt: number }>> {\n const items = await this.store.loadThreadItems(threadRef, undefined, 1000, 'asc', context);\n const conversation: Array<{ role: 'user' | 'assistant'; text: string; createdAt: number }> = [];\n\n for (const item of items.data) {\n if (item.id === currentUserMessageId) {\n break;\n }\n if (item.type === 'user_message') {\n const text = extractUserMessageText(item.content).trim();\n if (text) {\n conversation.push({ role: 'user', text, createdAt: item.created_at });\n }\n continue;\n }\n if (item.type === 'assistant_message' && item.status !== 'in_progress') {\n const text = extractAssistantMessageText(item.content).trim();\n if (text) {\n conversation.push({ role: 'assistant', text, createdAt: item.created_at });\n }\n }\n }\n\n return conversation;\n }\n}\n"]}
|
package/dist/api/runtime.js
CHANGED
|
@@ -125,7 +125,12 @@ async function startEmbeddedInngestService(config, logger) {
|
|
|
125
125
|
sqliteDir: config.inngest?.sqliteDir,
|
|
126
126
|
});
|
|
127
127
|
const runtimeConfig = await service.start();
|
|
128
|
-
|
|
128
|
+
if (runtimeConfig.enabled) {
|
|
129
|
+
logger.info(`Inngest runtime configured: ${runtimeConfig.baseUrl}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
logger.info('Inngest runtime disabled');
|
|
133
|
+
}
|
|
129
134
|
return { service, runtimeConfig };
|
|
130
135
|
}
|
|
131
136
|
async function startApiService(options = {}) {
|
package/dist/api/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/api/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { asValue, type AwilixContainer } from 'awilix';\nimport { setGlobalLoggerFactory, getLoggerFor } from 'global-logger-factory';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { createApiContainer, loadConfigFromEnv, type ApiContainerConfig, type ApiContainerCradle } from './container';\nimport { registerRoutes } from './container/routes';\nimport type { AuthContext } from './auth/AuthContext';\nimport { OpenAuthMiddleware } from './middleware/OpenAuthMiddleware';\nimport type { RuntimeHost } from '../runtime/host/types';\nimport { EmbeddedInngestService, type EmbeddedInngestRuntimeConfig } from './runs/EmbeddedInngestService';\n\nexport interface StartApiServiceOptions {\n config?: ApiContainerConfig;\n open?: boolean;\n authContext?: AuthContext;\n initializeLogger?: boolean;\n runtimeHost?: RuntimeHost;\n}\n\nexport interface ApiServiceHandle {\n config: ApiContainerConfig;\n container: AwilixContainer<ApiContainerCradle>;\n inngestRuntimeConfig?: EmbeddedInngestRuntimeConfig;\n stop: () => Promise<void>;\n}\n\nfunction initApiLogger(): void {\n const loggerFactory = new ConfigurableLoggerFactory(process.env.CSS_LOGGING_LEVEL || 'info', {\n fileName: './logs/xpod-%DATE%.log',\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n\nasync function registerPrimaryServiceToken(\n container: AwilixContainer<ApiContainerCradle>,\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const serviceToken = process.env.XPOD_SERVICE_TOKEN;\n if (!serviceToken) {\n return;\n }\n\n const serviceTokenRepo = container.resolve('serviceTokenRepo') as any;\n const serviceType = config.edition === 'cloud' ? 'cloud' : 'local';\n const serviceId = process.env.XPOD_NODE_ID || (config.edition === 'cloud' ? 'cloud-1' : 'local-1');\n\n await serviceTokenRepo.registerToken(serviceToken, {\n serviceType,\n serviceId,\n scopes: ['quota:write', 'usage:read', 'account:manage'],\n });\n\n logger.info(`Registered service token for ${serviceType}:${serviceId}`);\n } catch (error) {\n logger.error(`Failed to register service token: ${error}`);\n }\n}\n\nasync function startBackgroundServices(\n container: AwilixContainer<ApiContainerCradle>,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true }) as any;\n if (localNetworkManager) {\n localNetworkManager.start();\n }\n } catch (error) {\n logger.error(`Failed to initialize LocalNetworkManager: ${error}`);\n }\n\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n if (ddnsManager) {\n await ddnsManager.start();\n logger.info('DDNS Manager started');\n }\n } catch (error) {\n logger.error(`Failed to initialize DdnsManager: ${error}`);\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n\n if (localTunnelProvider) {\n logger.info('Starting local tunnel provider...');\n const localPort = Number.parseInt(\n process.env.XPOD_MAIN_PORT ?? process.env.CSS_PORT ?? process.env.PORT ?? '3000',\n 10,\n );\n const config = await localTunnelProvider.setup({\n subdomain: 'local',\n localPort: Number.isFinite(localPort) && localPort > 0 ? localPort : 3000,\n localProtocol: 'http',\n });\n await localTunnelProvider.start(config);\n logger.info('Local tunnel provider started');\n }\n } catch (error) {\n logger.error(`Failed to start local tunnel provider: ${error}`);\n }\n}\n\nasync function stopBackgroundServices(container: AwilixContainer<ApiContainerCradle>): Promise<void> {\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n ddnsManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true });\n await localNetworkManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n await localTunnelProvider?.stop();\n } catch {\n // ignore shutdown errors\n }\n}\n\nfunction resolveApiBaseUrl(config: ApiContainerConfig): string {\n if (process.env.XPOD_API_BASE_URL) {\n return process.env.XPOD_API_BASE_URL;\n }\n if (process.env.CSS_BASE_URL) {\n return process.env.CSS_BASE_URL;\n }\n if (config.socketPath) {\n return 'http://localhost/';\n }\n return `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n}\n\nasync function startEmbeddedInngestService(\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<{ service: EmbeddedInngestService; runtimeConfig: EmbeddedInngestRuntimeConfig }> {\n const service = new EmbeddedInngestService({\n edition: config.edition,\n apiBaseUrl: resolveApiBaseUrl(config),\n databaseUrl: config.databaseUrl,\n redisUrl: config.redisUrl,\n enabled: config.inngest?.enabled,\n mode: config.inngest?.mode,\n host: config.inngest?.host,\n port: config.inngest?.port,\n baseUrl: config.inngest?.baseUrl,\n eventKey: config.inngest?.eventKey,\n signingKey: config.inngest?.signingKey,\n binaryPath: config.inngest?.binaryPath,\n sqliteDir: config.inngest?.sqliteDir,\n });\n const runtimeConfig = await service.start();\n logger.info(`Inngest runtime configured: ${runtimeConfig.baseUrl}`);\n return { service, runtimeConfig };\n}\n\nexport async function startApiService(options: StartApiServiceOptions = {}): Promise<ApiServiceHandle> {\n if (options.initializeLogger !== false) {\n initApiLogger();\n }\n\n const baseConfig = options.config ?? loadConfigFromEnv();\n const config = {\n ...baseConfig,\n runtimeHost: options.runtimeHost ?? baseConfig.runtimeHost,\n };\n const logger = getLoggerFor('ApiRuntime');\n\n if (!config.databaseUrl) {\n throw new Error('CSS_IDENTITY_DB_URL or DATABASE_URL environment variable is required');\n }\n\n logger.info(`Starting API Service (edition: ${config.edition})...`);\n\n const embeddedInngest = await startEmbeddedInngestService(config, logger);\n const container = createApiContainer({\n ...config,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n });\n\n if (options.open) {\n container.register({\n authMiddleware: asValue(new OpenAuthMiddleware({ context: options.authContext })),\n });\n }\n\n registerRoutes(container);\n await registerPrimaryServiceToken(container, config, logger);\n await startBackgroundServices(container, logger);\n\n const server = container.resolve('apiServer');\n await server.start();\n logger.info(`API Service active on ${config.socketPath ? `unix://${config.socketPath}` : `${config.host}:${config.port}`}`);\n\n return {\n config,\n container,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n stop: async(): Promise<void> => {\n logger.info('Stopping API Service...');\n await stopBackgroundServices(container);\n await server.stop();\n await embeddedInngest.service.stop();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/api/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { asValue, type AwilixContainer } from 'awilix';\nimport { setGlobalLoggerFactory, getLoggerFor } from 'global-logger-factory';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { createApiContainer, loadConfigFromEnv, type ApiContainerConfig, type ApiContainerCradle } from './container';\nimport { registerRoutes } from './container/routes';\nimport type { AuthContext } from './auth/AuthContext';\nimport { OpenAuthMiddleware } from './middleware/OpenAuthMiddleware';\nimport type { RuntimeHost } from '../runtime/host/types';\nimport { EmbeddedInngestService, type EmbeddedInngestRuntimeConfig } from './runs/EmbeddedInngestService';\n\nexport interface StartApiServiceOptions {\n config?: ApiContainerConfig;\n open?: boolean;\n authContext?: AuthContext;\n initializeLogger?: boolean;\n runtimeHost?: RuntimeHost;\n}\n\nexport interface ApiServiceHandle {\n config: ApiContainerConfig;\n container: AwilixContainer<ApiContainerCradle>;\n inngestRuntimeConfig?: EmbeddedInngestRuntimeConfig;\n stop: () => Promise<void>;\n}\n\nfunction initApiLogger(): void {\n const loggerFactory = new ConfigurableLoggerFactory(process.env.CSS_LOGGING_LEVEL || 'info', {\n fileName: './logs/xpod-%DATE%.log',\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n\nasync function registerPrimaryServiceToken(\n container: AwilixContainer<ApiContainerCradle>,\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const serviceToken = process.env.XPOD_SERVICE_TOKEN;\n if (!serviceToken) {\n return;\n }\n\n const serviceTokenRepo = container.resolve('serviceTokenRepo') as any;\n const serviceType = config.edition === 'cloud' ? 'cloud' : 'local';\n const serviceId = process.env.XPOD_NODE_ID || (config.edition === 'cloud' ? 'cloud-1' : 'local-1');\n\n await serviceTokenRepo.registerToken(serviceToken, {\n serviceType,\n serviceId,\n scopes: ['quota:write', 'usage:read', 'account:manage'],\n });\n\n logger.info(`Registered service token for ${serviceType}:${serviceId}`);\n } catch (error) {\n logger.error(`Failed to register service token: ${error}`);\n }\n}\n\nasync function startBackgroundServices(\n container: AwilixContainer<ApiContainerCradle>,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<void> {\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true }) as any;\n if (localNetworkManager) {\n localNetworkManager.start();\n }\n } catch (error) {\n logger.error(`Failed to initialize LocalNetworkManager: ${error}`);\n }\n\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n if (ddnsManager) {\n await ddnsManager.start();\n logger.info('DDNS Manager started');\n }\n } catch (error) {\n logger.error(`Failed to initialize DdnsManager: ${error}`);\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n\n if (localTunnelProvider) {\n logger.info('Starting local tunnel provider...');\n const localPort = Number.parseInt(\n process.env.XPOD_MAIN_PORT ?? process.env.CSS_PORT ?? process.env.PORT ?? '3000',\n 10,\n );\n const config = await localTunnelProvider.setup({\n subdomain: 'local',\n localPort: Number.isFinite(localPort) && localPort > 0 ? localPort : 3000,\n localProtocol: 'http',\n });\n await localTunnelProvider.start(config);\n logger.info('Local tunnel provider started');\n }\n } catch (error) {\n logger.error(`Failed to start local tunnel provider: ${error}`);\n }\n}\n\nasync function stopBackgroundServices(container: AwilixContainer<ApiContainerCradle>): Promise<void> {\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n ddnsManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localNetworkManager = container.resolve('localNetworkManager', { allowUnregistered: true });\n await localNetworkManager?.stop();\n } catch {\n // ignore shutdown errors\n }\n\n try {\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true }) as any;\n await localTunnelProvider?.stop();\n } catch {\n // ignore shutdown errors\n }\n}\n\nfunction resolveApiBaseUrl(config: ApiContainerConfig): string {\n if (process.env.XPOD_API_BASE_URL) {\n return process.env.XPOD_API_BASE_URL;\n }\n if (process.env.CSS_BASE_URL) {\n return process.env.CSS_BASE_URL;\n }\n if (config.socketPath) {\n return 'http://localhost/';\n }\n return `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n}\n\nasync function startEmbeddedInngestService(\n config: ApiContainerConfig,\n logger: ReturnType<typeof getLoggerFor>,\n): Promise<{ service: EmbeddedInngestService; runtimeConfig: EmbeddedInngestRuntimeConfig }> {\n const service = new EmbeddedInngestService({\n edition: config.edition,\n apiBaseUrl: resolveApiBaseUrl(config),\n databaseUrl: config.databaseUrl,\n redisUrl: config.redisUrl,\n enabled: config.inngest?.enabled,\n mode: config.inngest?.mode,\n host: config.inngest?.host,\n port: config.inngest?.port,\n baseUrl: config.inngest?.baseUrl,\n eventKey: config.inngest?.eventKey,\n signingKey: config.inngest?.signingKey,\n binaryPath: config.inngest?.binaryPath,\n sqliteDir: config.inngest?.sqliteDir,\n });\n const runtimeConfig = await service.start();\n if (runtimeConfig.enabled) {\n logger.info(`Inngest runtime configured: ${runtimeConfig.baseUrl}`);\n } else {\n logger.info('Inngest runtime disabled');\n }\n return { service, runtimeConfig };\n}\n\nexport async function startApiService(options: StartApiServiceOptions = {}): Promise<ApiServiceHandle> {\n if (options.initializeLogger !== false) {\n initApiLogger();\n }\n\n const baseConfig = options.config ?? loadConfigFromEnv();\n const config = {\n ...baseConfig,\n runtimeHost: options.runtimeHost ?? baseConfig.runtimeHost,\n };\n const logger = getLoggerFor('ApiRuntime');\n\n if (!config.databaseUrl) {\n throw new Error('CSS_IDENTITY_DB_URL or DATABASE_URL environment variable is required');\n }\n\n logger.info(`Starting API Service (edition: ${config.edition})...`);\n\n const embeddedInngest = await startEmbeddedInngestService(config, logger);\n const container = createApiContainer({\n ...config,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n });\n\n if (options.open) {\n container.register({\n authMiddleware: asValue(new OpenAuthMiddleware({ context: options.authContext })),\n });\n }\n\n registerRoutes(container);\n await registerPrimaryServiceToken(container, config, logger);\n await startBackgroundServices(container, logger);\n\n const server = container.resolve('apiServer');\n await server.start();\n logger.info(`API Service active on ${config.socketPath ? `unix://${config.socketPath}` : `${config.host}:${config.port}`}`);\n\n return {\n config,\n container,\n inngestRuntimeConfig: embeddedInngest.runtimeConfig,\n stop: async(): Promise<void> => {\n logger.info('Stopping API Service...');\n await stopBackgroundServices(container);\n await server.stop();\n await embeddedInngest.service.stop();\n },\n };\n}\n"]}
|