@jterrats/open-orchestra 1.0.15 → 1.0.17

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 (191) hide show
  1. package/AGENTS.md +3 -3
  2. package/CLAUDE.md +26 -4
  3. package/README.md +32 -9
  4. package/dist/benchmark.js +65 -27
  5. package/dist/benchmark.js.map +1 -1
  6. package/dist/command-manifest.js +6 -1
  7. package/dist/command-manifest.js.map +1 -1
  8. package/dist/command-routes.js +8 -1
  9. package/dist/command-routes.js.map +1 -1
  10. package/dist/commands.d.ts +2 -1
  11. package/dist/commands.js +2 -1
  12. package/dist/commands.js.map +1 -1
  13. package/dist/context-vault-commands.d.ts +5 -0
  14. package/dist/context-vault-commands.js +79 -0
  15. package/dist/context-vault-commands.js.map +1 -0
  16. package/dist/context-vault-file-metadata.d.ts +3 -0
  17. package/dist/context-vault-file-metadata.js +25 -0
  18. package/dist/context-vault-file-metadata.js.map +1 -0
  19. package/dist/context-vault-model.d.ts +79 -0
  20. package/dist/context-vault-model.js +2 -0
  21. package/dist/context-vault-model.js.map +1 -0
  22. package/dist/context-vault-redaction.d.ts +5 -0
  23. package/dist/context-vault-redaction.js +22 -0
  24. package/dist/context-vault-redaction.js.map +1 -0
  25. package/dist/context-vault-renderer.d.ts +3 -0
  26. package/dist/context-vault-renderer.js +30 -0
  27. package/dist/context-vault-renderer.js.map +1 -0
  28. package/dist/context-vault-service.d.ts +17 -0
  29. package/dist/context-vault-service.js +183 -0
  30. package/dist/context-vault-service.js.map +1 -0
  31. package/dist/delivery-commands.d.ts +1 -0
  32. package/dist/delivery-commands.js +19 -1
  33. package/dist/delivery-commands.js.map +1 -1
  34. package/dist/diagram-schema.d.ts +2 -0
  35. package/dist/diagram-schema.js +148 -0
  36. package/dist/diagram-schema.js.map +1 -0
  37. package/dist/diagrams/index.d.ts +2 -0
  38. package/dist/diagrams/index.js +2 -0
  39. package/dist/diagrams/index.js.map +1 -1
  40. package/dist/diagrams/pipeline.js +7 -5
  41. package/dist/diagrams/pipeline.js.map +1 -1
  42. package/dist/evidence-compaction-model.d.ts +62 -0
  43. package/dist/evidence-compaction-model.js +2 -0
  44. package/dist/evidence-compaction-model.js.map +1 -0
  45. package/dist/evidence-compaction-renderer.d.ts +2 -0
  46. package/dist/evidence-compaction-renderer.js +35 -0
  47. package/dist/evidence-compaction-renderer.js.map +1 -0
  48. package/dist/evidence-compaction-service.d.ts +11 -0
  49. package/dist/evidence-compaction-service.js +94 -0
  50. package/dist/evidence-compaction-service.js.map +1 -0
  51. package/dist/evidence-compaction-summary.d.ts +4 -0
  52. package/dist/evidence-compaction-summary.js +160 -0
  53. package/dist/evidence-compaction-summary.js.map +1 -0
  54. package/dist/knowledge-base.js +7 -1
  55. package/dist/knowledge-base.js.map +1 -1
  56. package/dist/metrics-commands.js +3 -0
  57. package/dist/metrics-commands.js.map +1 -1
  58. package/dist/planning-commands.js +23 -1
  59. package/dist/planning-commands.js.map +1 -1
  60. package/dist/quality-contracts.js +12 -6
  61. package/dist/quality-contracts.js.map +1 -1
  62. package/dist/report-index.d.ts +3 -0
  63. package/dist/report-index.js +3 -0
  64. package/dist/report-index.js.map +1 -0
  65. package/dist/report-model.d.ts +22 -0
  66. package/dist/report-model.js +2 -0
  67. package/dist/report-model.js.map +1 -0
  68. package/dist/report-render-markdown.d.ts +1 -0
  69. package/dist/report-render-markdown.js +40 -0
  70. package/dist/report-render-markdown.js.map +1 -0
  71. package/dist/report-schema.d.ts +2 -0
  72. package/dist/report-schema.js +109 -0
  73. package/dist/report-schema.js.map +1 -0
  74. package/dist/rule-catalog.d.ts +33 -0
  75. package/dist/rule-catalog.js +215 -0
  76. package/dist/rule-catalog.js.map +1 -0
  77. package/dist/runtime-bootstrap.js +33 -8
  78. package/dist/runtime-bootstrap.js.map +1 -1
  79. package/dist/runtime-capacity-policy.d.ts +38 -0
  80. package/dist/runtime-capacity-policy.js +117 -0
  81. package/dist/runtime-capacity-policy.js.map +1 -0
  82. package/dist/runtime-capacity-scheduler-helpers.d.ts +40 -0
  83. package/dist/runtime-capacity-scheduler-helpers.js +111 -0
  84. package/dist/runtime-capacity-scheduler-helpers.js.map +1 -0
  85. package/dist/runtime-capacity-scheduler-state.d.ts +44 -0
  86. package/dist/runtime-capacity-scheduler-state.js +128 -0
  87. package/dist/runtime-capacity-scheduler-state.js.map +1 -0
  88. package/dist/runtime-capacity-scheduler.d.ts +34 -0
  89. package/dist/runtime-capacity-scheduler.js +193 -0
  90. package/dist/runtime-capacity-scheduler.js.map +1 -0
  91. package/dist/runtime-capacity-snapshot.d.ts +14 -0
  92. package/dist/runtime-capacity-snapshot.js +87 -0
  93. package/dist/runtime-capacity-snapshot.js.map +1 -0
  94. package/dist/runtime-child-prompt.d.ts +2 -1
  95. package/dist/runtime-child-prompt.js +4 -1
  96. package/dist/runtime-child-prompt.js.map +1 -1
  97. package/dist/runtime-claude-native-bridge.js +2 -1
  98. package/dist/runtime-claude-native-bridge.js.map +1 -1
  99. package/dist/runtime-commands.js +6 -0
  100. package/dist/runtime-commands.js.map +1 -1
  101. package/dist/runtime-context-manifest.js +3 -24
  102. package/dist/runtime-context-manifest.js.map +1 -1
  103. package/dist/runtime-lifecycle-watch.d.ts +5 -2
  104. package/dist/runtime-lifecycle-watch.js +19 -3
  105. package/dist/runtime-lifecycle-watch.js.map +1 -1
  106. package/dist/runtime-load-balancer.d.ts +12 -0
  107. package/dist/runtime-load-balancer.js +106 -0
  108. package/dist/runtime-load-balancer.js.map +1 -0
  109. package/dist/runtime-spawn-bridge.js +23 -0
  110. package/dist/runtime-spawn-bridge.js.map +1 -1
  111. package/dist/runtime-spawn-guidance.js +15 -0
  112. package/dist/runtime-spawn-guidance.js.map +1 -1
  113. package/dist/runtime-worker-registry.d.ts +19 -0
  114. package/dist/runtime-worker-registry.js +84 -0
  115. package/dist/runtime-worker-registry.js.map +1 -0
  116. package/dist/security/content-classifier.d.ts +2 -0
  117. package/dist/security/content-classifier.js +147 -0
  118. package/dist/security/content-classifier.js.map +1 -0
  119. package/dist/security/operation-contract-types.d.ts +28 -0
  120. package/dist/security/operation-contract-types.js +2 -0
  121. package/dist/security/operation-contract-types.js.map +1 -0
  122. package/dist/security/operation-contract.d.ts +2 -0
  123. package/dist/security/operation-contract.js +169 -0
  124. package/dist/security/operation-contract.js.map +1 -0
  125. package/dist/security/policy-engine.d.ts +2 -0
  126. package/dist/security/policy-engine.js +142 -0
  127. package/dist/security/policy-engine.js.map +1 -0
  128. package/dist/security/policy-types.d.ts +79 -0
  129. package/dist/security/policy-types.js +7 -0
  130. package/dist/security/policy-types.js.map +1 -0
  131. package/dist/security/prompt-intake.d.ts +13 -0
  132. package/dist/security/prompt-intake.js +33 -0
  133. package/dist/security/prompt-intake.js.map +1 -0
  134. package/dist/security/redaction.d.ts +3 -0
  135. package/dist/security/redaction.js +64 -0
  136. package/dist/security/redaction.js.map +1 -0
  137. package/dist/security/sink-encoding.d.ts +6 -0
  138. package/dist/security/sink-encoding.js +40 -0
  139. package/dist/security/sink-encoding.js.map +1 -0
  140. package/dist/sprint-commands.js +33 -22
  141. package/dist/sprint-commands.js.map +1 -1
  142. package/dist/structured-output-validation.d.ts +9 -0
  143. package/dist/structured-output-validation.js +20 -0
  144. package/dist/structured-output-validation.js.map +1 -0
  145. package/dist/transcription-failures.d.ts +2 -0
  146. package/dist/transcription-failures.js +4 -0
  147. package/dist/transcription-failures.js.map +1 -0
  148. package/dist/transcription-media-preflight.d.ts +9 -0
  149. package/dist/transcription-media-preflight.js +147 -0
  150. package/dist/transcription-media-preflight.js.map +1 -0
  151. package/dist/transcription-request.d.ts +13 -0
  152. package/dist/transcription-request.js +150 -0
  153. package/dist/transcription-request.js.map +1 -0
  154. package/dist/transcription-source-policy.d.ts +4 -0
  155. package/dist/transcription-source-policy.js +43 -0
  156. package/dist/transcription-source-policy.js.map +1 -0
  157. package/dist/transcription-types.d.ts +161 -0
  158. package/dist/transcription-types.js +2 -0
  159. package/dist/transcription-types.js.map +1 -0
  160. package/dist/types/runtime.d.ts +147 -0
  161. package/dist/types.d.ts +3 -1
  162. package/dist/types.js +1 -0
  163. package/dist/types.js.map +1 -1
  164. package/dist/web-api-read-routes.js +2 -0
  165. package/dist/web-api-read-routes.js.map +1 -1
  166. package/dist/web-console/assets/index-BJuVTqfQ.js +11 -0
  167. package/dist/web-console/index.html +1 -1
  168. package/dist/workflow-evidence-service.js +16 -0
  169. package/dist/workflow-evidence-service.js.map +1 -1
  170. package/dist/workflow-phase-planner.js +5 -3
  171. package/dist/workflow-phase-planner.js.map +1 -1
  172. package/dist/workflow-phases.js +5 -0
  173. package/dist/workflow-phases.js.map +1 -1
  174. package/dist/workflow-run-commands.js +89 -10
  175. package/dist/workflow-run-commands.js.map +1 -1
  176. package/dist/workflow-services.d.ts +1 -0
  177. package/dist/workflow-services.js +8 -1
  178. package/dist/workflow-services.js.map +1 -1
  179. package/docs/audio-video-transcription-skill.md +102 -70
  180. package/docs/autonomous-workflow.md +3 -3
  181. package/docs/context-vault.md +34 -11
  182. package/docs/diagrams/deterministic-pipeline/README.md +35 -1
  183. package/docs/evidence-compaction.md +25 -0
  184. package/docs/rule-loading-strategy.md +37 -0
  185. package/docs/runtime-adapters.md +7 -0
  186. package/docs/runtime-capacity.md +57 -0
  187. package/docs/security-saas-orchestrator.md +368 -0
  188. package/docs/sonar-quality-gates.md +1 -1
  189. package/package.json +1 -1
  190. package/rules/development/semantic-code.md +28 -0
  191. package/dist/web-console/assets/index-Bis4CecA.js +0 -11
@@ -0,0 +1,117 @@
1
+ export const LOCAL_RUNTIME_CAPACITY_SCOPE = {
2
+ platformId: "local",
3
+ tenantId: "local",
4
+ workspaceId: "local-workspace",
5
+ };
6
+ export const DEFAULT_RUNTIME_CAPACITY_UNIT = {
7
+ concurrencyUnits: 1,
8
+ };
9
+ export const DEFAULT_RUNTIME_QUOTA_POLICY = {
10
+ maxActive: 3,
11
+ maxQueued: 25,
12
+ maxActivePerProvider: 2,
13
+ maxActivePerRuntime: 3,
14
+ limitAction: "queue",
15
+ queueTtlMs: 30_000,
16
+ };
17
+ const WORKLOAD_CLASSES = [
18
+ "interactive",
19
+ "workflow-phase",
20
+ "runtime-native-spawn",
21
+ "provider-backed-phase",
22
+ "background-maintenance",
23
+ "evidence-processing",
24
+ ];
25
+ export function normalizeRuntimeScheduleRequest(request, mode, defaultScope = LOCAL_RUNTIME_CAPACITY_SCOPE) {
26
+ if (!request.scope && mode === "saas") {
27
+ return {
28
+ valid: false,
29
+ scope: defaultScope,
30
+ reasonCode: "rejected_missing_scope",
31
+ userSafeReason: "tenant and workspace scope are required",
32
+ };
33
+ }
34
+ const scope = request.scope ?? defaultScope;
35
+ if (!scope.platformId ||
36
+ !scope.tenantId ||
37
+ !scope.workspaceId ||
38
+ !WORKLOAD_CLASSES.includes(request.workloadClass) ||
39
+ !Number.isFinite(request.capacity.concurrencyUnits) ||
40
+ request.capacity.concurrencyUnits <= 0) {
41
+ return {
42
+ valid: false,
43
+ scope,
44
+ reasonCode: "rejected_invalid_request",
45
+ userSafeReason: "runtime capacity request is invalid",
46
+ };
47
+ }
48
+ return { valid: true, scope };
49
+ }
50
+ export function evaluateRuntimeCapacityLimits({ request, scope, counters, platformPolicy, tenantPolicy, workspacePolicy, }) {
51
+ const requestUnits = request.capacity.concurrencyUnits;
52
+ const checks = [
53
+ activeLimitCheck(sumActiveUnits(counters.active), requestUnits, platformPolicy.maxActive, "rejected_platform_limit", "platform runtime capacity is exhausted"),
54
+ activeLimitCheck(sumActiveUnits(counters.active.filter((item) => sameTenant(item, scope))), requestUnits, tenantPolicy.maxActive, "rejected_tenant_limit", "tenant runtime capacity is exhausted"),
55
+ activeLimitCheck(sumActiveUnits(counters.active.filter((item) => sameWorkspace(item, scope))), requestUnits, workspacePolicy.maxActive, "rejected_workspace_limit", "workspace runtime capacity is exhausted"),
56
+ providerLimitCheck(request, counters.active, tenantPolicy),
57
+ runtimeLimitCheck(request, counters.active, tenantPolicy),
58
+ ];
59
+ return checks.find((check) => !check.allowed) ?? { allowed: true };
60
+ }
61
+ export function canQueueRuntimeCapacity({ request, scope, counters, platformPolicy, tenantPolicy, workspacePolicy, }) {
62
+ const requestUnits = request.capacity.concurrencyUnits;
63
+ const checks = [
64
+ queuedLimitCheck(sumActiveUnits(counters.queued), requestUnits, platformPolicy.maxQueued, "rejected_queue_full", "platform runtime queue is full"),
65
+ queuedLimitCheck(sumActiveUnits(counters.queued.filter((item) => sameTenant(item, scope))), requestUnits, tenantPolicy.maxQueued, "rejected_tenant_limit", "tenant runtime queue is full"),
66
+ queuedLimitCheck(sumActiveUnits(counters.queued.filter((item) => sameWorkspace(item, scope))), requestUnits, workspacePolicy.maxQueued, "rejected_workspace_limit", "workspace runtime queue is full"),
67
+ ];
68
+ return checks.find((check) => !check.allowed) ?? { allowed: true };
69
+ }
70
+ export function queueReasonForLimit(reasonCode) {
71
+ if (reasonCode === "rejected_platform_limit")
72
+ return "queued_platform_limit";
73
+ if (reasonCode === "rejected_tenant_limit")
74
+ return "queued_tenant_limit";
75
+ if (reasonCode === "rejected_workspace_limit")
76
+ return "queued_workspace_limit";
77
+ if (reasonCode === "rejected_provider_limit")
78
+ return "queued_provider_limit";
79
+ if (reasonCode === "rejected_runtime_limit")
80
+ return "queued_runtime_limit";
81
+ return "queued_no_eligible_worker";
82
+ }
83
+ function activeLimitCheck(activeUnits, requestUnits, maxActive, reasonCode, userSafeReason) {
84
+ if (activeUnits + requestUnits <= maxActive)
85
+ return { allowed: true };
86
+ return { allowed: false, reasonCode, userSafeReason };
87
+ }
88
+ function queuedLimitCheck(queuedUnits, requestUnits, maxQueued, reasonCode, userSafeReason) {
89
+ if (queuedUnits + requestUnits <= maxQueued)
90
+ return { allowed: true };
91
+ return { allowed: false, reasonCode, userSafeReason };
92
+ }
93
+ function providerLimitCheck(request, active, policy) {
94
+ if (!request.provider || policy.maxActivePerProvider === undefined) {
95
+ return { allowed: true };
96
+ }
97
+ const activeUnits = sumActiveUnits(active.filter((item) => item.provider === request.provider));
98
+ return activeLimitCheck(activeUnits, request.capacity.concurrencyUnits, policy.maxActivePerProvider, "rejected_provider_limit", "provider runtime capacity is exhausted");
99
+ }
100
+ function runtimeLimitCheck(request, active, policy) {
101
+ if (!request.runtime || policy.maxActivePerRuntime === undefined) {
102
+ return { allowed: true };
103
+ }
104
+ const activeUnits = sumActiveUnits(active.filter((item) => item.runtime === request.runtime));
105
+ return activeLimitCheck(activeUnits, request.capacity.concurrencyUnits, policy.maxActivePerRuntime, "rejected_runtime_limit", "runtime capacity is exhausted");
106
+ }
107
+ function sameTenant(request, scope) {
108
+ return request.scope?.tenantId === scope.tenantId;
109
+ }
110
+ function sameWorkspace(request, scope) {
111
+ return (request.scope?.tenantId === scope.tenantId &&
112
+ request.scope.workspaceId === scope.workspaceId);
113
+ }
114
+ function sumActiveUnits(requests) {
115
+ return requests.reduce((total, request) => total + request.capacity.concurrencyUnits, 0);
116
+ }
117
+ //# sourceMappingURL=runtime-capacity-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-capacity-policy.js","sourceRoot":"","sources":["../src/runtime-capacity-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { RuntimeCapacitySchedulerEvent, RuntimeCapacityScope, RuntimeLease, RuntimeQuotaPolicy, RuntimeScheduleDecision, RuntimeScheduleReasonCode, RuntimeScheduleRequest } from "./types.js";
2
+ export interface RuntimeCapacityQueuedRequest {
3
+ queueId: string;
4
+ request: RuntimeScheduleRequest;
5
+ enqueuedAt: number;
6
+ }
7
+ export declare function normalizeCapacityRequest({ request, defaultScope, tenantPolicy, }: {
8
+ request: RuntimeScheduleRequest;
9
+ defaultScope: RuntimeCapacityScope;
10
+ tenantPolicy: RuntimeQuotaPolicy;
11
+ }): RuntimeScheduleRequest;
12
+ export declare function sortQueuedRuntimeRequests(queue: RuntimeCapacityQueuedRequest[]): void;
13
+ export declare function optionalExpiresAt(request: RuntimeScheduleRequest): {
14
+ expiresAt: string;
15
+ } | Record<string, never>;
16
+ export declare function reasonForCode(reasonCode: RuntimeScheduleReasonCode): string;
17
+ export declare function createRuntimeScheduleDecision({ decisionId, status, request, reasonCode, userSafeReason, workerId, lease, queue, }: {
18
+ decisionId: string;
19
+ status: RuntimeScheduleDecision["status"];
20
+ request: RuntimeScheduleRequest;
21
+ reasonCode: RuntimeScheduleReasonCode;
22
+ userSafeReason: string;
23
+ workerId?: string;
24
+ lease?: RuntimeLease;
25
+ queue?: RuntimeScheduleDecision["queue"];
26
+ }): {
27
+ decision: RuntimeScheduleDecision;
28
+ event: RuntimeCapacitySchedulerEvent;
29
+ };
30
+ export declare function createRuntimeReleaseEvent({ decisionId, lease, leaseDurationMs, }: {
31
+ decisionId: string;
32
+ lease: RuntimeLease;
33
+ leaseDurationMs: number;
34
+ }): RuntimeCapacitySchedulerEvent;
35
+ export declare function createRuntimePromotedEvent({ decisionId, request, workerId, queueLatencyMs, }: {
36
+ decisionId: string;
37
+ request: RuntimeScheduleRequest;
38
+ workerId: string;
39
+ queueLatencyMs: number;
40
+ }): RuntimeCapacitySchedulerEvent;
@@ -0,0 +1,111 @@
1
+ import { DEFAULT_RUNTIME_CAPACITY_UNIT } from "./runtime-capacity-policy.js";
2
+ export function normalizeCapacityRequest({ request, defaultScope, tenantPolicy, }) {
3
+ return {
4
+ ...request,
5
+ scope: request.scope ?? defaultScope,
6
+ capacity: request.capacity ?? DEFAULT_RUNTIME_CAPACITY_UNIT,
7
+ queuePolicy: request.queuePolicy ?? {
8
+ priority: "normal",
9
+ limitAction: "queue",
10
+ ...(tenantPolicy.queueTtlMs
11
+ ? { maxQueueMs: tenantPolicy.queueTtlMs }
12
+ : {}),
13
+ },
14
+ };
15
+ }
16
+ export function sortQueuedRuntimeRequests(queue) {
17
+ queue.sort((left, right) => priorityWeight(right.request.queuePolicy?.priority) -
18
+ priorityWeight(left.request.queuePolicy?.priority) ||
19
+ left.request.scope.tenantId.localeCompare(right.request.scope.tenantId) ||
20
+ left.request.scope.workspaceId.localeCompare(right.request.scope.workspaceId) ||
21
+ left.enqueuedAt - right.enqueuedAt ||
22
+ left.queueId.localeCompare(right.queueId));
23
+ }
24
+ export function optionalExpiresAt(request) {
25
+ const ttl = request.queuePolicy?.maxQueueMs;
26
+ return ttl ? { expiresAt: new Date(Date.now() + ttl).toISOString() } : {};
27
+ }
28
+ export function reasonForCode(reasonCode) {
29
+ const reasons = {
30
+ admitted: "runtime capacity lease admitted",
31
+ queued_platform_limit: "queued until platform runtime capacity is available",
32
+ queued_tenant_limit: "queued until tenant runtime capacity is available",
33
+ queued_workspace_limit: "queued until workspace runtime capacity is available",
34
+ queued_provider_limit: "queued until provider runtime capacity is available",
35
+ queued_runtime_limit: "queued until runtime capacity is available",
36
+ queued_no_eligible_worker: "queued until an eligible runtime worker is available",
37
+ rejected_invalid_request: "runtime capacity request is invalid",
38
+ rejected_missing_scope: "tenant and workspace scope are required",
39
+ rejected_platform_limit: "platform runtime capacity is exhausted",
40
+ rejected_tenant_limit: "tenant runtime capacity is exhausted",
41
+ rejected_workspace_limit: "workspace runtime capacity is exhausted",
42
+ rejected_provider_limit: "provider runtime capacity is exhausted",
43
+ rejected_runtime_limit: "runtime capacity is exhausted",
44
+ rejected_queue_full: "runtime queue is full",
45
+ deferred_no_eligible_worker: "no eligible runtime worker is available",
46
+ };
47
+ return reasons[reasonCode];
48
+ }
49
+ export function createRuntimeScheduleDecision({ decisionId, status, request, reasonCode, userSafeReason, workerId, lease, queue, }) {
50
+ const decision = {
51
+ decisionId,
52
+ status,
53
+ scope: request.scope,
54
+ workloadClass: request.workloadClass,
55
+ reasonCode,
56
+ userSafeReason,
57
+ ...(workerId ? { workerId } : {}),
58
+ ...(lease ? { lease } : {}),
59
+ ...(queue ? { queue } : {}),
60
+ };
61
+ return {
62
+ decision,
63
+ event: {
64
+ decisionId,
65
+ type: status,
66
+ scope: request.scope,
67
+ workloadClass: request.workloadClass,
68
+ reasonCode,
69
+ timestamp: new Date().toISOString(),
70
+ ...(request.provider ? { provider: request.provider } : {}),
71
+ ...(request.runtime ? { runtime: request.runtime } : {}),
72
+ ...(workerId ? { workerId } : {}),
73
+ },
74
+ };
75
+ }
76
+ export function createRuntimeReleaseEvent({ decisionId, lease, leaseDurationMs, }) {
77
+ return {
78
+ decisionId,
79
+ type: "released",
80
+ scope: lease.scope,
81
+ workloadClass: lease.workloadClass,
82
+ workerId: lease.workerId,
83
+ reasonCode: "released",
84
+ leaseDurationMs,
85
+ timestamp: new Date().toISOString(),
86
+ ...(lease.provider ? { provider: lease.provider } : {}),
87
+ ...(lease.runtime ? { runtime: lease.runtime } : {}),
88
+ };
89
+ }
90
+ export function createRuntimePromotedEvent({ decisionId, request, workerId, queueLatencyMs, }) {
91
+ return {
92
+ decisionId,
93
+ type: "promoted",
94
+ scope: request.scope,
95
+ workloadClass: request.workloadClass,
96
+ workerId,
97
+ reasonCode: "admitted",
98
+ queueLatencyMs,
99
+ timestamp: new Date().toISOString(),
100
+ ...(request.provider ? { provider: request.provider } : {}),
101
+ ...(request.runtime ? { runtime: request.runtime } : {}),
102
+ };
103
+ }
104
+ function priorityWeight(priority = "normal") {
105
+ if (priority === "high")
106
+ return 3;
107
+ if (priority === "normal")
108
+ return 2;
109
+ return 1;
110
+ }
111
+ //# sourceMappingURL=runtime-capacity-scheduler-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-capacity-scheduler-helpers.js","sourceRoot":"","sources":["../src/runtime-capacity-scheduler-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type RuntimeCapacityQueuedRequest } from "./runtime-capacity-scheduler-helpers.js";
2
+ import type { RuntimeCapacityCounters } from "./runtime-capacity-policy.js";
3
+ import type { RuntimeWorkerRegistry } from "./runtime-worker-registry.js";
4
+ import type { RuntimeCapacitySchedulerEvent, RuntimeCapacityScope, RuntimeLease, RuntimeScheduleDecision, RuntimeScheduleReasonCode, RuntimeScheduleRequest } from "./types.js";
5
+ export type RuntimeLeaseRecord = {
6
+ request: RuntimeScheduleRequest;
7
+ lease: RuntimeLease;
8
+ startedAt: number;
9
+ };
10
+ export declare class RuntimeCapacitySchedulerState {
11
+ private readonly queue;
12
+ private readonly leases;
13
+ private readonly events;
14
+ private rejected;
15
+ private nextDecision;
16
+ private nextQueue;
17
+ private nextLease;
18
+ activeRecords(): RuntimeLeaseRecord[];
19
+ queuedRequests(): RuntimeCapacityQueuedRequest[];
20
+ rejectedCount(): number;
21
+ counters(): RuntimeCapacityCounters;
22
+ drainEvents(): RuntimeCapacitySchedulerEvent[];
23
+ releaseLease(leaseId: string, registry: RuntimeWorkerRegistry): RuntimeLeaseRecord | undefined;
24
+ admit(request: RuntimeScheduleRequest, workerId: string, registry: RuntimeWorkerRegistry): RuntimeScheduleDecision;
25
+ queueRequest(request: RuntimeScheduleRequest, reasonCode: RuntimeScheduleReasonCode): RuntimeScheduleDecision;
26
+ reject(request: RuntimeScheduleRequest, scope: RuntimeCapacityScope, reasonCode: RuntimeScheduleReasonCode, userSafeReason: string): RuntimeScheduleDecision;
27
+ decision({ status, request, reasonCode, userSafeReason, workerId, lease, queue, }: {
28
+ status: RuntimeScheduleDecision["status"];
29
+ request: RuntimeScheduleRequest;
30
+ reasonCode: RuntimeScheduleReasonCode;
31
+ userSafeReason: string;
32
+ workerId?: string;
33
+ lease?: RuntimeLease;
34
+ queue?: RuntimeScheduleDecision["queue"];
35
+ }): RuntimeScheduleDecision;
36
+ sortQueue(): void;
37
+ removeQueuedAt(index: number): void;
38
+ recordPromoted({ decision, queued, workerId, }: {
39
+ decision: RuntimeScheduleDecision;
40
+ queued: RuntimeCapacityQueuedRequest;
41
+ workerId: string;
42
+ }): void;
43
+ private nextDecisionId;
44
+ }
@@ -0,0 +1,128 @@
1
+ import { createRuntimePromotedEvent, createRuntimeReleaseEvent, createRuntimeScheduleDecision, optionalExpiresAt, reasonForCode, sortQueuedRuntimeRequests, } from "./runtime-capacity-scheduler-helpers.js";
2
+ export class RuntimeCapacitySchedulerState {
3
+ queue = [];
4
+ leases = new Map();
5
+ events = [];
6
+ rejected = 0;
7
+ nextDecision = 0;
8
+ nextQueue = 0;
9
+ nextLease = 0;
10
+ activeRecords() {
11
+ return [...this.leases.values()];
12
+ }
13
+ queuedRequests() {
14
+ return this.queue;
15
+ }
16
+ rejectedCount() {
17
+ return this.rejected;
18
+ }
19
+ counters() {
20
+ return {
21
+ active: this.activeRecords().map((record) => record.request),
22
+ queued: this.queue.map((item) => item.request),
23
+ };
24
+ }
25
+ drainEvents() {
26
+ return this.events.splice(0);
27
+ }
28
+ releaseLease(leaseId, registry) {
29
+ const record = this.leases.get(leaseId);
30
+ if (!record)
31
+ return undefined;
32
+ this.leases.delete(leaseId);
33
+ registry.releaseWorkerCapacity(record.lease.workerId, record.lease.capacity);
34
+ this.events.push(createRuntimeReleaseEvent({
35
+ decisionId: this.nextDecisionId(),
36
+ lease: record.lease,
37
+ leaseDurationMs: Date.now() - record.startedAt,
38
+ }));
39
+ return record;
40
+ }
41
+ admit(request, workerId, registry) {
42
+ const lease = {
43
+ leaseId: `lease-${this.nextLease++}`,
44
+ workerId,
45
+ scope: request.scope,
46
+ workloadClass: request.workloadClass,
47
+ capacity: request.capacity,
48
+ expiresAt: new Date(Date.now() + (request.leaseTtlMs ?? 30_000)).toISOString(),
49
+ ...(request.provider ? { provider: request.provider } : {}),
50
+ ...(request.runtime ? { runtime: request.runtime } : {}),
51
+ };
52
+ registry.reserveWorkerCapacity(workerId, request.capacity);
53
+ this.leases.set(lease.leaseId, {
54
+ request,
55
+ lease,
56
+ startedAt: Date.now(),
57
+ });
58
+ return this.decision({
59
+ status: "admitted",
60
+ request,
61
+ reasonCode: "admitted",
62
+ userSafeReason: "runtime capacity lease admitted",
63
+ workerId,
64
+ lease,
65
+ });
66
+ }
67
+ queueRequest(request, reasonCode) {
68
+ const queueId = `queue-${this.nextQueue++}`;
69
+ this.queue.push({ queueId, request, enqueuedAt: Date.now() });
70
+ this.sortQueue();
71
+ const position = this.queue.findIndex((item) => item.queueId === queueId);
72
+ return this.decision({
73
+ status: "queued",
74
+ request,
75
+ reasonCode,
76
+ userSafeReason: reasonForCode(reasonCode),
77
+ queue: {
78
+ queueId,
79
+ position: position + 1,
80
+ reasonCode,
81
+ retryAfterMs: 1_000,
82
+ ...optionalExpiresAt(request),
83
+ },
84
+ });
85
+ }
86
+ reject(request, scope, reasonCode, userSafeReason) {
87
+ this.rejected += 1;
88
+ return this.decision({
89
+ status: "rejected",
90
+ request: { ...request, scope },
91
+ reasonCode,
92
+ userSafeReason,
93
+ });
94
+ }
95
+ decision({ status, request, reasonCode, userSafeReason, workerId, lease, queue, }) {
96
+ const decisionId = this.nextDecisionId();
97
+ const { decision, event } = createRuntimeScheduleDecision({
98
+ decisionId,
99
+ status,
100
+ request,
101
+ reasonCode,
102
+ userSafeReason,
103
+ ...(workerId ? { workerId } : {}),
104
+ ...(lease ? { lease } : {}),
105
+ ...(queue ? { queue } : {}),
106
+ });
107
+ this.events.push(event);
108
+ return decision;
109
+ }
110
+ sortQueue() {
111
+ sortQueuedRuntimeRequests(this.queue);
112
+ }
113
+ removeQueuedAt(index) {
114
+ this.queue.splice(index, 1);
115
+ }
116
+ recordPromoted({ decision, queued, workerId, }) {
117
+ this.events.push(createRuntimePromotedEvent({
118
+ decisionId: decision.decisionId,
119
+ request: queued.request,
120
+ workerId,
121
+ queueLatencyMs: Date.now() - queued.enqueuedAt,
122
+ }));
123
+ }
124
+ nextDecisionId() {
125
+ return `decision-${this.nextDecision++}`;
126
+ }
127
+ }
128
+ //# sourceMappingURL=runtime-capacity-scheduler-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-capacity-scheduler-state.js","sourceRoot":"","sources":["../src/runtime-capacity-scheduler-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type RuntimeCapacityMode } from "./runtime-capacity-policy.js";
2
+ import { type RuntimeWorkerRegistry } from "./runtime-worker-registry.js";
3
+ import type { RuntimeCapacitySchedulerEvent, RuntimeCapacityScope, RuntimeCapacitySnapshot, RuntimeQuotaPolicy, RuntimeScheduleDecision, RuntimeScheduleRequest } from "./types.js";
4
+ export interface RuntimeCapacitySchedulerOptions {
5
+ mode?: RuntimeCapacityMode;
6
+ defaultScope?: RuntimeCapacityScope;
7
+ platformPolicy?: RuntimeQuotaPolicy;
8
+ tenantPolicy?: RuntimeQuotaPolicy;
9
+ workspacePolicy?: RuntimeQuotaPolicy;
10
+ registry?: RuntimeWorkerRegistry;
11
+ }
12
+ export declare class RuntimeCapacityScheduler {
13
+ private readonly mode;
14
+ private readonly defaultScope;
15
+ private readonly platformPolicy;
16
+ private readonly tenantPolicy;
17
+ private readonly workspacePolicy;
18
+ private readonly registry;
19
+ private readonly state;
20
+ constructor(options?: RuntimeCapacitySchedulerOptions);
21
+ schedule(request: RuntimeScheduleRequest): RuntimeScheduleDecision;
22
+ release(leaseId: string): RuntimeScheduleDecision[];
23
+ drainQueued(): RuntimeScheduleDecision[];
24
+ snapshot(scope?: RuntimeCapacityScope): RuntimeCapacitySnapshot;
25
+ drainEvents(): RuntimeCapacitySchedulerEvent[];
26
+ private normalizeRequest;
27
+ private queueOrRejectLimit;
28
+ private queueOrDefer;
29
+ private shouldQueue;
30
+ private scheduleQueued;
31
+ private queueDepthByWorker;
32
+ private effectiveTenantPolicy;
33
+ private effectiveWorkspacePolicy;
34
+ }