@xemahq/agent-session-runtime 0.6.7 → 0.8.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.
Files changed (48) hide show
  1. package/README.md +6 -1
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/agent-resolution.d.ts.map +1 -1
  7. package/dist/lib/agent-resolution.js.map +1 -1
  8. package/dist/lib/dispatch-contract.d.ts +2 -1
  9. package/dist/lib/dispatch-contract.d.ts.map +1 -1
  10. package/dist/lib/launch-identity/canonical-contract.d.ts +22 -0
  11. package/dist/lib/launch-identity/canonical-contract.d.ts.map +1 -0
  12. package/dist/lib/launch-identity/canonical-contract.js +229 -0
  13. package/dist/lib/launch-identity/canonical-contract.js.map +1 -0
  14. package/dist/lib/launch-identity/compiled-session-launch-plan-store.d.ts +44 -0
  15. package/dist/lib/launch-identity/compiled-session-launch-plan-store.d.ts.map +1 -0
  16. package/dist/lib/launch-identity/compiled-session-launch-plan-store.js +116 -0
  17. package/dist/lib/launch-identity/compiled-session-launch-plan-store.js.map +1 -0
  18. package/dist/lib/launch-identity/compiled-session-launch-plan.d.ts +84 -0
  19. package/dist/lib/launch-identity/compiled-session-launch-plan.d.ts.map +1 -0
  20. package/dist/lib/launch-identity/compiled-session-launch-plan.js +382 -0
  21. package/dist/lib/launch-identity/compiled-session-launch-plan.js.map +1 -0
  22. package/dist/lib/launch-identity/index.d.ts +7 -0
  23. package/dist/lib/launch-identity/index.d.ts.map +1 -0
  24. package/dist/lib/launch-identity/index.js +23 -0
  25. package/dist/lib/launch-identity/index.js.map +1 -0
  26. package/dist/lib/launch-identity/runtime-template-key.d.ts +30 -0
  27. package/dist/lib/launch-identity/runtime-template-key.d.ts.map +1 -0
  28. package/dist/lib/launch-identity/runtime-template-key.js +69 -0
  29. package/dist/lib/launch-identity/runtime-template-key.js.map +1 -0
  30. package/dist/lib/launch-identity/session-binding.d.ts +24 -0
  31. package/dist/lib/launch-identity/session-binding.d.ts.map +1 -0
  32. package/dist/lib/launch-identity/session-binding.js +62 -0
  33. package/dist/lib/launch-identity/session-binding.js.map +1 -0
  34. package/dist/lib/launch-identity/thread-reuse-key.d.ts +19 -0
  35. package/dist/lib/launch-identity/thread-reuse-key.d.ts.map +1 -0
  36. package/dist/lib/launch-identity/thread-reuse-key.js +46 -0
  37. package/dist/lib/launch-identity/thread-reuse-key.js.map +1 -0
  38. package/package.json +7 -5
  39. package/src/index.ts +1 -0
  40. package/src/lib/agent-resolution.ts +15 -4
  41. package/src/lib/dispatch-contract.ts +4 -9
  42. package/src/lib/launch-identity/canonical-contract.ts +352 -0
  43. package/src/lib/launch-identity/compiled-session-launch-plan-store.ts +178 -0
  44. package/src/lib/launch-identity/compiled-session-launch-plan.ts +681 -0
  45. package/src/lib/launch-identity/index.ts +6 -0
  46. package/src/lib/launch-identity/runtime-template-key.ts +143 -0
  47. package/src/lib/launch-identity/session-binding.ts +152 -0
  48. package/src/lib/launch-identity/thread-reuse-key.ts +93 -0
@@ -0,0 +1,143 @@
1
+ import {
2
+ assertNoTenantOrSecretTemplateFields,
3
+ canonicalContractJson,
4
+ hashCanonicalContract,
5
+ requireEnumValue,
6
+ requireExactObject,
7
+ requireImageDigest,
8
+ requireNonEmptyString,
9
+ requireSha256,
10
+ } from './canonical-contract';
11
+
12
+ export enum RuntimeTemplateTenantDependency {
13
+ OrganizationNeutral = 'organization-neutral',
14
+ OrganizationBound = 'organization-bound',
15
+ }
16
+
17
+ export enum RuntimeTemplateTrustPolicy {
18
+ Shared = 'shared',
19
+ Dedicated = 'dedicated',
20
+ Confidential = 'confidential',
21
+ }
22
+
23
+ export interface RuntimeTemplateKey {
24
+ readonly schemaVersion: 1;
25
+ readonly tenantDependency: RuntimeTemplateTenantDependency;
26
+ readonly trustPolicy: RuntimeTemplateTrustPolicy;
27
+ readonly runtimeRef: string;
28
+ readonly runtimeRevision: string;
29
+ readonly imageDigest: string;
30
+ readonly agentRevision: string;
31
+ readonly primaryAgentHash: string;
32
+ readonly subagentsHash: string;
33
+ readonly skillsHash: string;
34
+ readonly toolsHash: string;
35
+ readonly capabilityDescriptorsHash: string;
36
+ readonly mcpDescriptorsHash: string;
37
+ readonly workspacePlanHash: string;
38
+ readonly layoutProfile: string;
39
+ }
40
+
41
+ const REQUIRED_KEYS = [
42
+ 'schemaVersion',
43
+ 'tenantDependency',
44
+ 'trustPolicy',
45
+ 'runtimeRef',
46
+ 'runtimeRevision',
47
+ 'imageDigest',
48
+ 'agentRevision',
49
+ 'primaryAgentHash',
50
+ 'subagentsHash',
51
+ 'skillsHash',
52
+ 'toolsHash',
53
+ 'capabilityDescriptorsHash',
54
+ 'mcpDescriptorsHash',
55
+ 'workspacePlanHash',
56
+ 'layoutProfile',
57
+ ] as const;
58
+
59
+ const TENANT_DEPENDENCIES = Object.values(RuntimeTemplateTenantDependency);
60
+ const TRUST_POLICIES = Object.values(RuntimeTemplateTrustPolicy);
61
+
62
+ /**
63
+ * Validates and canonicalizes the immutable execution dimensions used to
64
+ * select warm compute. Tenant, invocation and credential data have no valid
65
+ * slot in this contract and are rejected even when supplied as extra fields.
66
+ */
67
+ export function createRuntimeTemplateKey(input: unknown): RuntimeTemplateKey {
68
+ assertNoTenantOrSecretTemplateFields(input, 'RuntimeTemplateKey');
69
+ const object = requireExactObject(input, 'RuntimeTemplateKey', REQUIRED_KEYS);
70
+
71
+ if (object.schemaVersion !== 1) {
72
+ throw new TypeError('RuntimeTemplateKey.schemaVersion must be 1.');
73
+ }
74
+
75
+ const imageDigest = requireImageDigest(
76
+ object.imageDigest,
77
+ 'RuntimeTemplateKey.imageDigest',
78
+ );
79
+
80
+ return Object.freeze({
81
+ schemaVersion: 1,
82
+ tenantDependency: requireEnumValue(
83
+ object.tenantDependency,
84
+ 'RuntimeTemplateKey.tenantDependency',
85
+ TENANT_DEPENDENCIES,
86
+ ),
87
+ trustPolicy: requireEnumValue(
88
+ object.trustPolicy,
89
+ 'RuntimeTemplateKey.trustPolicy',
90
+ TRUST_POLICIES,
91
+ ),
92
+ runtimeRef: requireNonEmptyString(
93
+ object.runtimeRef,
94
+ 'RuntimeTemplateKey.runtimeRef',
95
+ ),
96
+ runtimeRevision: requireNonEmptyString(
97
+ object.runtimeRevision,
98
+ 'RuntimeTemplateKey.runtimeRevision',
99
+ ),
100
+ imageDigest,
101
+ agentRevision: requireNonEmptyString(
102
+ object.agentRevision,
103
+ 'RuntimeTemplateKey.agentRevision',
104
+ ),
105
+ primaryAgentHash: requireSha256(
106
+ object.primaryAgentHash,
107
+ 'RuntimeTemplateKey.primaryAgentHash',
108
+ ),
109
+ subagentsHash: requireSha256(
110
+ object.subagentsHash,
111
+ 'RuntimeTemplateKey.subagentsHash',
112
+ ),
113
+ skillsHash: requireSha256(
114
+ object.skillsHash,
115
+ 'RuntimeTemplateKey.skillsHash',
116
+ ),
117
+ toolsHash: requireSha256(object.toolsHash, 'RuntimeTemplateKey.toolsHash'),
118
+ capabilityDescriptorsHash: requireSha256(
119
+ object.capabilityDescriptorsHash,
120
+ 'RuntimeTemplateKey.capabilityDescriptorsHash',
121
+ ),
122
+ mcpDescriptorsHash: requireSha256(
123
+ object.mcpDescriptorsHash,
124
+ 'RuntimeTemplateKey.mcpDescriptorsHash',
125
+ ),
126
+ workspacePlanHash: requireSha256(
127
+ object.workspacePlanHash,
128
+ 'RuntimeTemplateKey.workspacePlanHash',
129
+ ),
130
+ layoutProfile: requireNonEmptyString(
131
+ object.layoutProfile,
132
+ 'RuntimeTemplateKey.layoutProfile',
133
+ ),
134
+ });
135
+ }
136
+
137
+ export function serializeRuntimeTemplateKey(input: RuntimeTemplateKey): string {
138
+ return canonicalContractJson(createRuntimeTemplateKey(input));
139
+ }
140
+
141
+ export function hashRuntimeTemplateKey(input: RuntimeTemplateKey): string {
142
+ return hashCanonicalContract(createRuntimeTemplateKey(input));
143
+ }
@@ -0,0 +1,152 @@
1
+ import {
2
+ canonicalContractJson,
3
+ type CanonicalJsonValue,
4
+ hashCanonicalContract,
5
+ type ResourceBindingRef,
6
+ requireExactObject,
7
+ requireNonEmptyString,
8
+ requireNonNegativeSafeInteger,
9
+ requireResourceBindingRefs,
10
+ requireSecretFreeJsonObject,
11
+ requireStringRefs,
12
+ } from './canonical-contract';
13
+
14
+ export interface SessionBinding {
15
+ readonly schemaVersion: 1;
16
+ readonly sessionId: string;
17
+ readonly organizationId: string;
18
+ readonly projectId: string;
19
+ readonly userId: string;
20
+ readonly domainRefs: readonly ResourceBindingRef[];
21
+ readonly storageAllocationRef: string;
22
+ readonly workingFileSourceRefs: readonly string[];
23
+ readonly outputRouteRef: string;
24
+ readonly actorTokenRef?: string;
25
+ readonly serviceTokenRef?: string;
26
+ readonly providerTokenRefs: readonly string[];
27
+ readonly credentialGrantRefs: readonly string[];
28
+ readonly databaseGrantRefs: readonly string[];
29
+ readonly dynamicContext: Readonly<Record<string, CanonicalJsonValue>>;
30
+ readonly bindingRevision: string;
31
+ readonly bindingEpoch: number;
32
+ }
33
+
34
+ const REQUIRED_KEYS = [
35
+ 'schemaVersion',
36
+ 'sessionId',
37
+ 'organizationId',
38
+ 'projectId',
39
+ 'userId',
40
+ 'domainRefs',
41
+ 'storageAllocationRef',
42
+ 'workingFileSourceRefs',
43
+ 'outputRouteRef',
44
+ 'providerTokenRefs',
45
+ 'credentialGrantRefs',
46
+ 'databaseGrantRefs',
47
+ 'dynamicContext',
48
+ 'bindingRevision',
49
+ 'bindingEpoch',
50
+ ] as const;
51
+
52
+ const OPTIONAL_KEYS = ['actorTokenRef', 'serviceTokenRef'] as const;
53
+
54
+ /**
55
+ * Canonical tenant/session state applied atomically after a runtime claim.
56
+ * Credentials are represented only by opaque refs; raw secrets are rejected
57
+ * from dynamicContext.
58
+ */
59
+ export function createSessionBinding(input: unknown): SessionBinding {
60
+ const object = requireExactObject(
61
+ input,
62
+ 'SessionBinding',
63
+ REQUIRED_KEYS,
64
+ OPTIONAL_KEYS,
65
+ );
66
+
67
+ if (object.schemaVersion !== 1) {
68
+ throw new TypeError('SessionBinding.schemaVersion must be 1.');
69
+ }
70
+
71
+ const actorTokenRef =
72
+ object.actorTokenRef === undefined
73
+ ? undefined
74
+ : requireNonEmptyString(
75
+ object.actorTokenRef,
76
+ 'SessionBinding.actorTokenRef',
77
+ );
78
+ const serviceTokenRef =
79
+ object.serviceTokenRef === undefined
80
+ ? undefined
81
+ : requireNonEmptyString(
82
+ object.serviceTokenRef,
83
+ 'SessionBinding.serviceTokenRef',
84
+ );
85
+
86
+ return Object.freeze({
87
+ schemaVersion: 1,
88
+ sessionId: requireNonEmptyString(
89
+ object.sessionId,
90
+ 'SessionBinding.sessionId',
91
+ ),
92
+ organizationId: requireNonEmptyString(
93
+ object.organizationId,
94
+ 'SessionBinding.organizationId',
95
+ ),
96
+ projectId: requireNonEmptyString(
97
+ object.projectId,
98
+ 'SessionBinding.projectId',
99
+ ),
100
+ userId: requireNonEmptyString(object.userId, 'SessionBinding.userId'),
101
+ domainRefs: requireResourceBindingRefs(
102
+ object.domainRefs,
103
+ 'SessionBinding.domainRefs',
104
+ ),
105
+ storageAllocationRef: requireNonEmptyString(
106
+ object.storageAllocationRef,
107
+ 'SessionBinding.storageAllocationRef',
108
+ ),
109
+ workingFileSourceRefs: requireStringRefs(
110
+ object.workingFileSourceRefs,
111
+ 'SessionBinding.workingFileSourceRefs',
112
+ ),
113
+ outputRouteRef: requireNonEmptyString(
114
+ object.outputRouteRef,
115
+ 'SessionBinding.outputRouteRef',
116
+ ),
117
+ ...(actorTokenRef === undefined ? {} : { actorTokenRef }),
118
+ ...(serviceTokenRef === undefined ? {} : { serviceTokenRef }),
119
+ providerTokenRefs: requireStringRefs(
120
+ object.providerTokenRefs,
121
+ 'SessionBinding.providerTokenRefs',
122
+ ),
123
+ credentialGrantRefs: requireStringRefs(
124
+ object.credentialGrantRefs,
125
+ 'SessionBinding.credentialGrantRefs',
126
+ ),
127
+ databaseGrantRefs: requireStringRefs(
128
+ object.databaseGrantRefs,
129
+ 'SessionBinding.databaseGrantRefs',
130
+ ),
131
+ dynamicContext: requireSecretFreeJsonObject(
132
+ object.dynamicContext,
133
+ 'SessionBinding.dynamicContext',
134
+ ),
135
+ bindingRevision: requireNonEmptyString(
136
+ object.bindingRevision,
137
+ 'SessionBinding.bindingRevision',
138
+ ),
139
+ bindingEpoch: requireNonNegativeSafeInteger(
140
+ object.bindingEpoch,
141
+ 'SessionBinding.bindingEpoch',
142
+ ),
143
+ });
144
+ }
145
+
146
+ export function serializeSessionBinding(input: SessionBinding): string {
147
+ return canonicalContractJson(createSessionBinding(input));
148
+ }
149
+
150
+ export function hashSessionBinding(input: SessionBinding): string {
151
+ return hashCanonicalContract(createSessionBinding(input));
152
+ }
@@ -0,0 +1,93 @@
1
+ import {
2
+ canonicalContractJson,
3
+ hashCanonicalContract,
4
+ type ResourceBindingRef,
5
+ requireEnumValue,
6
+ requireExactObject,
7
+ requireNonEmptyString,
8
+ requireResourceBindingRefs,
9
+ requireSha256,
10
+ } from './canonical-contract';
11
+
12
+ export enum ThreadReusePolicy {
13
+ ExplicitlyShareable = 'explicitly-shareable',
14
+ }
15
+
16
+ export interface ThreadReuseKey {
17
+ readonly schemaVersion: 1;
18
+ readonly reusePolicy: ThreadReusePolicy.ExplicitlyShareable;
19
+ readonly organizationId: string;
20
+ readonly projectId: string;
21
+ readonly userId: string;
22
+ readonly runtimeTemplateHash: string;
23
+ readonly conversationRef: string;
24
+ readonly workspaceRef: string;
25
+ readonly domainRefs: readonly ResourceBindingRef[];
26
+ }
27
+
28
+ const REQUIRED_KEYS = [
29
+ 'schemaVersion',
30
+ 'reusePolicy',
31
+ 'organizationId',
32
+ 'projectId',
33
+ 'userId',
34
+ 'runtimeTemplateHash',
35
+ 'conversationRef',
36
+ 'workspaceRef',
37
+ 'domainRefs',
38
+ ] as const;
39
+
40
+ /**
41
+ * Canonical identity for the deliberately narrower same-user conversation and
42
+ * filesystem reuse decision. A RuntimeTemplateKey match alone never permits
43
+ * Thread reuse.
44
+ */
45
+ export function createThreadReuseKey(input: unknown): ThreadReuseKey {
46
+ const object = requireExactObject(input, 'ThreadReuseKey', REQUIRED_KEYS);
47
+
48
+ if (object.schemaVersion !== 1) {
49
+ throw new TypeError('ThreadReuseKey.schemaVersion must be 1.');
50
+ }
51
+
52
+ return Object.freeze({
53
+ schemaVersion: 1,
54
+ reusePolicy: requireEnumValue(
55
+ object.reusePolicy,
56
+ 'ThreadReuseKey.reusePolicy',
57
+ [ThreadReusePolicy.ExplicitlyShareable],
58
+ ),
59
+ organizationId: requireNonEmptyString(
60
+ object.organizationId,
61
+ 'ThreadReuseKey.organizationId',
62
+ ),
63
+ projectId: requireNonEmptyString(
64
+ object.projectId,
65
+ 'ThreadReuseKey.projectId',
66
+ ),
67
+ userId: requireNonEmptyString(object.userId, 'ThreadReuseKey.userId'),
68
+ runtimeTemplateHash: requireSha256(
69
+ object.runtimeTemplateHash,
70
+ 'ThreadReuseKey.runtimeTemplateHash',
71
+ ),
72
+ conversationRef: requireNonEmptyString(
73
+ object.conversationRef,
74
+ 'ThreadReuseKey.conversationRef',
75
+ ),
76
+ workspaceRef: requireNonEmptyString(
77
+ object.workspaceRef,
78
+ 'ThreadReuseKey.workspaceRef',
79
+ ),
80
+ domainRefs: requireResourceBindingRefs(
81
+ object.domainRefs,
82
+ 'ThreadReuseKey.domainRefs',
83
+ ),
84
+ });
85
+ }
86
+
87
+ export function serializeThreadReuseKey(input: ThreadReuseKey): string {
88
+ return canonicalContractJson(createThreadReuseKey(input));
89
+ }
90
+
91
+ export function hashThreadReuseKey(input: ThreadReuseKey): string {
92
+ return hashCanonicalContract(createThreadReuseKey(input));
93
+ }