@heddleagent/execution-host-client 7.0.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -34
- package/dist/cli/hostctl.d.ts +11 -0
- package/dist/cli/hostctl.d.ts.map +1 -0
- package/dist/cli/hostctl.js +49 -0
- package/dist/cli/hostctl.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +9 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/coordinator/contracts.d.ts +148 -5
- package/dist/coordinator/contracts.d.ts.map +1 -1
- package/dist/coordinator/contracts.js +74 -3
- package/dist/coordinator/contracts.js.map +1 -1
- package/dist/coordinator/hosted-heartbeat-execution-client.d.ts +30 -0
- package/dist/coordinator/hosted-heartbeat-execution-client.d.ts.map +1 -0
- package/dist/coordinator/hosted-heartbeat-execution-client.js +240 -0
- package/dist/coordinator/hosted-heartbeat-execution-client.js.map +1 -0
- package/dist/coordinator/hosted-heartbeat-execution-service.d.ts +14 -0
- package/dist/coordinator/hosted-heartbeat-execution-service.d.ts.map +1 -0
- package/dist/coordinator/hosted-heartbeat-execution-service.js +100 -0
- package/dist/coordinator/hosted-heartbeat-execution-service.js.map +1 -0
- package/dist/coordinator/index.d.ts +5 -5
- package/dist/coordinator/index.d.ts.map +1 -1
- package/dist/coordinator/index.js +3 -3
- package/dist/coordinator/index.js.map +1 -1
- package/dist/coordinator/node/execution-http-service.d.ts +11 -0
- package/dist/coordinator/node/execution-http-service.d.ts.map +1 -0
- package/dist/coordinator/node/{delegation-http-service.js → execution-http-service.js} +52 -39
- package/dist/coordinator/node/execution-http-service.js.map +1 -0
- package/dist/coordinator/node/index.d.ts +2 -2
- package/dist/coordinator/node/index.d.ts.map +1 -1
- package/dist/coordinator/node/index.js +1 -1
- package/dist/coordinator/node/index.js.map +1 -1
- package/dist/coordinator/node/types.d.ts +10 -9
- package/dist/coordinator/node/types.d.ts.map +1 -1
- package/dist/coordinator/node/types.js.map +1 -1
- package/dist/coordinator/types.d.ts +51 -13
- package/dist/coordinator/types.d.ts.map +1 -1
- package/dist/coordinator/types.js.map +1 -1
- package/dist/host/schemas.d.ts.map +1 -1
- package/dist/host/schemas.js +2 -7
- package/dist/host/schemas.js.map +1 -1
- package/dist/http-sse/direct-http-execution-host.d.ts.map +1 -1
- package/dist/http-sse/direct-http-execution-host.js +6 -5
- package/dist/http-sse/direct-http-execution-host.js.map +1 -1
- package/dist/http-sse/types.d.ts +2 -0
- package/dist/http-sse/types.d.ts.map +1 -1
- package/dist/http-sse/types.js.map +1 -1
- package/dist/node/authority-key.d.ts.map +1 -1
- package/dist/node/authority-key.js +24 -49
- package/dist/node/authority-key.js.map +1 -1
- package/dist/node/environment-value.d.ts +17 -0
- package/dist/node/environment-value.d.ts.map +1 -0
- package/dist/node/environment-value.js +78 -0
- package/dist/node/environment-value.js.map +1 -0
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +2 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/local-credential-bundle.d.ts +33 -0
- package/dist/node/local-credential-bundle.d.ts.map +1 -0
- package/dist/node/local-credential-bundle.js +196 -0
- package/dist/node/local-credential-bundle.js.map +1 -0
- package/dist/node/owner-only-file.d.ts +17 -0
- package/dist/node/owner-only-file.d.ts.map +1 -0
- package/dist/node/owner-only-file.js +59 -0
- package/dist/node/owner-only-file.js.map +1 -0
- package/package.json +5 -1
- package/dist/coordinator/hosted-heartbeat-delegation-client.d.ts +0 -21
- package/dist/coordinator/hosted-heartbeat-delegation-client.d.ts.map +0 -1
- package/dist/coordinator/hosted-heartbeat-delegation-client.js +0 -117
- package/dist/coordinator/hosted-heartbeat-delegation-client.js.map +0 -1
- package/dist/coordinator/hosted-heartbeat-delegation-service.d.ts +0 -15
- package/dist/coordinator/hosted-heartbeat-delegation-service.d.ts.map +0 -1
- package/dist/coordinator/hosted-heartbeat-delegation-service.js +0 -81
- package/dist/coordinator/hosted-heartbeat-delegation-service.js.map +0 -1
- package/dist/coordinator/node/delegation-http-service.d.ts +0 -11
- package/dist/coordinator/node/delegation-http-service.d.ts.map +0 -1
- package/dist/coordinator/node/delegation-http-service.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-heartbeat-execution-service.js","sourceRoot":"","sources":["../../src/coordinator/hosted-heartbeat-execution-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACL,+BAA+B,EAC/B,yCAAyC,EACzC,iDAAiD,EACjD,gDAAgD,EAChD,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GAMzC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAMpE,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,uBAAuB,EAAE,cAAc;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC;CACzE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ;;;;GAIG;AACH,MAAM,OAAO,+BAA+B;IAEjC,UAAU,CAAqD;IAC/D,UAAU,CAAqD;IAC/D,wBAAwB,CAAS;IACjC,eAAe,CAAS;IACxB,IAAI,CAAa;IAE1B,YAAY,MAA6C;QACvD,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC;YAChD,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;YACvD,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC,uBAAuB,CAAC;QAC/D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,QAAoD,EACpD,SAAuB;QAEvB,MAAM,KAAK,GAAG,gDAAgD,CAAC,KAAK,CAClE,QAAQ,CACT,CAAC;QACF,MAAM,MAAM,GAAG,SAAS,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC;QACzD,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,iDAAiD,CAAC,KAAK,CACtE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CACpD,CAAC;QACF,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,yCAAyC,CAAC,KAAK,CAAC;gBACrD,aAAa,EAAE,CAAC;gBAChB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,yCAAyC,CAAC,KAAK,CAAC;YACrD,aAAa,EAAE,CAAC;YAChB,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC;SACxE,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CACV,QAAmD,EACnD,SAAuB;QAEvB,MAAM,KAAK,GAAG,+CAA+C,CAAC,KAAK,CACjE,QAAQ,CACT,CAAC;QACF,MAAM,MAAM,GAAG,SAAS,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC;QACzD,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,yCAAyC,CAAC,KAAK,CACjE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CACnD,CAAC;QACF,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,wCAAwC,CAAC,KAAK,CAAC;YACpD,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,KAAiD,EACjD,aAGkB;QAElB,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;YACpD,SAAS,EAAE,IAAI,CAAC,wBAAwB;YACxC,KAAK,EAAE,aAAa,CAAC,KAAK;SAC3B,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAClC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC;aACxC,WAAW,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YACzC,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,gBAAgB;YAChB,YAAY,EAAE,KAAK,CAAC,WAAW;YAC/B,QAAQ,EAAE,uBAAuB;YACjC,GAAG,EAAE,EAAE,YAAY,EAAE,aAAa,CAAC,YAAY,EAAE;SAClD,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;QACJ,CAAC;QAED,OAAO,+BAA+B,CAAC,KAAK,CAAC;YAC3C,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,gBAAgB;YAChB,UAAU;YACV,SAAS,EAAE;gBACT,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,EAAE;gBAC/C,aAAa;aACd;SACF,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import dayjs from 'dayjs';\nimport { z } from 'zod';\nimport { HEARTBEAT_TASK_WORKFLOW, OpaqueIdSchema } from '../contracts/index.js';\nimport {\n HostedHeartbeatDelegationSchema,\n HostedHeartbeatExecutionDispositionSchema,\n HostedHeartbeatExecutionPreparationDecisionSchema,\n HostedHeartbeatExecutionPreparationRequestSchema,\n HostedHeartbeatExecutionPreparationSchema,\n HostedHeartbeatExecutionSettlementRequestSchema,\n HostedHeartbeatExecutionSettlementSchema,\n type HostedHeartbeatDelegation,\n type HostedHeartbeatExecutionPreparation,\n type HostedHeartbeatExecutionPreparationRequest,\n type HostedHeartbeatExecutionSettlement,\n type HostedHeartbeatExecutionSettlementRequest,\n} from './contracts.js';\nimport { createHostedRuntimeSessionId } from './runtime-session.js';\nimport type {\n HostedHeartbeatExecutionApi,\n HostedHeartbeatExecutionServiceConfig,\n} from './types.js';\n\nconst ExecutionServiceConfigSchema = z.object({\n runtimeSessionNamespace: OpaqueIdSchema,\n maxExecutionMs: z.number().int().min(1_000).max(Number.MAX_SAFE_INTEGER),\n}).strict();\n\n/**\n * Owns the generic product lifecycle edge for one Coordinator execution.\n * Product code decides whether work exists and how it settles; this service\n * alone constructs the Heddle authority bundle used by the Execution Host.\n */\nexport class HostedHeartbeatExecutionService\nimplements HostedHeartbeatExecutionApi {\n readonly #authority: HostedHeartbeatExecutionServiceConfig['authority'];\n readonly #lifecycle: HostedHeartbeatExecutionServiceConfig['lifecycle'];\n readonly #runtimeSessionNamespace: string;\n readonly #maxExecutionMs: number;\n readonly #now: () => Date;\n\n constructor(config: HostedHeartbeatExecutionServiceConfig) {\n const parsed = ExecutionServiceConfigSchema.parse({\n runtimeSessionNamespace: config.runtimeSessionNamespace,\n maxExecutionMs: config.maxExecutionMs,\n });\n this.#authority = config.authority;\n this.#lifecycle = config.lifecycle;\n this.#runtimeSessionNamespace = parsed.runtimeSessionNamespace;\n this.#maxExecutionMs = parsed.maxExecutionMs;\n this.#now = config.now ?? (() => new Date());\n }\n\n async prepare(\n rawInput: HostedHeartbeatExecutionPreparationRequest,\n rawSignal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionPreparation> {\n const input = HostedHeartbeatExecutionPreparationRequestSchema.parse(\n rawInput,\n );\n const signal = rawSignal ?? new AbortController().signal;\n signal.throwIfAborted();\n const decision = HostedHeartbeatExecutionPreparationDecisionSchema.parse(\n await this.#lifecycle.prepare({ ...input, signal }),\n );\n signal.throwIfAborted();\n if (decision.kind === 'skip') {\n return HostedHeartbeatExecutionPreparationSchema.parse({\n schemaVersion: 1,\n kind: 'skip',\n taskId: input.taskId,\n executionId: input.executionId,\n summary: decision.summary,\n });\n }\n\n return HostedHeartbeatExecutionPreparationSchema.parse({\n schemaVersion: 1,\n kind: 'execute',\n delegation: await this.#createDelegation(input, decision.authorization),\n });\n }\n\n async settle(\n rawInput: HostedHeartbeatExecutionSettlementRequest,\n rawSignal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionSettlement> {\n const input = HostedHeartbeatExecutionSettlementRequestSchema.parse(\n rawInput,\n );\n const signal = rawSignal ?? new AbortController().signal;\n signal.throwIfAborted();\n const disposition = HostedHeartbeatExecutionDispositionSchema.parse(\n await this.#lifecycle.settle({ ...input, signal }),\n );\n signal.throwIfAborted();\n return HostedHeartbeatExecutionSettlementSchema.parse({\n schemaVersion: 1,\n taskId: input.taskId,\n executionId: input.executionId,\n disposition,\n });\n }\n\n async #createDelegation(\n input: HostedHeartbeatExecutionPreparationRequest,\n authorization: Extract<\n z.infer<typeof HostedHeartbeatExecutionPreparationDecisionSchema>,\n { kind: 'execute' }\n >['authorization'],\n ): Promise<HostedHeartbeatDelegation> {\n const runtimeSessionId = createHostedRuntimeSessionId({\n namespace: this.#runtimeSessionNamespace,\n scope: authorization.scope,\n });\n const deadlineAt = dayjs(this.#now())\n .add(this.#maxExecutionMs, 'millisecond')\n .toISOString();\n const issued = await this.#authority.issue({\n scope: authorization.scope,\n runtimeSessionId,\n invocationId: input.executionId,\n workflow: HEARTBEAT_TASK_WORKFLOW,\n mcp: { allowedTools: authorization.allowedTools },\n });\n const mcpCapability = issued.mcpCapability();\n if (!mcpCapability || !issued.metadata.mcp) {\n throw new Error(\n 'Hosted heartbeat execution requires an MCP-capable authority.',\n );\n }\n\n return HostedHeartbeatDelegationSchema.parse({\n schemaVersion: 1,\n taskId: input.taskId,\n executionId: input.executionId,\n scope: authorization.scope,\n runtimeSessionId,\n deadlineAt,\n authority: {\n metadata: issued.metadata,\n executionAssertion: issued.executionAssertion(),\n mcpCapability,\n },\n });\n }\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { HOSTED_HEARTBEAT_COORDINATOR_PATHS,
|
|
2
|
-
export type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorRunView, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView, HostedHeartbeatDelegation,
|
|
1
|
+
export { HOSTED_HEARTBEAT_COORDINATOR_PATHS, HOSTED_HEARTBEAT_EXECUTION_PATHS, HostedHeartbeatCoordinatorRunViewSchema, HostedHeartbeatCoordinatorStateResponseSchema, HostedHeartbeatCoordinatorStateSchema, HostedHeartbeatCoordinatorTaskDetailSchema, HostedHeartbeatCoordinatorTaskInputSchema, HostedHeartbeatCoordinatorTaskListSchema, HostedHeartbeatCoordinatorTaskResultSchema, HostedHeartbeatCoordinatorTaskStatusSchema, HostedHeartbeatCoordinatorTaskViewSchema, HostedHeartbeatDelegationSchema, HostedHeartbeatExecutionAuthorizationSchema, HostedHeartbeatExecutionDispositionSchema, HostedHeartbeatExecutionPreparationDecisionSchema, HostedHeartbeatExecutionPreparationRequestSchema, HostedHeartbeatExecutionPreparationSchema, HostedHeartbeatExecutionResultSchema, HostedHeartbeatExecutionSettlementRequestSchema, HostedHeartbeatExecutionSettlementSchema, HostedHeartbeatDesiredTaskCatalogSchema, HostedHeartbeatDesiredTaskSchema, } from './contracts.js';
|
|
2
|
+
export type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorRunView, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView, HostedHeartbeatDelegation, HostedHeartbeatExecutionAuthorization, HostedHeartbeatExecutionDisposition, HostedHeartbeatExecutionPreparation, HostedHeartbeatExecutionPreparationDecision, HostedHeartbeatExecutionPreparationRequest, HostedHeartbeatExecutionResult, HostedHeartbeatExecutionSettlement, HostedHeartbeatExecutionSettlementRequest, HostedHeartbeatDesiredTask, HostedHeartbeatDesiredTaskCatalog, } from './contracts.js';
|
|
3
3
|
export { HostedHeartbeatCoordinatorClient, HostedHeartbeatCoordinatorRequestError, } from './hosted-heartbeat-coordinator-client.js';
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
4
|
+
export { HostedHeartbeatDelegatedExecution, HostedHeartbeatExecutionClient, HostedHeartbeatExecutionRequestError, } from './hosted-heartbeat-execution-client.js';
|
|
5
|
+
export { HostedHeartbeatExecutionService, } from './hosted-heartbeat-execution-service.js';
|
|
6
6
|
export { HostedHeartbeatTaskReconciler } from './hosted-heartbeat-task-reconciler.js';
|
|
7
7
|
export { createHostedRuntimeSessionId } from './runtime-session.js';
|
|
8
|
-
export type { HostedHeartbeatCoordinatorClientConfig, HostedHeartbeatCoordinatorTaskApi,
|
|
8
|
+
export type { HostedHeartbeatCoordinatorClientConfig, HostedHeartbeatCoordinatorTaskApi, HostedHeartbeatCoordinatorExecutionContext, HostedHeartbeatDelegatedExecutionConfig, HostedHeartbeatExecutionTransportPort, HostedHeartbeatExecutionApi, HostedHeartbeatExecutionClientConfig, HostedHeartbeatExecutionPreparationInput, HostedHeartbeatExecutionServiceConfig, HostedHeartbeatExecutionSettlementInput, HostedHeartbeatProductExecutionLifecycle, HostedHeartbeatTaskReconcilerConfig, HostedHeartbeatTaskReconciliation, HostedHeartbeatTaskReconciliationInput, } from './types.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,gCAAgC,EAChC,uCAAuC,EACvC,6CAA6C,EAC7C,qCAAqC,EACrC,0CAA0C,EAC1C,yCAAyC,EACzC,wCAAwC,EACxC,0CAA0C,EAC1C,0CAA0C,EAC1C,wCAAwC,EACxC,+BAA+B,EAC/B,2CAA2C,EAC3C,yCAAyC,EACzC,iDAAiD,EACjD,gDAAgD,EAChD,yCAAyC,EACzC,oCAAoC,EACpC,+CAA+C,EAC/C,wCAAwC,EACxC,uCAAuC,EACvC,gCAAgC,GACjC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mCAAmC,EACnC,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,kCAAkC,EAClC,yBAAyB,EACzB,qCAAqC,EACrC,mCAAmC,EACnC,mCAAmC,EACnC,2CAA2C,EAC3C,0CAA0C,EAC1C,8BAA8B,EAC9B,kCAAkC,EAClC,yCAAyC,EACzC,0BAA0B,EAC1B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,oCAAoC,GACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,+BAA+B,GAChC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EACV,sCAAsC,EACtC,iCAAiC,EACjC,0CAA0C,EAC1C,uCAAuC,EACvC,qCAAqC,EACrC,2BAA2B,EAC3B,oCAAoC,EACpC,wCAAwC,EACxC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,EACxC,mCAAmC,EACnC,iCAAiC,EACjC,sCAAsC,GACvC,MAAM,YAAY,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { HOSTED_HEARTBEAT_COORDINATOR_PATHS,
|
|
1
|
+
export { HOSTED_HEARTBEAT_COORDINATOR_PATHS, HOSTED_HEARTBEAT_EXECUTION_PATHS, HostedHeartbeatCoordinatorRunViewSchema, HostedHeartbeatCoordinatorStateResponseSchema, HostedHeartbeatCoordinatorStateSchema, HostedHeartbeatCoordinatorTaskDetailSchema, HostedHeartbeatCoordinatorTaskInputSchema, HostedHeartbeatCoordinatorTaskListSchema, HostedHeartbeatCoordinatorTaskResultSchema, HostedHeartbeatCoordinatorTaskStatusSchema, HostedHeartbeatCoordinatorTaskViewSchema, HostedHeartbeatDelegationSchema, HostedHeartbeatExecutionAuthorizationSchema, HostedHeartbeatExecutionDispositionSchema, HostedHeartbeatExecutionPreparationDecisionSchema, HostedHeartbeatExecutionPreparationRequestSchema, HostedHeartbeatExecutionPreparationSchema, HostedHeartbeatExecutionResultSchema, HostedHeartbeatExecutionSettlementRequestSchema, HostedHeartbeatExecutionSettlementSchema, HostedHeartbeatDesiredTaskCatalogSchema, HostedHeartbeatDesiredTaskSchema, } from './contracts.js';
|
|
2
2
|
export { HostedHeartbeatCoordinatorClient, HostedHeartbeatCoordinatorRequestError, } from './hosted-heartbeat-coordinator-client.js';
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
3
|
+
export { HostedHeartbeatDelegatedExecution, HostedHeartbeatExecutionClient, HostedHeartbeatExecutionRequestError, } from './hosted-heartbeat-execution-client.js';
|
|
4
|
+
export { HostedHeartbeatExecutionService, } from './hosted-heartbeat-execution-service.js';
|
|
5
5
|
export { HostedHeartbeatTaskReconciler } from './hosted-heartbeat-task-reconciler.js';
|
|
6
6
|
export { createHostedRuntimeSessionId } from './runtime-session.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,gCAAgC,EAChC,uCAAuC,EACvC,6CAA6C,EAC7C,qCAAqC,EACrC,0CAA0C,EAC1C,yCAAyC,EACzC,wCAAwC,EACxC,0CAA0C,EAC1C,0CAA0C,EAC1C,wCAAwC,EACxC,+BAA+B,EAC/B,2CAA2C,EAC3C,yCAAyC,EACzC,iDAAiD,EACjD,gDAAgD,EAChD,yCAAyC,EACzC,oCAAoC,EACpC,+CAA+C,EAC/C,wCAAwC,EACxC,uCAAuC,EACvC,gCAAgC,GACjC,MAAM,gBAAgB,CAAC;AAmBxB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,oCAAoC,GACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,+BAA+B,GAChC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export {\n HOSTED_HEARTBEAT_COORDINATOR_PATHS,\n HOSTED_HEARTBEAT_EXECUTION_PATHS,\n HostedHeartbeatCoordinatorRunViewSchema,\n HostedHeartbeatCoordinatorStateResponseSchema,\n HostedHeartbeatCoordinatorStateSchema,\n HostedHeartbeatCoordinatorTaskDetailSchema,\n HostedHeartbeatCoordinatorTaskInputSchema,\n HostedHeartbeatCoordinatorTaskListSchema,\n HostedHeartbeatCoordinatorTaskResultSchema,\n HostedHeartbeatCoordinatorTaskStatusSchema,\n HostedHeartbeatCoordinatorTaskViewSchema,\n HostedHeartbeatDelegationSchema,\n HostedHeartbeatExecutionAuthorizationSchema,\n HostedHeartbeatExecutionDispositionSchema,\n HostedHeartbeatExecutionPreparationDecisionSchema,\n HostedHeartbeatExecutionPreparationRequestSchema,\n HostedHeartbeatExecutionPreparationSchema,\n HostedHeartbeatExecutionResultSchema,\n HostedHeartbeatExecutionSettlementRequestSchema,\n HostedHeartbeatExecutionSettlementSchema,\n HostedHeartbeatDesiredTaskCatalogSchema,\n HostedHeartbeatDesiredTaskSchema,\n} from './contracts.js';\nexport type {\n HostedHeartbeatCoordinatorTaskInput,\n HostedHeartbeatCoordinatorRunView,\n HostedHeartbeatCoordinatorState,\n HostedHeartbeatCoordinatorTaskDetail,\n HostedHeartbeatCoordinatorTaskView,\n HostedHeartbeatDelegation,\n HostedHeartbeatExecutionAuthorization,\n HostedHeartbeatExecutionDisposition,\n HostedHeartbeatExecutionPreparation,\n HostedHeartbeatExecutionPreparationDecision,\n HostedHeartbeatExecutionPreparationRequest,\n HostedHeartbeatExecutionResult,\n HostedHeartbeatExecutionSettlement,\n HostedHeartbeatExecutionSettlementRequest,\n HostedHeartbeatDesiredTask,\n HostedHeartbeatDesiredTaskCatalog,\n} from './contracts.js';\nexport {\n HostedHeartbeatCoordinatorClient,\n HostedHeartbeatCoordinatorRequestError,\n} from './hosted-heartbeat-coordinator-client.js';\nexport {\n HostedHeartbeatDelegatedExecution,\n HostedHeartbeatExecutionClient,\n HostedHeartbeatExecutionRequestError,\n} from './hosted-heartbeat-execution-client.js';\nexport {\n HostedHeartbeatExecutionService,\n} from './hosted-heartbeat-execution-service.js';\nexport { HostedHeartbeatTaskReconciler } from './hosted-heartbeat-task-reconciler.js';\nexport { createHostedRuntimeSessionId } from './runtime-session.js';\nexport type {\n HostedHeartbeatCoordinatorClientConfig,\n HostedHeartbeatCoordinatorTaskApi,\n HostedHeartbeatCoordinatorExecutionContext,\n HostedHeartbeatDelegatedExecutionConfig,\n HostedHeartbeatExecutionTransportPort,\n HostedHeartbeatExecutionApi,\n HostedHeartbeatExecutionClientConfig,\n HostedHeartbeatExecutionPreparationInput,\n HostedHeartbeatExecutionServiceConfig,\n HostedHeartbeatExecutionSettlementInput,\n HostedHeartbeatProductExecutionLifecycle,\n HostedHeartbeatTaskReconcilerConfig,\n HostedHeartbeatTaskReconciliation,\n HostedHeartbeatTaskReconciliationInput,\n} from './types.js';\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { NodeHostedHeartbeatExecutionHttpHandler, NodeHostedHeartbeatExecutionHttpServiceConfig } from './types.js';
|
|
3
|
+
/** Standard authenticated Node HTTP edge for product-owned work lifecycle. */
|
|
4
|
+
export declare class NodeHostedHeartbeatExecutionHttpService implements NodeHostedHeartbeatExecutionHttpHandler {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(config: NodeHostedHeartbeatExecutionHttpServiceConfig);
|
|
7
|
+
handle(request: IncomingMessage, response: ServerResponse): boolean;
|
|
8
|
+
handleExecution(request: IncomingMessage, response: ServerResponse): void;
|
|
9
|
+
close(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=execution-http-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-http-service.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/execution-http-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAkBjE,OAAO,KAAK,EAEV,uCAAuC,EACvC,6CAA6C,EAC9C,MAAM,YAAY,CAAC;AAYpB,8EAA8E;AAC9E,qBAAa,uCACb,YAAW,uCAAuC;;gBAcpC,MAAM,EAAE,6CAA6C;IAmBjE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO;IASnE,eAAe,CACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,GACvB,IAAI;IAUP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA2IvB"}
|
|
@@ -1,35 +1,60 @@
|
|
|
1
1
|
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
2
2
|
import { z, ZodError } from 'zod';
|
|
3
|
-
import {
|
|
4
|
-
import { HostedHeartbeatDelegationRejectedError, } from '../hosted-heartbeat-delegation-service.js';
|
|
3
|
+
import { HOSTED_HEARTBEAT_EXECUTION_PATHS, HostedHeartbeatExecutionPreparationRequestSchema, HostedHeartbeatExecutionSettlementRequestSchema, } from '../contracts.js';
|
|
5
4
|
import { HostedHeartbeatServiceTokenSchema } from '../service-token.js';
|
|
6
5
|
import { NodeHttpPathSchema, NodeHttpRequestError, errorType, readJsonBody, readPathname, takeAuthorization, writeJson, writeJsonError, } from '../../node/http-utils.js';
|
|
7
6
|
const DEFAULT_MAX_BODY_BYTES = 16 * 1_024;
|
|
8
|
-
/** Standard authenticated Node HTTP edge for product-owned
|
|
9
|
-
export class
|
|
10
|
-
#
|
|
7
|
+
/** Standard authenticated Node HTTP edge for product-owned work lifecycle. */
|
|
8
|
+
export class NodeHostedHeartbeatExecutionHttpService {
|
|
9
|
+
#executions;
|
|
11
10
|
#tokenDigest;
|
|
12
|
-
#
|
|
11
|
+
#paths;
|
|
13
12
|
#maxBodyBytes;
|
|
14
13
|
#reportFailure;
|
|
15
14
|
#active = new Set();
|
|
16
15
|
#closed = false;
|
|
17
16
|
#closePromise;
|
|
18
17
|
constructor(config) {
|
|
19
|
-
this.#
|
|
18
|
+
this.#executions = config.executions;
|
|
20
19
|
this.#tokenDigest = digest(HostedHeartbeatServiceTokenSchema.parse(config.apiToken));
|
|
21
|
-
this.#
|
|
20
|
+
this.#paths = {
|
|
21
|
+
prepare: NodeHttpPathSchema.parse(config.preparePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.prepare),
|
|
22
|
+
settle: NodeHttpPathSchema.parse(config.settlePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.settle),
|
|
23
|
+
};
|
|
22
24
|
this.#maxBodyBytes = z.number().int().min(1).max(1_048_576).parse(config.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES);
|
|
23
25
|
this.#reportFailure = config.reportFailure;
|
|
24
26
|
}
|
|
25
27
|
handle(request, response) {
|
|
26
|
-
|
|
28
|
+
const operation = this.#operation(readPathname(request.url));
|
|
29
|
+
if (!operation) {
|
|
27
30
|
return false;
|
|
28
31
|
}
|
|
29
|
-
this
|
|
32
|
+
this.#start(operation, request, response);
|
|
30
33
|
return true;
|
|
31
34
|
}
|
|
32
|
-
|
|
35
|
+
handleExecution(request, response) {
|
|
36
|
+
const operation = this.#operation(readPathname(request.url));
|
|
37
|
+
if (!operation) {
|
|
38
|
+
request.resume();
|
|
39
|
+
writeJsonError(response, 404, 'Heartbeat execution route not found.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.#start(operation, request, response);
|
|
43
|
+
}
|
|
44
|
+
close() {
|
|
45
|
+
if (!this.#closePromise) {
|
|
46
|
+
this.#closed = true;
|
|
47
|
+
const active = [...this.#active];
|
|
48
|
+
active.forEach(({ abortController, request, response }) => {
|
|
49
|
+
abortController.abort(new Error('The heartbeat execution service is stopping.'));
|
|
50
|
+
request.destroy();
|
|
51
|
+
response.destroy();
|
|
52
|
+
});
|
|
53
|
+
this.#closePromise = Promise.allSettled(active.map(({ pending }) => pending)).then(() => undefined);
|
|
54
|
+
}
|
|
55
|
+
return this.#closePromise;
|
|
56
|
+
}
|
|
57
|
+
#start(operation, request, response) {
|
|
33
58
|
if (this.#closed) {
|
|
34
59
|
request.resume();
|
|
35
60
|
writeJsonError(response, 503, 'Hosted execution is unavailable.');
|
|
@@ -48,7 +73,7 @@ export class NodeHostedHeartbeatDelegationHttpService {
|
|
|
48
73
|
}
|
|
49
74
|
catch (error) {
|
|
50
75
|
request.resume();
|
|
51
|
-
writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat
|
|
76
|
+
writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat execution request.');
|
|
52
77
|
return;
|
|
53
78
|
}
|
|
54
79
|
if (!this.#authenticates(authorization)) {
|
|
@@ -59,7 +84,7 @@ export class NodeHostedHeartbeatDelegationHttpService {
|
|
|
59
84
|
return;
|
|
60
85
|
}
|
|
61
86
|
const abortController = new AbortController();
|
|
62
|
-
const abort = () => abortController.abort(new Error('The heartbeat
|
|
87
|
+
const abort = () => abortController.abort(new Error('The heartbeat execution request closed.'));
|
|
63
88
|
request.once('aborted', abort);
|
|
64
89
|
response.once('close', abort);
|
|
65
90
|
const active = {
|
|
@@ -68,48 +93,36 @@ export class NodeHostedHeartbeatDelegationHttpService {
|
|
|
68
93
|
response,
|
|
69
94
|
pending: Promise.resolve(),
|
|
70
95
|
};
|
|
71
|
-
active.pending = this.#serve(request, response, abortController.signal).finally(() => {
|
|
96
|
+
active.pending = this.#serve(operation, request, response, abortController.signal).finally(() => {
|
|
72
97
|
request.removeListener('aborted', abort);
|
|
73
98
|
response.removeListener('close', abort);
|
|
74
99
|
this.#active.delete(active);
|
|
75
100
|
});
|
|
76
101
|
this.#active.add(active);
|
|
77
102
|
}
|
|
78
|
-
|
|
79
|
-
if (!this.#closePromise) {
|
|
80
|
-
this.#closed = true;
|
|
81
|
-
const active = [...this.#active];
|
|
82
|
-
active.forEach(({ abortController, request, response }) => {
|
|
83
|
-
abortController.abort(new Error('The heartbeat delegation service is stopping.'));
|
|
84
|
-
request.destroy();
|
|
85
|
-
response.destroy();
|
|
86
|
-
});
|
|
87
|
-
this.#closePromise = Promise.allSettled(active.map(({ pending }) => pending)).then(() => undefined);
|
|
88
|
-
}
|
|
89
|
-
return this.#closePromise;
|
|
90
|
-
}
|
|
91
|
-
async #serve(request, response, signal) {
|
|
103
|
+
async #serve(operation, request, response, signal) {
|
|
92
104
|
try {
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
|
|
105
|
+
const body = await readJsonBody(request, this.#maxBodyBytes, signal);
|
|
106
|
+
const result = operation === 'prepare'
|
|
107
|
+
? await this.#executions.prepare(HostedHeartbeatExecutionPreparationRequestSchema.parse(body), signal)
|
|
108
|
+
: await this.#executions.settle(HostedHeartbeatExecutionSettlementRequestSchema.parse(body), signal);
|
|
109
|
+
writeJson(response, 200, result);
|
|
96
110
|
}
|
|
97
111
|
catch (error) {
|
|
98
112
|
if (signal.aborted) {
|
|
99
113
|
return;
|
|
100
114
|
}
|
|
101
|
-
if (error instanceof HostedHeartbeatDelegationRejectedError) {
|
|
102
|
-
writeJsonError(response, 403, error.message);
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
115
|
if (error instanceof NodeHttpRequestError || error instanceof ZodError) {
|
|
106
|
-
writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat
|
|
116
|
+
writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat execution request.');
|
|
107
117
|
return;
|
|
108
118
|
}
|
|
109
|
-
this.#report({ phase:
|
|
110
|
-
writeJsonError(response, 500,
|
|
119
|
+
this.#report({ phase: operation, errorType: errorType(error) });
|
|
120
|
+
writeJsonError(response, 500, `Heartbeat execution ${operation} failed.`);
|
|
111
121
|
}
|
|
112
122
|
}
|
|
123
|
+
#operation(pathname) {
|
|
124
|
+
return Object.entries(this.#paths).find(([, path]) => path === pathname)?.[0];
|
|
125
|
+
}
|
|
113
126
|
#authenticates(authorization) {
|
|
114
127
|
const token = /^Bearer ([^\s]+)$/i.exec(authorization?.trim() ?? '')?.[1];
|
|
115
128
|
return token
|
|
@@ -128,4 +141,4 @@ export class NodeHostedHeartbeatDelegationHttpService {
|
|
|
128
141
|
function digest(value) {
|
|
129
142
|
return createHash('sha256').update(value, 'utf8').digest();
|
|
130
143
|
}
|
|
131
|
-
//# sourceMappingURL=
|
|
144
|
+
//# sourceMappingURL=execution-http-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-http-service.js","sourceRoot":"","sources":["../../../src/coordinator/node/execution-http-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EACL,gCAAgC,EAChC,gDAAgD,EAChD,+CAA+C,GAChD,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,0BAA0B,CAAC;AAOlC,MAAM,sBAAsB,GAAG,EAAE,GAAG,KAAK,CAAC;AAU1C,8EAA8E;AAC9E,MAAM,OAAO,uCAAuC;IAEzC,WAAW,CAElB;IACO,YAAY,CAAS;IACrB,MAAM,CAAqC;IAC3C,aAAa,CAAS;IACtB,cAAc,CAErB;IACO,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC5C,OAAO,GAAG,KAAK,CAAC;IAChB,aAAa,CAA4B;IAEzC,YAAY,MAAqD;QAC/D,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,MAAM,CACxB,iCAAiC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CACzD,CAAC;QACF,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAC/B,MAAM,CAAC,WAAW,IAAI,gCAAgC,CAAC,OAAO,CAC/D;YACD,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAC9B,MAAM,CAAC,UAAU,IAAI,gCAAgC,CAAC,MAAM,CAC7D;SACF,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAC/D,MAAM,CAAC,YAAY,IAAI,sBAAsB,CAC9C,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,OAAwB,EAAE,QAAwB;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CACb,OAAwB,EACxB,QAAwB;QAExB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,sCAAsC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACxD,eAAe,CAAC,KAAK,CACnB,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAC1D,CAAC;gBACF,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,UAAU,CACrC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CACrC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,MAAM,CACJ,SAA6B,EAC7B,OAAwB,EACxB,QAAwB;QAExB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,kCAAkC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,aAAiC,CAAC;QACtC,IAAI,CAAC;YACH,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,qBAAqB,EAAE;oBACnD,KAAK,EAAE,MAAM;iBACd,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,cAAc,CACZ,QAAQ,EACR,KAAK,YAAY,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAC9D,sCAAsC,CACvC,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,6BAA6B,EAAE;gBAC3D,kBAAkB,EAAE,QAAQ;aAC7B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CACvC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CACrD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAkB;YAC5B,eAAe;YACf,OAAO;YACP,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;SAC3B,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAC1B,SAAS,EACT,OAAO,EACP,QAAQ,EACR,eAAe,CAAC,MAAM,CACvB,CAAC,OAAO,CAAC,GAAG,EAAE;YACb,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACzC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CACV,SAA6B,EAC7B,OAAwB,EACxB,QAAwB,EACxB,MAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,SAAS,KAAK,SAAS;gBACpC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAC5B,gDAAgD,CAAC,KAAK,CAAC,IAAI,CAAC,EAC5D,MAAM,CACP;gBACH,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAC3B,+CAA+C,CAAC,KAAK,CAAC,IAAI,CAAC,EAC3D,MAAM,CACP,CAAC;YACN,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,KAAK,YAAY,oBAAoB,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBACvE,cAAc,CACZ,QAAQ,EACR,KAAK,YAAY,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAC9D,sCAAsC,CACvC,CAAC;gBACF,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChE,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,uBAAuB,SAAS,UAAU,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,UAAU,CAAC,QAA4B;QACrC,OAAQ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAG/B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,cAAc,CAAC,aAAiC;QAC9C,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CACrC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAC5B,EAAE,CAAC,CAAC,CAAC,CAAC;QACP,OAAO,KAAK;YACV,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC;YACnD,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,OAA4C;QAClD,IAAI,CAAC;YACH,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;CACF;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;AAC7D,CAAC","sourcesContent":["import { createHash, timingSafeEqual } from 'node:crypto';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { z, ZodError } from 'zod';\nimport {\n HOSTED_HEARTBEAT_EXECUTION_PATHS,\n HostedHeartbeatExecutionPreparationRequestSchema,\n HostedHeartbeatExecutionSettlementRequestSchema,\n} from '../contracts.js';\nimport { HostedHeartbeatServiceTokenSchema } from '../service-token.js';\nimport {\n NodeHttpPathSchema,\n NodeHttpRequestError,\n errorType,\n readJsonBody,\n readPathname,\n takeAuthorization,\n writeJson,\n writeJsonError,\n} from '../../node/http-utils.js';\nimport type {\n NodeHostedHeartbeatExecutionFailure,\n NodeHostedHeartbeatExecutionHttpHandler,\n NodeHostedHeartbeatExecutionHttpServiceConfig,\n} from './types.js';\n\nconst DEFAULT_MAX_BODY_BYTES = 16 * 1_024;\n\ntype ExecutionOperation = 'prepare' | 'settle';\ntype ActiveRequest = {\n abortController: AbortController;\n request: IncomingMessage;\n response: ServerResponse;\n pending: Promise<void>;\n};\n\n/** Standard authenticated Node HTTP edge for product-owned work lifecycle. */\nexport class NodeHostedHeartbeatExecutionHttpService\nimplements NodeHostedHeartbeatExecutionHttpHandler {\n readonly #executions: NodeHostedHeartbeatExecutionHttpServiceConfig[\n 'executions'\n ];\n readonly #tokenDigest: Buffer;\n readonly #paths: Record<ExecutionOperation, string>;\n readonly #maxBodyBytes: number;\n readonly #reportFailure: NodeHostedHeartbeatExecutionHttpServiceConfig[\n 'reportFailure'\n ];\n readonly #active = new Set<ActiveRequest>();\n #closed = false;\n #closePromise: Promise<void> | undefined;\n\n constructor(config: NodeHostedHeartbeatExecutionHttpServiceConfig) {\n this.#executions = config.executions;\n this.#tokenDigest = digest(\n HostedHeartbeatServiceTokenSchema.parse(config.apiToken),\n );\n this.#paths = {\n prepare: NodeHttpPathSchema.parse(\n config.preparePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.prepare,\n ),\n settle: NodeHttpPathSchema.parse(\n config.settlePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.settle,\n ),\n };\n this.#maxBodyBytes = z.number().int().min(1).max(1_048_576).parse(\n config.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES,\n );\n this.#reportFailure = config.reportFailure;\n }\n\n handle(request: IncomingMessage, response: ServerResponse): boolean {\n const operation = this.#operation(readPathname(request.url));\n if (!operation) {\n return false;\n }\n this.#start(operation, request, response);\n return true;\n }\n\n handleExecution(\n request: IncomingMessage,\n response: ServerResponse,\n ): void {\n const operation = this.#operation(readPathname(request.url));\n if (!operation) {\n request.resume();\n writeJsonError(response, 404, 'Heartbeat execution route not found.');\n return;\n }\n this.#start(operation, request, response);\n }\n\n close(): Promise<void> {\n if (!this.#closePromise) {\n this.#closed = true;\n const active = [...this.#active];\n active.forEach(({ abortController, request, response }) => {\n abortController.abort(\n new Error('The heartbeat execution service is stopping.'),\n );\n request.destroy();\n response.destroy();\n });\n this.#closePromise = Promise.allSettled(\n active.map(({ pending }) => pending),\n ).then(() => undefined);\n }\n return this.#closePromise;\n }\n\n #start(\n operation: ExecutionOperation,\n request: IncomingMessage,\n response: ServerResponse,\n ): void {\n if (this.#closed) {\n request.resume();\n writeJsonError(response, 503, 'Hosted execution is unavailable.');\n return;\n }\n\n let authorization: string | undefined;\n try {\n authorization = takeAuthorization(request);\n if (request.method !== 'POST') {\n request.resume();\n writeJsonError(response, 405, 'Method not allowed.', {\n Allow: 'POST',\n });\n return;\n }\n } catch (error) {\n request.resume();\n writeJsonError(\n response,\n error instanceof NodeHttpRequestError ? error.statusCode : 400,\n 'Invalid heartbeat execution request.',\n );\n return;\n }\n if (!this.#authenticates(authorization)) {\n request.resume();\n writeJsonError(response, 401, 'Authentication is required.', {\n 'WWW-Authenticate': 'Bearer',\n });\n return;\n }\n\n const abortController = new AbortController();\n const abort = () => abortController.abort(\n new Error('The heartbeat execution request closed.'),\n );\n request.once('aborted', abort);\n response.once('close', abort);\n const active: ActiveRequest = {\n abortController,\n request,\n response,\n pending: Promise.resolve(),\n };\n active.pending = this.#serve(\n operation,\n request,\n response,\n abortController.signal,\n ).finally(() => {\n request.removeListener('aborted', abort);\n response.removeListener('close', abort);\n this.#active.delete(active);\n });\n this.#active.add(active);\n }\n\n async #serve(\n operation: ExecutionOperation,\n request: IncomingMessage,\n response: ServerResponse,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n const body = await readJsonBody(request, this.#maxBodyBytes, signal);\n const result = operation === 'prepare'\n ? await this.#executions.prepare(\n HostedHeartbeatExecutionPreparationRequestSchema.parse(body),\n signal,\n )\n : await this.#executions.settle(\n HostedHeartbeatExecutionSettlementRequestSchema.parse(body),\n signal,\n );\n writeJson(response, 200, result);\n } catch (error) {\n if (signal.aborted) {\n return;\n }\n if (error instanceof NodeHttpRequestError || error instanceof ZodError) {\n writeJsonError(\n response,\n error instanceof NodeHttpRequestError ? error.statusCode : 400,\n 'Invalid heartbeat execution request.',\n );\n return;\n }\n this.#report({ phase: operation, errorType: errorType(error) });\n writeJsonError(response, 500, `Heartbeat execution ${operation} failed.`);\n }\n }\n\n #operation(pathname: string | undefined): ExecutionOperation | undefined {\n return (Object.entries(this.#paths) as Array<[\n ExecutionOperation,\n string,\n ]>).find(([, path]) => path === pathname)?.[0];\n }\n\n #authenticates(authorization: string | undefined): boolean {\n const token = /^Bearer ([^\\s]+)$/i.exec(\n authorization?.trim() ?? '',\n )?.[1];\n return token\n ? timingSafeEqual(digest(token), this.#tokenDigest)\n : false;\n }\n\n #report(failure: NodeHostedHeartbeatExecutionFailure): void {\n try {\n this.#reportFailure?.(Object.freeze({ ...failure }));\n } catch {\n // Observability must not change request settlement.\n }\n }\n}\n\nfunction digest(value: string): Buffer {\n return createHash('sha256').update(value, 'utf8').digest();\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { NodeHostedHeartbeatExecutionHttpService } from './execution-http-service.js';
|
|
2
2
|
export { takeHostedHeartbeatServiceToken } from './environment.js';
|
|
3
|
-
export type {
|
|
3
|
+
export type { NodeHostedHeartbeatExecutionFailure, NodeHostedHeartbeatExecutionHttpHandler, NodeHostedHeartbeatExecutionHttpServiceConfig, } from './types.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uCAAuC,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,mCAAmC,EACnC,uCAAuC,EACvC,6CAA6C,GAC9C,MAAM,YAAY,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { NodeHostedHeartbeatExecutionHttpService } from './execution-http-service.js';
|
|
2
2
|
export { takeHostedHeartbeatServiceToken } from './environment.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uCAAuC,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { NodeHostedHeartbeatExecutionHttpService } from './execution-http-service.js';\nexport { takeHostedHeartbeatServiceToken } from './environment.js';\nexport type {\n NodeHostedHeartbeatExecutionFailure,\n NodeHostedHeartbeatExecutionHttpHandler,\n NodeHostedHeartbeatExecutionHttpServiceConfig,\n} from './types.js';\n"]}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import type {
|
|
3
|
-
export type
|
|
4
|
-
phase: '
|
|
2
|
+
import type { HostedHeartbeatExecutionApi } from '../types.js';
|
|
3
|
+
export type NodeHostedHeartbeatExecutionFailure = {
|
|
4
|
+
phase: 'prepare' | 'settle';
|
|
5
5
|
errorType: string;
|
|
6
6
|
};
|
|
7
|
-
export type
|
|
8
|
-
|
|
7
|
+
export type NodeHostedHeartbeatExecutionHttpServiceConfig = {
|
|
8
|
+
executions: HostedHeartbeatExecutionApi;
|
|
9
9
|
apiToken: string;
|
|
10
|
-
|
|
10
|
+
preparePath?: string;
|
|
11
|
+
settlePath?: string;
|
|
11
12
|
maxBodyBytes?: number;
|
|
12
13
|
/** Receives credential-free operational metadata, never the raw error. */
|
|
13
|
-
reportFailure?: (failure:
|
|
14
|
+
reportFailure?: (failure: NodeHostedHeartbeatExecutionFailure) => void;
|
|
14
15
|
};
|
|
15
|
-
export interface
|
|
16
|
+
export interface NodeHostedHeartbeatExecutionHttpHandler {
|
|
16
17
|
handle(request: IncomingMessage, response: ServerResponse): boolean;
|
|
17
|
-
|
|
18
|
+
handleExecution(request: IncomingMessage, response: ServerResponse): void;
|
|
18
19
|
close(): Promise<void>;
|
|
19
20
|
}
|
|
20
21
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,MAAM,mCAAmC,GAAG;IAChD,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,6CAA6C,GAAG;IAC1D,UAAU,EAAE,2BAA2B,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,mCAAmC,KAAK,IAAI,CAAC;CACxE,CAAC;AAEF,MAAM,WAAW,uCAAuC;IACtD,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;IACpE,eAAe,CACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,GACvB,IAAI,CAAC;IACR,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type {
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { HostedHeartbeatExecutionApi } from '../types.js';\n\nexport type NodeHostedHeartbeatExecutionFailure = {\n phase: 'prepare' | 'settle';\n errorType: string;\n};\n\nexport type NodeHostedHeartbeatExecutionHttpServiceConfig = {\n executions: HostedHeartbeatExecutionApi;\n apiToken: string;\n preparePath?: string;\n settlePath?: string;\n maxBodyBytes?: number;\n /** Receives credential-free operational metadata, never the raw error. */\n reportFailure?: (failure: NodeHostedHeartbeatExecutionFailure) => void;\n};\n\nexport interface NodeHostedHeartbeatExecutionHttpHandler {\n handle(request: IncomingMessage, response: ServerResponse): boolean;\n handleExecution(\n request: IncomingMessage,\n response: ServerResponse,\n ): void;\n close(): Promise<void>;\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import type { ExecutionAuthorityIssuer } from '../authority/index.js';
|
|
|
2
2
|
import type { HostedModelCredentialProvider } from '../conversation/index.js';
|
|
3
3
|
import type { HostedHeartbeatAgentExecutionTransportInput } from '../heartbeat/index.js';
|
|
4
4
|
import type { HeartbeatExecutionHost } from '../http-sse/index.js';
|
|
5
|
-
import type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView,
|
|
5
|
+
import type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView, HostedHeartbeatExecutionPreparation, HostedHeartbeatExecutionPreparationDecision, HostedHeartbeatExecutionPreparationRequest, HostedHeartbeatExecutionSettlement, HostedHeartbeatExecutionSettlementRequest, HostedHeartbeatDesiredTask } from './contracts.js';
|
|
6
6
|
export type HostedHeartbeatCoordinatorClientConfig = {
|
|
7
7
|
baseUrl: URL;
|
|
8
8
|
apiToken: string;
|
|
@@ -32,36 +32,74 @@ export type HostedHeartbeatTaskReconciliation = {
|
|
|
32
32
|
export type HostedHeartbeatTaskReconcilerConfig = {
|
|
33
33
|
coordinator: Pick<HostedHeartbeatCoordinatorTaskApi, 'listTasks' | 'upsertTask' | 'deleteTask' | 'pause' | 'resume'>;
|
|
34
34
|
};
|
|
35
|
-
export type
|
|
35
|
+
export type HostedHeartbeatExecutionPreparationInput = {
|
|
36
36
|
taskId: string;
|
|
37
37
|
executionId: string;
|
|
38
|
+
interruptedExecutionId?: string;
|
|
38
39
|
signal: AbortSignal;
|
|
39
40
|
};
|
|
40
|
-
export
|
|
41
|
-
|
|
41
|
+
export type HostedHeartbeatExecutionSettlementInput = HostedHeartbeatExecutionSettlementRequest & {
|
|
42
|
+
signal: AbortSignal;
|
|
43
|
+
};
|
|
44
|
+
/** Product-owned lifecycle around one Coordinator-owned execution attempt. */
|
|
45
|
+
export interface HostedHeartbeatProductExecutionLifecycle {
|
|
46
|
+
prepare(input: HostedHeartbeatExecutionPreparationInput): HostedHeartbeatExecutionPreparationDecision | Promise<HostedHeartbeatExecutionPreparationDecision>;
|
|
47
|
+
settle(input: HostedHeartbeatExecutionSettlementInput): HostedHeartbeatExecutionSettlement['disposition'] | Promise<HostedHeartbeatExecutionSettlement['disposition']>;
|
|
42
48
|
}
|
|
43
|
-
export type
|
|
49
|
+
export type HostedHeartbeatExecutionServiceConfig = {
|
|
44
50
|
authority: ExecutionAuthorityIssuer;
|
|
45
|
-
|
|
51
|
+
lifecycle: HostedHeartbeatProductExecutionLifecycle;
|
|
46
52
|
runtimeSessionNamespace: string;
|
|
47
53
|
maxExecutionMs: number;
|
|
48
54
|
now?: () => Date;
|
|
49
55
|
};
|
|
50
|
-
export interface
|
|
51
|
-
|
|
56
|
+
export interface HostedHeartbeatExecutionApi {
|
|
57
|
+
prepare(input: HostedHeartbeatExecutionPreparationRequest, signal?: AbortSignal): Promise<HostedHeartbeatExecutionPreparation>;
|
|
58
|
+
settle(input: HostedHeartbeatExecutionSettlementRequest, signal?: AbortSignal): Promise<HostedHeartbeatExecutionSettlement>;
|
|
52
59
|
}
|
|
53
|
-
export type
|
|
60
|
+
export type HostedHeartbeatExecutionClientConfig = {
|
|
54
61
|
baseUrl: URL;
|
|
55
62
|
apiToken: string;
|
|
63
|
+
/** Allows only Docker's explicit local-host alias over HTTP. */
|
|
64
|
+
allowDockerLocalHost?: boolean;
|
|
56
65
|
fetch?: typeof globalThis.fetch;
|
|
57
|
-
|
|
66
|
+
preparePath?: string;
|
|
67
|
+
settlePath?: string;
|
|
68
|
+
requestTimeoutMs?: number;
|
|
58
69
|
};
|
|
59
|
-
export type
|
|
60
|
-
|
|
70
|
+
export type HostedHeartbeatDelegatedExecutionConfig = {
|
|
71
|
+
executions: HostedHeartbeatExecutionApi;
|
|
61
72
|
executionHost: HeartbeatExecutionHost;
|
|
62
73
|
modelCredentials: HostedModelCredentialProvider;
|
|
63
74
|
};
|
|
64
|
-
export interface
|
|
75
|
+
export interface HostedHeartbeatExecutionTransportPort {
|
|
65
76
|
execute(input: HostedHeartbeatAgentExecutionTransportInput): Promise<unknown>;
|
|
66
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Structural subset of Heddle's heartbeat handler context. Keeping this port
|
|
80
|
+
* local avoids making the adopter client depend on the full Runtime package.
|
|
81
|
+
*/
|
|
82
|
+
export type HostedHeartbeatCoordinatorExecutionContext<TResult = unknown, TOutcome = unknown> = {
|
|
83
|
+
task: {
|
|
84
|
+
id: string;
|
|
85
|
+
state?: {
|
|
86
|
+
recovery?: {
|
|
87
|
+
interruptedExecutionId: string;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
executionId: string;
|
|
92
|
+
signal: AbortSignal;
|
|
93
|
+
runAgent(): Promise<TResult>;
|
|
94
|
+
skip(input: {
|
|
95
|
+
summary: string;
|
|
96
|
+
}): TOutcome;
|
|
97
|
+
retry(input: {
|
|
98
|
+
summary: string;
|
|
99
|
+
delayMs?: number;
|
|
100
|
+
}): TOutcome;
|
|
101
|
+
block(input: {
|
|
102
|
+
summary: string;
|
|
103
|
+
}): TOutcome;
|
|
104
|
+
};
|
|
67
105
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,6BAA6B,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,2CAA2C,EAC5C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EACV,mCAAmC,EACnC,+BAA+B,EAC/B,oCAAoC,EACpC,kCAAkC,EAClC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ExecutionAuthorityIssuer,\n} from '../authority/index.js';\nimport type {\n HostedModelCredentialProvider,\n} from '../conversation/index.js';\nimport type {\n HostedHeartbeatAgentExecutionTransportInput,\n} from '../heartbeat/index.js';\nimport type { HeartbeatExecutionHost } from '../http-sse/index.js';\nimport type {\n HostedHeartbeatCoordinatorTaskInput,\n HostedHeartbeatCoordinatorState,\n HostedHeartbeatCoordinatorTaskDetail,\n HostedHeartbeatCoordinatorTaskView,\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ExecutionAuthorityIssuer,\n} from '../authority/index.js';\nimport type {\n HostedModelCredentialProvider,\n} from '../conversation/index.js';\nimport type {\n HostedHeartbeatAgentExecutionTransportInput,\n} from '../heartbeat/index.js';\nimport type { HeartbeatExecutionHost } from '../http-sse/index.js';\nimport type {\n HostedHeartbeatCoordinatorTaskInput,\n HostedHeartbeatCoordinatorState,\n HostedHeartbeatCoordinatorTaskDetail,\n HostedHeartbeatCoordinatorTaskView,\n HostedHeartbeatExecutionPreparation,\n HostedHeartbeatExecutionPreparationDecision,\n HostedHeartbeatExecutionPreparationRequest,\n HostedHeartbeatExecutionSettlement,\n HostedHeartbeatExecutionSettlementRequest,\n HostedHeartbeatDesiredTask,\n} from './contracts.js';\n\nexport type HostedHeartbeatCoordinatorClientConfig = {\n baseUrl: URL;\n apiToken: string;\n fetch?: typeof globalThis.fetch;\n};\n\nexport interface HostedHeartbeatCoordinatorTaskApi {\n readState(signal?: AbortSignal): Promise<HostedHeartbeatCoordinatorState>;\n listTasks(\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskView[]>;\n readTask(\n taskId: string,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskDetail>;\n upsertTask(\n taskId: string,\n task: HostedHeartbeatCoordinatorTaskInput,\n signal?: AbortSignal,\n ): Promise<void>;\n triggerTask(\n taskId: string,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskView>;\n deleteTask(taskId: string, signal?: AbortSignal): Promise<void>;\n pause(signal?: AbortSignal): Promise<void>;\n resume(signal?: AbortSignal): Promise<void>;\n drain(signal?: AbortSignal): Promise<void>;\n}\n\nexport type HostedHeartbeatTaskReconciliationInput = {\n desiredTasks: readonly HostedHeartbeatDesiredTask[];\n resume: boolean;\n signal?: AbortSignal;\n};\n\nexport type HostedHeartbeatTaskReconciliation = {\n deleted: number;\n upserted: number;\n resumed: boolean;\n};\n\nexport type HostedHeartbeatTaskReconcilerConfig = {\n coordinator: Pick<\n HostedHeartbeatCoordinatorTaskApi,\n 'listTasks' | 'upsertTask' | 'deleteTask' | 'pause' | 'resume'\n >;\n};\n\nexport type HostedHeartbeatExecutionPreparationInput = {\n taskId: string;\n executionId: string;\n interruptedExecutionId?: string;\n signal: AbortSignal;\n};\n\nexport type HostedHeartbeatExecutionSettlementInput =\n HostedHeartbeatExecutionSettlementRequest & {\n signal: AbortSignal;\n };\n\n/** Product-owned lifecycle around one Coordinator-owned execution attempt. */\nexport interface HostedHeartbeatProductExecutionLifecycle {\n prepare(\n input: HostedHeartbeatExecutionPreparationInput,\n ): HostedHeartbeatExecutionPreparationDecision\n | Promise<HostedHeartbeatExecutionPreparationDecision>;\n settle(\n input: HostedHeartbeatExecutionSettlementInput,\n ): HostedHeartbeatExecutionSettlement['disposition']\n | Promise<HostedHeartbeatExecutionSettlement['disposition']>;\n}\n\nexport type HostedHeartbeatExecutionServiceConfig = {\n authority: ExecutionAuthorityIssuer;\n lifecycle: HostedHeartbeatProductExecutionLifecycle;\n runtimeSessionNamespace: string;\n maxExecutionMs: number;\n now?: () => Date;\n};\n\nexport interface HostedHeartbeatExecutionApi {\n prepare(\n input: HostedHeartbeatExecutionPreparationRequest,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionPreparation>;\n settle(\n input: HostedHeartbeatExecutionSettlementRequest,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionSettlement>;\n}\n\nexport type HostedHeartbeatExecutionClientConfig = {\n baseUrl: URL;\n apiToken: string;\n /** Allows only Docker's explicit local-host alias over HTTP. */\n allowDockerLocalHost?: boolean;\n fetch?: typeof globalThis.fetch;\n preparePath?: string;\n settlePath?: string;\n requestTimeoutMs?: number;\n};\n\nexport type HostedHeartbeatDelegatedExecutionConfig = {\n executions: HostedHeartbeatExecutionApi;\n executionHost: HeartbeatExecutionHost;\n modelCredentials: HostedModelCredentialProvider;\n};\n\nexport interface HostedHeartbeatExecutionTransportPort {\n execute(\n input: HostedHeartbeatAgentExecutionTransportInput,\n ): Promise<unknown>;\n}\n\n/**\n * Structural subset of Heddle's heartbeat handler context. Keeping this port\n * local avoids making the adopter client depend on the full Runtime package.\n */\nexport type HostedHeartbeatCoordinatorExecutionContext<\n TResult = unknown,\n TOutcome = unknown,\n> = {\n task: {\n id: string;\n state?: {\n recovery?: { interruptedExecutionId: string };\n };\n };\n executionId: string;\n signal: AbortSignal;\n runAgent(): Promise<TResult>;\n skip(input: { summary: string }): TOutcome;\n retry(input: { summary: string; delayMs?: number }): TOutcome;\n block(input: { summary: string }): TOutcome;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,gCAAgC;;;;;mHAI5C,CAAC;AAEF,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;kBAW1C,CAAC;AAEZ,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;kBAYnD,CAAC;AAOZ,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,GACzC,CAAC,CAAC,KAAK,CAAC,OAAO,wCAAwC,CAAC,CAO1D;AAED,wBAAgB,gDAAgD,CAC9D,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,GACzC,CAAC,CAAC,KAAK,CAAC,OAAO,iDAAiD,CAAC,CAOnE"}
|
package/dist/host/schemas.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { JwtAudienceSchema, JwtIssuerSchema, McpServerIdSchema, OpaqueIdSchema, isSafeWebUrl, } from '../contracts/index.js';
|
|
2
|
+
import { JwtAudienceSchema, JwtIssuerSchema, McpServerIdSchema, OpaqueIdSchema, isDockerLocalWebUrl, isSafeWebUrl, } from '../contracts/index.js';
|
|
3
3
|
import { EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS } from './types.js';
|
|
4
4
|
export const ExecutionHostJwtAlgorithmsSchema = z.array(z.enum(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS)).min(1).max(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS.length).transform((algorithms) => Object.freeze([...new Set(algorithms)]));
|
|
5
5
|
export const JwtExecutionIdentityVerifierConfigSchema = z.object({
|
|
@@ -21,12 +21,7 @@ export const JwtExecutionHostMcpCapabilityVerifierConfigSchema = z.object({
|
|
|
21
21
|
maxCapabilityAgeSeconds: z.number().int().min(1).max(15 * 60),
|
|
22
22
|
clockToleranceSeconds: z.number().int().min(0).max(60),
|
|
23
23
|
}).strict();
|
|
24
|
-
const DockerLocalJwksUrlSchema = z.instanceof(URL).refine((url) => isSafeWebUrl(url) || (url
|
|
25
|
-
&& url.hostname === 'host.docker.internal'
|
|
26
|
-
&& !url.username
|
|
27
|
-
&& !url.password
|
|
28
|
-
&& !url.search
|
|
29
|
-
&& !url.hash), 'must use HTTPS, loopback HTTP, or the explicit Docker local-host alias without credentials, query, or fragment');
|
|
24
|
+
const DockerLocalJwksUrlSchema = z.instanceof(URL).refine((url) => isSafeWebUrl(url) || isDockerLocalWebUrl(url), 'must use HTTPS, loopback HTTP, or the explicit Docker local-host alias without credentials, query, or fragment');
|
|
30
25
|
export function parseJwtExecutionIdentityVerifierConfig(input, options) {
|
|
31
26
|
const schema = options.allowDockerLocalHost
|
|
32
27
|
? JwtExecutionIdentityVerifierConfigSchema.extend({
|
package/dist/host/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CACrD,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAChD,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,uCAAuC,CAAC,MAAM,CAAC,CAAC,SAAS,CACpE,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/D,eAAe,EAAE,eAAe;IAChC,iBAAiB,EAAE,iBAAiB;IACpC,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CACxC,YAAY,EACZ,gFAAgF,CACjF;IACD,sBAAsB,EAAE,gCAAgC;IACxD,gBAAgB,EAAE,cAAc;IAChC,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;IAC5D,8BAA8B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CAChE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,iDAAiD,GAAG,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,iBAAiB;IAC3B,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CAC/B,YAAY,EACZ,gFAAgF,CACjF;IACD,aAAa,EAAE,gCAAgC;IAC/C,gBAAgB,EAAE,cAAc;IAChC,QAAQ,EAAE,iBAAiB;IAC3B,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;IAC7D,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CACvD,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,wBAAwB,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CACvD,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n JwtAudienceSchema,\n JwtIssuerSchema,\n McpServerIdSchema,\n OpaqueIdSchema,\n isDockerLocalWebUrl,\n isSafeWebUrl,\n} from '../contracts/index.js';\nimport { EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS } from './types.js';\n\nexport const ExecutionHostJwtAlgorithmsSchema = z.array(\n z.enum(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS),\n).min(1).max(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS.length).transform(\n (algorithms) => Object.freeze([...new Set(algorithms)]),\n);\n\nexport const JwtExecutionIdentityVerifierConfigSchema = z.object({\n executionIssuer: JwtIssuerSchema,\n executionAudience: JwtAudienceSchema,\n executionJwksUrl: z.instanceof(URL).refine(\n isSafeWebUrl,\n 'must use HTTPS or loopback HTTP and contain no credentials, query, or fragment',\n ),\n executionJwtAlgorithms: ExecutionHostJwtAlgorithmsSchema,\n trustedAdopterId: OpaqueIdSchema,\n maxAssertionAgeSeconds: z.number().int().min(1).max(15 * 60),\n assertionClockToleranceSeconds: z.number().int().min(0).max(60),\n}).strict();\n\nexport const JwtExecutionHostMcpCapabilityVerifierConfigSchema = z.object({\n issuer: JwtIssuerSchema,\n audience: JwtAudienceSchema,\n jwksUrl: z.instanceof(URL).refine(\n isSafeWebUrl,\n 'must use HTTPS or loopback HTTP and contain no credentials, query, or fragment',\n ),\n jwtAlgorithms: ExecutionHostJwtAlgorithmsSchema,\n trustedAdopterId: OpaqueIdSchema,\n serverId: McpServerIdSchema,\n maxCapabilityAgeSeconds: z.number().int().min(1).max(15 * 60),\n clockToleranceSeconds: z.number().int().min(0).max(60),\n}).strict();\n\nconst DockerLocalJwksUrlSchema = z.instanceof(URL).refine(\n (url) => isSafeWebUrl(url) || isDockerLocalWebUrl(url),\n 'must use HTTPS, loopback HTTP, or the explicit Docker local-host alias without credentials, query, or fragment',\n);\n\nexport function parseJwtExecutionIdentityVerifierConfig(\n input: unknown,\n options: { allowDockerLocalHost: boolean },\n): z.infer<typeof JwtExecutionIdentityVerifierConfigSchema> {\n const schema = options.allowDockerLocalHost\n ? JwtExecutionIdentityVerifierConfigSchema.extend({\n executionJwksUrl: DockerLocalJwksUrlSchema,\n })\n : JwtExecutionIdentityVerifierConfigSchema;\n return schema.parse(input);\n}\n\nexport function parseJwtExecutionHostMcpCapabilityVerifierConfig(\n input: unknown,\n options: { allowDockerLocalHost: boolean },\n): z.infer<typeof JwtExecutionHostMcpCapabilityVerifierConfigSchema> {\n const schema = options.allowDockerLocalHost\n ? JwtExecutionHostMcpCapabilityVerifierConfigSchema.extend({\n jwksUrl: DockerLocalJwksUrlSchema,\n })\n : JwtExecutionHostMcpCapabilityVerifierConfigSchema;\n return schema.parse(input);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct-http-execution-host.d.ts","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"direct-http-execution-host.d.ts","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"AACA,OAAO,EAqBL,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EACV,6BAA6B,EAC7B,aAAa,EACb,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAqCpB;;;GAGG;AACH,qBAAa,uBACb,YAAW,aAAa,EAAE,sBAAsB;;gBAKlC,MAAM,EAAE,6BAA6B;IAO1C,sBAAsB,CAC3B,QAAQ,EAAE,6BAA6B,GACtC,aAAa,CAAC,wBAAwB,CAAC;IAoBnC,mBAAmB,CACxB,QAAQ,EAAE,0BAA0B,GACnC,aAAa,CAAC,iCAAiC,CAAC;CAmEpD"}
|