@heddleagent/execution-host-client 6.6.0 → 6.7.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 CHANGED
@@ -5,13 +5,13 @@ invoke a separately deployed Heddle Execution Host. It lets an
5
5
  adopter keep its own language stack, authentication, database, product policy,
6
6
  MCP tools, and UI while reusing the security-sensitive v1 contract machinery.
7
7
 
8
- > **Current availability:** `6.6.0` is the latest published version as of
9
- > 2026-08-25; repository source may be ahead of that release. The former
8
+ > **Current availability:** `6.7.0` is the current package version as of
9
+ > 2026-08-27. The former
10
10
  > `@roackb2/heddle-adopter@5.13.0` coordinate is deprecated and remains
11
- > installable only for existing consumers. Heddle does not currently distribute
12
- > the compatible Execution Host implementation or offer a hosted service. The
13
- > public surface documents and tests the adopter boundary without implying a
14
- > generally available deployment.
11
+ > installable only for existing consumers. The compatible Execution Host source
12
+ > is maintained in this private-first repository; Heddle does not yet offer a
13
+ > generally available hosted service. Public package availability does not imply
14
+ > access to a managed deployment.
15
15
 
16
16
  Install the package:
17
17
 
@@ -19,6 +19,12 @@ Install the package:
19
19
  npm install @heddleagent/execution-host-client
20
20
  ```
21
21
 
22
+ The canonical source now lives in the private-first Heddle Execution Host
23
+ repository. The npm package remains public and requires no repository access;
24
+ the source visibility governs complete self-host inspection and operation, not
25
+ package installation. Public support remains at the Heddle issue tracker linked
26
+ from the package metadata.
27
+
22
28
  The package does **not** contain Heddle's agent loop, AgentCore Runtime
23
29
  deployment, Terraform, product MCP tools, or product logic. It uses the
24
30
  modular AWS SDK for its AgentCore transport and the official MCP SDK, plus
@@ -277,6 +283,12 @@ This surface owns credential verification and exact scope binding. It does not
277
283
  own HTTP ingress, Runtime-session isolation, model credentials, streaming,
278
284
  provider bootstrap, or deployment.
279
285
 
286
+ After verification, `RuntimeSessionService` forwards that same canonical
287
+ `ExecutionScope` to the selected host executor. A compatible host can therefore
288
+ derive host-owned scoped resources such as memory without reparsing claims or
289
+ inventing a second identity vocabulary. The executor must not accept an
290
+ independently supplied scope.
291
+
280
292
  ## Invoke an Execution Host
281
293
 
282
294
  Use the official AgentCore client for a Runtime deployed in the adopter's AWS
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/host/runtime-session/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kCAAkC,EAClC,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,0BAA0B,EAC1B,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,EAC3B,KAAK,4BAA4B,EAClC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAGV,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAiBpB,iFAAiF;AACjF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAqB;IAClE,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,OAAO,EAAE;QACnB,MAAM,EAAE,oBAAoB,CAAC;QAC7B,SAAS,EAAE,wBAAwB,CAAC;QACpC,OAAO,CAAC,EAAE,0BAA0B,CAAC;QACrC,MAAM,CAAC,EAAE,2BAA2B,CAAC;QACrC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;KAClB;IAcD,UAAU,IAAI,4BAA4B;IAIpC,KAAK,CAAC,KAAK,EAAE;QACjB,QAAQ,EAAE,yBAAyB,CAAC;QACpC,UAAU,EAAE,wBAAwB,CAAC;QACrC,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,kCAAkC,CAAC;QACnD,YAAY,EAAE,WAAW,CAAC;KAC3B,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmG9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB/B,UAAU,IAAI,iBAAiB,GAAG,SAAS;IAI3C,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,cAAc;CAcvB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/host/runtime-session/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kCAAkC,EAClC,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,0BAA0B,EAC1B,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,EAC3B,KAAK,4BAA4B,EAClC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAGV,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAiBpB,iFAAiF;AACjF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAqB;IAClE,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,OAAO,EAAE;QACnB,MAAM,EAAE,oBAAoB,CAAC;QAC7B,SAAS,EAAE,wBAAwB,CAAC;QACpC,OAAO,CAAC,EAAE,0BAA0B,CAAC;QACrC,MAAM,CAAC,EAAE,2BAA2B,CAAC;QACrC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;KAClB;IAcD,UAAU,IAAI,4BAA4B;IAIpC,KAAK,CAAC,KAAK,EAAE;QACjB,QAAQ,EAAE,yBAAyB,CAAC;QACpC,UAAU,EAAE,wBAAwB,CAAC;QACrC,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,kCAAkC,CAAC;QACnD,YAAY,EAAE,WAAW,CAAC;KAC3B,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAoG9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB/B,UAAU,IAAI,iBAAiB,GAAG,SAAS;IAI3C,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,cAAc;CAcvB"}
@@ -49,6 +49,7 @@ export class RuntimeSessionService {
49
49
  deadlineTimer.unref();
50
50
  this.status.markExecuting();
51
51
  const executionInput = {
52
+ scope: input.identity.scope,
52
53
  scopeKey: binding.scopeKey,
53
54
  executionSessionId: binding.executionSessionId,
54
55
  request: input.invocation,
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/host/runtime-session/service.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,GAE3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,GAE5B,MAAM,aAAa,CAAC;AAUrB,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAepC,iFAAiF;AACjF,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAoB;IAC1B,QAAQ,CAAsB;IACrB,4BAA4B,GAAG,IAAI,GAAG,EAAU,CAAC;IACjD,8BAA8B,GAAa,EAAE,CAAC;IAC9C,MAAM,CAAuB;IAC7B,SAAS,CAA2B;IACpC,OAAO,CAA6B;IACpC,MAAM,CAA8B;IACpC,GAAG,CAAa;IAEjC,YAAY,OAMX;QACC,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;eAClD,OAAO,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,0BAA0B,EAAE,CAAC;QACnE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAMX;QACC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB;YACjD,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK;SACxB,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,gBAAgB,CACxB,wDAAwD,CACzD,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,+BAA+B,CACvC,qFAAqF,CACtF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1E,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC/B,eAAe,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,aAAa,GAAG,UAAU,CAC9B,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CACpB,IAAI,oBAAoB,CAAC,0CAA0C,CAAC,CACrE,EACD,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAC1C,CAAC;QACF,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG;YACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,OAAO,EAAE,KAAK,CAAC,UAAU;YACzB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,WAAW,EAAE,UAAU,CAAC,MAAM;SACC,CAAC;QAClC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CACzC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAC1C,CAAC;QACF,MAAM,QAAQ,GAAuB;YACnC,UAAU;YACV,OAAO,EAAE,YAAY;SACtB,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,GAA2B,CAAC;QAChC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,YAAY,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,KAAK,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAqB;YAC/B,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY;YACzC,GAAG;YACH,UAAU;YACV,aAAa;YACb,yBAAyB,EAAE,GAAG,EAAE,CAC9B,KAAK,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC;SACnE,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE;YAC9D,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE9B,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YACpC,qEAAqE;YACrE,+DAA+D;YAC/D,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;YAC1B,MAAM,EAAE,GAAG,EAAE;gBACX,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC7C,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM;SACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAEO,eAAe,CAAC,UAAmB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,oBAAoB,CAC5B,sDAAsD,CACvD,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,CAAC;IAEO,MAAM,CAAC,MAAwB;QACrC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACnC,MAAM,CAAC,yBAAyB,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAEO,2BAA2B,CAAC,YAAoB;QACtD,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,8BAA8B,CAAC,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;QAC3D,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,cAAc,CACpB,KAA4B;QAE5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC;gBAC3C,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;YACxC,GAAG,KAAK;YACR,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import type {\n VerifiedExecutionHostMcpCapability,\n VerifiedExecutionIdentity,\n} from '../types.js';\nimport {\n RuntimeBusyError,\n RuntimeDeadlineError,\n RuntimeDuplicateInvocationError,\n} from './errors.js';\nimport {\n RuntimeScopeBindingService,\n type BoundRuntimeScope,\n} from './scope-binding.js';\nimport {\n RuntimeSessionStatusService,\n type RuntimeSessionStatusSnapshot,\n} from './status.js';\nimport type {\n RuntimeExecutionHandle,\n RuntimeExecutionInput,\n RuntimeInvocationHandle,\n RuntimeInvocationRequest,\n RuntimeSessionConfig,\n RuntimeWorkflowExecutors,\n} from './types.js';\n\nconst RECENT_INVOCATION_LIMIT = 128;\n\ntype ActiveInvocation = {\n invocationId: string;\n run: RuntimeExecutionHandle;\n controller: AbortController;\n deadlineTimer: ReturnType<typeof setTimeout>;\n removeCallerAbortListener: () => void;\n};\n\ntype StartingInvocation = {\n controller: AbortController;\n promise: Promise<RuntimeExecutionHandle>;\n};\n\n/** Coordinates one process-bound Runtime session without owning product data. */\nexport class RuntimeSessionService {\n private active?: ActiveInvocation;\n private starting?: StartingInvocation;\n private readonly recentCompletedInvocationIds = new Set<string>();\n private readonly recentCompletedInvocationOrder: string[] = [];\n private readonly config: RuntimeSessionConfig;\n private readonly executors: RuntimeWorkflowExecutors;\n private readonly binding: RuntimeScopeBindingService;\n private readonly status: RuntimeSessionStatusService;\n private readonly now: () => Date;\n\n constructor(options: {\n config: RuntimeSessionConfig;\n executors: RuntimeWorkflowExecutors;\n binding?: RuntimeScopeBindingService;\n status?: RuntimeSessionStatusService;\n now?: () => Date;\n }) {\n if (\n !Number.isSafeInteger(options.config.maxInvocationMs)\n || options.config.maxInvocationMs <= 0\n ) {\n throw new Error('maxInvocationMs must be a positive safe integer.');\n }\n this.config = options.config;\n this.executors = options.executors;\n this.binding = options.binding ?? new RuntimeScopeBindingService();\n this.now = options.now ?? (() => new Date());\n this.status = options.status ?? new RuntimeSessionStatusService(this.now);\n }\n\n readStatus(): RuntimeSessionStatusSnapshot {\n return this.status.read();\n }\n\n async start(input: {\n identity: VerifiedExecutionIdentity;\n invocation: RuntimeInvocationRequest;\n modelApiKey: string;\n mcpCapability?: VerifiedExecutionHostMcpCapability;\n callerSignal: AbortSignal;\n }): Promise<RuntimeInvocationHandle> {\n const deadline = this.resolveDeadline(input.invocation.deadlineAt);\n const binding = this.binding.bind({\n runtimeSessionId: input.identity.runtimeSessionId,\n ...input.identity.scope,\n });\n\n if (this.active || this.starting) {\n throw new RuntimeBusyError(\n 'This runtime session already has an active invocation.',\n );\n }\n if (this.recentCompletedInvocationIds.has(input.identity.invocationId)) {\n throw new RuntimeDuplicateInvocationError(\n 'This recent invocation identifier already completed in the current runtime process.',\n );\n }\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(input.callerSignal.reason);\n input.callerSignal.addEventListener('abort', abortFromCaller, { once: true });\n if (input.callerSignal.aborted) {\n abortFromCaller();\n }\n\n const deadlineTimer = setTimeout(\n () => controller.abort(\n new RuntimeDeadlineError('The runtime invocation deadline elapsed.'),\n ),\n deadline.getTime() - this.now().getTime(),\n );\n deadlineTimer.unref();\n\n this.status.markExecuting();\n const executionInput = {\n scopeKey: binding.scopeKey,\n executionSessionId: binding.executionSessionId,\n request: input.invocation,\n modelApiKey: input.modelApiKey,\n mcpCapability: input.mcpCapability,\n abortSignal: controller.signal,\n } satisfies RuntimeExecutionInput;\n const startPromise = Promise.resolve().then(\n () => this.startExecution(executionInput),\n );\n const starting: StartingInvocation = {\n controller,\n promise: startPromise,\n };\n this.starting = starting;\n\n let run: RuntimeExecutionHandle;\n try {\n run = await startPromise;\n } catch (error) {\n clearTimeout(deadlineTimer);\n input.callerSignal.removeEventListener('abort', abortFromCaller);\n this.status.markIdle();\n throw error;\n } finally {\n if (this.starting === starting) {\n this.starting = undefined;\n }\n }\n\n const active: ActiveInvocation = {\n invocationId: input.identity.invocationId,\n run,\n controller,\n deadlineTimer,\n removeCallerAbortListener: () =>\n input.callerSignal.removeEventListener('abort', abortFromCaller),\n };\n this.active = active;\n controller.signal.addEventListener('abort', () => run.cancel(), {\n once: true,\n });\n if (controller.signal.aborted) {\n run.cancel();\n }\n\n const result = run.result.finally(() => this.settle(active));\n result.catch(() => undefined);\n\n return {\n runId: run.runId,\n acceptedAt: this.now().toISOString(),\n // The execution signal cancels the agent, but the event subscription\n // remains open for the executor's truthful cancelled terminal.\n events: () => run.events(),\n cancel: () => {\n const wasActive = !controller.signal.aborted;\n controller.abort();\n return wasActive;\n },\n result,\n };\n }\n\n async shutdown(): Promise<void> {\n const starting = this.starting;\n if (starting) {\n starting.controller.abort(new Error('Runtime is shutting down.'));\n const run = await starting.promise.catch(() => undefined);\n if (run) {\n run.cancel();\n await run.result.catch(() => undefined);\n }\n }\n\n const active = this.active;\n if (!active) {\n return;\n }\n active.controller.abort(new Error('Runtime is shutting down.'));\n active.run.cancel();\n await active.run.result.catch(() => undefined);\n }\n\n boundScope(): BoundRuntimeScope | undefined {\n return this.binding.current();\n }\n\n private resolveDeadline(deadlineAt?: string): Date {\n const now = this.now();\n const maximum = new Date(now.getTime() + this.config.maxInvocationMs);\n if (!deadlineAt) {\n return maximum;\n }\n\n const requested = new Date(deadlineAt);\n if (requested.getTime() <= now.getTime()) {\n throw new RuntimeDeadlineError(\n 'The runtime invocation deadline has already elapsed.',\n );\n }\n return requested.getTime() < maximum.getTime() ? requested : maximum;\n }\n\n private settle(active: ActiveInvocation): void {\n if (this.active !== active) {\n return;\n }\n clearTimeout(active.deadlineTimer);\n active.removeCallerAbortListener();\n this.active = undefined;\n this.rememberCompletedInvocation(active.invocationId);\n this.status.markIdle();\n }\n\n private rememberCompletedInvocation(invocationId: string): void {\n this.recentCompletedInvocationIds.add(invocationId);\n this.recentCompletedInvocationOrder.push(invocationId);\n if (this.recentCompletedInvocationOrder.length <= RECENT_INVOCATION_LIMIT) {\n return;\n }\n const oldest = this.recentCompletedInvocationOrder.shift();\n if (oldest) {\n this.recentCompletedInvocationIds.delete(oldest);\n }\n }\n\n private startExecution(\n input: RuntimeExecutionInput,\n ): Promise<RuntimeExecutionHandle> {\n if (input.request.kind === 'conversation-turn') {\n return this.executors.conversationTurn.start({\n ...input,\n request: input.request,\n });\n }\n return this.executors.heartbeatTask.start({\n ...input,\n request: input.request,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/host/runtime-session/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n VerifiedExecutionHostMcpCapability,\n VerifiedExecutionIdentity,\n} from '../types.js';\nimport {\n RuntimeBusyError,\n RuntimeDeadlineError,\n RuntimeDuplicateInvocationError,\n} from './errors.js';\nimport {\n RuntimeScopeBindingService,\n type BoundRuntimeScope,\n} from './scope-binding.js';\nimport {\n RuntimeSessionStatusService,\n type RuntimeSessionStatusSnapshot,\n} from './status.js';\nimport type {\n RuntimeExecutionHandle,\n RuntimeExecutionInput,\n RuntimeInvocationHandle,\n RuntimeInvocationRequest,\n RuntimeSessionConfig,\n RuntimeWorkflowExecutors,\n} from './types.js';\n\nconst RECENT_INVOCATION_LIMIT = 128;\n\ntype ActiveInvocation = {\n invocationId: string;\n run: RuntimeExecutionHandle;\n controller: AbortController;\n deadlineTimer: ReturnType<typeof setTimeout>;\n removeCallerAbortListener: () => void;\n};\n\ntype StartingInvocation = {\n controller: AbortController;\n promise: Promise<RuntimeExecutionHandle>;\n};\n\n/** Coordinates one process-bound Runtime session without owning product data. */\nexport class RuntimeSessionService {\n private active?: ActiveInvocation;\n private starting?: StartingInvocation;\n private readonly recentCompletedInvocationIds = new Set<string>();\n private readonly recentCompletedInvocationOrder: string[] = [];\n private readonly config: RuntimeSessionConfig;\n private readonly executors: RuntimeWorkflowExecutors;\n private readonly binding: RuntimeScopeBindingService;\n private readonly status: RuntimeSessionStatusService;\n private readonly now: () => Date;\n\n constructor(options: {\n config: RuntimeSessionConfig;\n executors: RuntimeWorkflowExecutors;\n binding?: RuntimeScopeBindingService;\n status?: RuntimeSessionStatusService;\n now?: () => Date;\n }) {\n if (\n !Number.isSafeInteger(options.config.maxInvocationMs)\n || options.config.maxInvocationMs <= 0\n ) {\n throw new Error('maxInvocationMs must be a positive safe integer.');\n }\n this.config = options.config;\n this.executors = options.executors;\n this.binding = options.binding ?? new RuntimeScopeBindingService();\n this.now = options.now ?? (() => new Date());\n this.status = options.status ?? new RuntimeSessionStatusService(this.now);\n }\n\n readStatus(): RuntimeSessionStatusSnapshot {\n return this.status.read();\n }\n\n async start(input: {\n identity: VerifiedExecutionIdentity;\n invocation: RuntimeInvocationRequest;\n modelApiKey: string;\n mcpCapability?: VerifiedExecutionHostMcpCapability;\n callerSignal: AbortSignal;\n }): Promise<RuntimeInvocationHandle> {\n const deadline = this.resolveDeadline(input.invocation.deadlineAt);\n const binding = this.binding.bind({\n runtimeSessionId: input.identity.runtimeSessionId,\n ...input.identity.scope,\n });\n\n if (this.active || this.starting) {\n throw new RuntimeBusyError(\n 'This runtime session already has an active invocation.',\n );\n }\n if (this.recentCompletedInvocationIds.has(input.identity.invocationId)) {\n throw new RuntimeDuplicateInvocationError(\n 'This recent invocation identifier already completed in the current runtime process.',\n );\n }\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(input.callerSignal.reason);\n input.callerSignal.addEventListener('abort', abortFromCaller, { once: true });\n if (input.callerSignal.aborted) {\n abortFromCaller();\n }\n\n const deadlineTimer = setTimeout(\n () => controller.abort(\n new RuntimeDeadlineError('The runtime invocation deadline elapsed.'),\n ),\n deadline.getTime() - this.now().getTime(),\n );\n deadlineTimer.unref();\n\n this.status.markExecuting();\n const executionInput = {\n scope: input.identity.scope,\n scopeKey: binding.scopeKey,\n executionSessionId: binding.executionSessionId,\n request: input.invocation,\n modelApiKey: input.modelApiKey,\n mcpCapability: input.mcpCapability,\n abortSignal: controller.signal,\n } satisfies RuntimeExecutionInput;\n const startPromise = Promise.resolve().then(\n () => this.startExecution(executionInput),\n );\n const starting: StartingInvocation = {\n controller,\n promise: startPromise,\n };\n this.starting = starting;\n\n let run: RuntimeExecutionHandle;\n try {\n run = await startPromise;\n } catch (error) {\n clearTimeout(deadlineTimer);\n input.callerSignal.removeEventListener('abort', abortFromCaller);\n this.status.markIdle();\n throw error;\n } finally {\n if (this.starting === starting) {\n this.starting = undefined;\n }\n }\n\n const active: ActiveInvocation = {\n invocationId: input.identity.invocationId,\n run,\n controller,\n deadlineTimer,\n removeCallerAbortListener: () =>\n input.callerSignal.removeEventListener('abort', abortFromCaller),\n };\n this.active = active;\n controller.signal.addEventListener('abort', () => run.cancel(), {\n once: true,\n });\n if (controller.signal.aborted) {\n run.cancel();\n }\n\n const result = run.result.finally(() => this.settle(active));\n result.catch(() => undefined);\n\n return {\n runId: run.runId,\n acceptedAt: this.now().toISOString(),\n // The execution signal cancels the agent, but the event subscription\n // remains open for the executor's truthful cancelled terminal.\n events: () => run.events(),\n cancel: () => {\n const wasActive = !controller.signal.aborted;\n controller.abort();\n return wasActive;\n },\n result,\n };\n }\n\n async shutdown(): Promise<void> {\n const starting = this.starting;\n if (starting) {\n starting.controller.abort(new Error('Runtime is shutting down.'));\n const run = await starting.promise.catch(() => undefined);\n if (run) {\n run.cancel();\n await run.result.catch(() => undefined);\n }\n }\n\n const active = this.active;\n if (!active) {\n return;\n }\n active.controller.abort(new Error('Runtime is shutting down.'));\n active.run.cancel();\n await active.run.result.catch(() => undefined);\n }\n\n boundScope(): BoundRuntimeScope | undefined {\n return this.binding.current();\n }\n\n private resolveDeadline(deadlineAt?: string): Date {\n const now = this.now();\n const maximum = new Date(now.getTime() + this.config.maxInvocationMs);\n if (!deadlineAt) {\n return maximum;\n }\n\n const requested = new Date(deadlineAt);\n if (requested.getTime() <= now.getTime()) {\n throw new RuntimeDeadlineError(\n 'The runtime invocation deadline has already elapsed.',\n );\n }\n return requested.getTime() < maximum.getTime() ? requested : maximum;\n }\n\n private settle(active: ActiveInvocation): void {\n if (this.active !== active) {\n return;\n }\n clearTimeout(active.deadlineTimer);\n active.removeCallerAbortListener();\n this.active = undefined;\n this.rememberCompletedInvocation(active.invocationId);\n this.status.markIdle();\n }\n\n private rememberCompletedInvocation(invocationId: string): void {\n this.recentCompletedInvocationIds.add(invocationId);\n this.recentCompletedInvocationOrder.push(invocationId);\n if (this.recentCompletedInvocationOrder.length <= RECENT_INVOCATION_LIMIT) {\n return;\n }\n const oldest = this.recentCompletedInvocationOrder.shift();\n if (oldest) {\n this.recentCompletedInvocationIds.delete(oldest);\n }\n }\n\n private startExecution(\n input: RuntimeExecutionInput,\n ): Promise<RuntimeExecutionHandle> {\n if (input.request.kind === 'conversation-turn') {\n return this.executors.conversationTurn.start({\n ...input,\n request: input.request,\n });\n }\n return this.executors.heartbeatTask.start({\n ...input,\n request: input.request,\n });\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ExecutionHostConversationTurnRequest, ExecutionHostHeartbeatTaskRequest, RuntimePublicResult } from '../../contracts/index.js';
1
+ import type { ExecutionHostConversationTurnRequest, ExecutionHostHeartbeatTaskRequest, ExecutionScope, RuntimePublicResult } from '../../contracts/index.js';
2
2
  import type { VerifiedExecutionHostMcpCapability } from '../types.js';
3
3
  type RuntimeExecutionStreamEnvelope = {
4
4
  runId: string;
@@ -24,6 +24,8 @@ export type RuntimeExecutionStreamItem<Result = unknown> = (RuntimeExecutionStre
24
24
  });
25
25
  export type RuntimeInvocationRequest = ExecutionHostConversationTurnRequest | ExecutionHostHeartbeatTaskRequest;
26
26
  export type RuntimeExecutionInput<Request extends RuntimeInvocationRequest = RuntimeInvocationRequest> = {
27
+ /** Verified product identity forwarded unchanged from host admission. */
28
+ scope: Readonly<ExecutionScope>;
27
29
  scopeKey: string;
28
30
  executionSessionId: string;
29
31
  request: Request;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/host/runtime-session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oCAAoC,EACpC,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;AAEtE,KAAK,8BAA8B,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,0BAA0B,CAAC,MAAM,GAAG,OAAO,IACnD,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC,GACA,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,GACA,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,GACA,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,CAAC,CAAC;AAEL,MAAM,MAAM,wBAAwB,GAChC,oCAAoC,GACpC,iCAAiC,CAAC;AAEtC,MAAM,MAAM,qBAAqB,CAC/B,OAAO,SAAS,wBAAwB,GAAG,wBAAwB,IACjE;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,kCAAkC,CAAC;IACnD,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,MAAM,GAAG,OAAO,IAAI;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,CAAC,OAAO,CAAC,EAAE;QACf,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,aAAa,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,OAAO,CAAC;CACnB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,wBAAwB,EACxC,MAAM,IACJ;IACF,KAAK,CACH,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,GACpC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,eAAe,GAAG,OAAO,IAAI;IAChE,gBAAgB,EAAE,uBAAuB,CACvC,oCAAoC,EACpC,mBAAmB,CACpB,CAAC;IACF,aAAa,EAAE,uBAAuB,CACpC,iCAAiC,EACjC,eAAe,CAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,uBAAuB,CAAC,MAAM,GAAG,OAAO,IAAI;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,IAAI,aAAa,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/host/runtime-session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oCAAoC,EACpC,iCAAiC,EACjC,cAAc,EACd,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,aAAa,CAAC;AAEtE,KAAK,8BAA8B,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,0BAA0B,CAAC,MAAM,GAAG,OAAO,IACnD,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC,GACA,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,GACA,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,GACA,CAAC,8BAA8B,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,CAAC,CAAC;AAEL,MAAM,MAAM,wBAAwB,GAChC,oCAAoC,GACpC,iCAAiC,CAAC;AAEtC,MAAM,MAAM,qBAAqB,CAC/B,OAAO,SAAS,wBAAwB,GAAG,wBAAwB,IACjE;IACF,yEAAyE;IACzE,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,kCAAkC,CAAC;IACnD,WAAW,EAAE,WAAW,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,MAAM,GAAG,OAAO,IAAI;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,CAAC,OAAO,CAAC,EAAE;QACf,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,aAAa,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,OAAO,CAAC;CACnB,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,uBAAuB,CACjC,OAAO,SAAS,wBAAwB,EACxC,MAAM,IACJ;IACF,KAAK,CACH,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,GACpC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,eAAe,GAAG,OAAO,IAAI;IAChE,gBAAgB,EAAE,uBAAuB,CACvC,oCAAoC,EACpC,mBAAmB,CACpB,CAAC;IACF,aAAa,EAAE,uBAAuB,CACpC,iCAAiC,EACjC,eAAe,CAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,uBAAuB,CAAC,MAAM,GAAG,OAAO,IAAI;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,IAAI,aAAa,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/host/runtime-session/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ExecutionHostConversationTurnRequest,\n ExecutionHostHeartbeatTaskRequest,\n RuntimePublicResult,\n} from '../../contracts/index.js';\nimport type { VerifiedExecutionHostMcpCapability } from '../types.js';\n\ntype RuntimeExecutionStreamEnvelope = {\n runId: string;\n sequence: number;\n timestamp: string;\n};\n\n/** Ordered execution events exposed by any workflow executor. */\nexport type RuntimeExecutionStreamItem<Result = unknown> =\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'activity';\n activity: unknown;\n })\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'result';\n result: Result;\n })\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'cancelled';\n reason: string;\n })\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'error';\n error: { code: string; message: string };\n });\n\nexport type RuntimeInvocationRequest =\n | ExecutionHostConversationTurnRequest\n | ExecutionHostHeartbeatTaskRequest;\n\nexport type RuntimeExecutionInput<\n Request extends RuntimeInvocationRequest = RuntimeInvocationRequest,\n> = {\n scopeKey: string;\n executionSessionId: string;\n request: Request;\n modelApiKey: string;\n mcpCapability?: VerifiedExecutionHostMcpCapability;\n abortSignal: AbortSignal;\n};\n\nexport type RuntimeExecutionHandle<Result = unknown> = {\n runId: string;\n result: Promise<Result>;\n events(options?: {\n signal?: AbortSignal;\n }): AsyncIterable<RuntimeExecutionStreamItem<Result>>;\n cancel(): boolean;\n};\n\n/** Outbound execution port for one provider-neutral workflow. */\nexport type RuntimeWorkflowExecutor<\n Request extends RuntimeInvocationRequest,\n Result,\n> = {\n start(\n input: RuntimeExecutionInput<Request>,\n ): Promise<RuntimeExecutionHandle<Result>>;\n};\n\nexport type RuntimeWorkflowExecutors<HeartbeatResult = unknown> = {\n conversationTurn: RuntimeWorkflowExecutor<\n ExecutionHostConversationTurnRequest,\n RuntimePublicResult\n >;\n heartbeatTask: RuntimeWorkflowExecutor<\n ExecutionHostHeartbeatTaskRequest,\n HeartbeatResult\n >;\n};\n\nexport type RuntimeInvocationHandle<Result = unknown> = {\n runId: string;\n acceptedAt: string;\n events(): AsyncIterable<RuntimeExecutionStreamItem<Result>>;\n cancel(): boolean;\n result: Promise<Result>;\n};\n\nexport type RuntimeSessionConfig = {\n maxInvocationMs: number;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/host/runtime-session/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ExecutionHostConversationTurnRequest,\n ExecutionHostHeartbeatTaskRequest,\n ExecutionScope,\n RuntimePublicResult,\n} from '../../contracts/index.js';\nimport type { VerifiedExecutionHostMcpCapability } from '../types.js';\n\ntype RuntimeExecutionStreamEnvelope = {\n runId: string;\n sequence: number;\n timestamp: string;\n};\n\n/** Ordered execution events exposed by any workflow executor. */\nexport type RuntimeExecutionStreamItem<Result = unknown> =\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'activity';\n activity: unknown;\n })\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'result';\n result: Result;\n })\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'cancelled';\n reason: string;\n })\n | (RuntimeExecutionStreamEnvelope & {\n kind: 'error';\n error: { code: string; message: string };\n });\n\nexport type RuntimeInvocationRequest =\n | ExecutionHostConversationTurnRequest\n | ExecutionHostHeartbeatTaskRequest;\n\nexport type RuntimeExecutionInput<\n Request extends RuntimeInvocationRequest = RuntimeInvocationRequest,\n> = {\n /** Verified product identity forwarded unchanged from host admission. */\n scope: Readonly<ExecutionScope>;\n scopeKey: string;\n executionSessionId: string;\n request: Request;\n modelApiKey: string;\n mcpCapability?: VerifiedExecutionHostMcpCapability;\n abortSignal: AbortSignal;\n};\n\nexport type RuntimeExecutionHandle<Result = unknown> = {\n runId: string;\n result: Promise<Result>;\n events(options?: {\n signal?: AbortSignal;\n }): AsyncIterable<RuntimeExecutionStreamItem<Result>>;\n cancel(): boolean;\n};\n\n/** Outbound execution port for one provider-neutral workflow. */\nexport type RuntimeWorkflowExecutor<\n Request extends RuntimeInvocationRequest,\n Result,\n> = {\n start(\n input: RuntimeExecutionInput<Request>,\n ): Promise<RuntimeExecutionHandle<Result>>;\n};\n\nexport type RuntimeWorkflowExecutors<HeartbeatResult = unknown> = {\n conversationTurn: RuntimeWorkflowExecutor<\n ExecutionHostConversationTurnRequest,\n RuntimePublicResult\n >;\n heartbeatTask: RuntimeWorkflowExecutor<\n ExecutionHostHeartbeatTaskRequest,\n HeartbeatResult\n >;\n};\n\nexport type RuntimeInvocationHandle<Result = unknown> = {\n runId: string;\n acceptedAt: string;\n events(): AsyncIterable<RuntimeExecutionStreamItem<Result>>;\n cancel(): boolean;\n result: Promise<Result>;\n};\n\nexport type RuntimeSessionConfig = {\n maxInvocationMs: number;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heddleagent/execution-host-client",
3
- "version": "6.6.0",
3
+ "version": "6.7.0",
4
4
  "description": "Contracts, execution authority, lifecycle services, and adopter clients for compatible Heddle Execution Hosts",
5
5
  "author": "Jay / Fienna Liang <roackb2@gmail.com>",
6
6
  "license": "MIT",
@@ -11,11 +11,6 @@
11
11
  "tag": "latest",
12
12
  "registry": "https://registry.npmjs.org/"
13
13
  },
14
- "repository": {
15
- "type": "git",
16
- "url": "git+https://github.com/roackb2/heddle.git",
17
- "directory": "packages/execution-host-client"
18
- },
19
14
  "homepage": "https://heddleagent.com",
20
15
  "bugs": {
21
16
  "url": "https://github.com/roackb2/heddle/issues"
@@ -106,6 +101,16 @@
106
101
  "sdk",
107
102
  "streaming"
108
103
  ],
104
+ "scripts": {
105
+ "build": "yarn clean && yarn contract:verify && tsc -p tsconfig.build.json",
106
+ "clean": "node ../../scripts/clean-dist.mjs execution-host-client",
107
+ "conformance:python-v1": "python3 -m ruff check conformance/reference-adopters/python-v1 && python3 -m ruff format --check conformance/reference-adopters/python-v1 && python3 -m pytest conformance/reference-adopters/python-v1",
108
+ "contract:generate": "tsx scripts/generate-contract-artifacts.ts",
109
+ "contract:verify": "tsx scripts/generate-contract-artifacts.ts --check",
110
+ "example:node-control-plane": "yarn build && tsx examples/node-control-plane.ts",
111
+ "test": "vitest run --config vitest.config.ts",
112
+ "typecheck": "tsc -p tsconfig.test.json --noEmit"
113
+ },
109
114
  "dependencies": {
110
115
  "@aws-sdk/client-bedrock-agentcore": "^3.1107.0",
111
116
  "@modelcontextprotocol/sdk": "^1.29.0",
@@ -114,5 +119,11 @@
114
119
  "eventsource-parser": "^3.1.0",
115
120
  "jose": "^6.2.8",
116
121
  "zod": "^4.3.6"
122
+ },
123
+ "devDependencies": {
124
+ "@types/node": "^22.13.10",
125
+ "tsx": "^4.19.3",
126
+ "typescript": "^5.9.3",
127
+ "vitest": "^4.1.2"
117
128
  }
118
129
  }