@nestos/kanban 0.0.0-stage → 0.5.2

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 (124) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +165 -2
  3. package/dist/activity-BbC4sgKL.d.cts +258 -0
  4. package/dist/activity-Czlan5xW.d.ts +258 -0
  5. package/dist/activity-module-DaO1Rry0.d.cts +22 -0
  6. package/dist/activity-module-T22wliZu.d.ts +22 -0
  7. package/dist/activity-ports-Dqxa86zT.d.cts +12 -0
  8. package/dist/activity-ports-cxfrelaL.d.ts +12 -0
  9. package/dist/activity.cjs +16 -0
  10. package/dist/activity.cjs.map +1 -0
  11. package/dist/activity.d.cts +12 -0
  12. package/dist/activity.d.ts +12 -0
  13. package/dist/activity.js +16 -0
  14. package/dist/activity.js.map +1 -0
  15. package/dist/chunk-3JYLJPE5.js +95 -0
  16. package/dist/chunk-3JYLJPE5.js.map +1 -0
  17. package/dist/chunk-3LEIHB7Y.js +221 -0
  18. package/dist/chunk-3LEIHB7Y.js.map +1 -0
  19. package/dist/chunk-4XF6LQSU.cjs +9 -0
  20. package/dist/chunk-4XF6LQSU.cjs.map +1 -0
  21. package/dist/chunk-5Q7WB63A.cjs +282 -0
  22. package/dist/chunk-5Q7WB63A.cjs.map +1 -0
  23. package/dist/chunk-7KDOTBRX.cjs +58 -0
  24. package/dist/chunk-7KDOTBRX.cjs.map +1 -0
  25. package/dist/chunk-AHHEGTUA.js +148 -0
  26. package/dist/chunk-AHHEGTUA.js.map +1 -0
  27. package/dist/chunk-AOHQCX7K.cjs +95 -0
  28. package/dist/chunk-AOHQCX7K.cjs.map +1 -0
  29. package/dist/chunk-DINLR6E6.cjs +443 -0
  30. package/dist/chunk-DINLR6E6.cjs.map +1 -0
  31. package/dist/chunk-EYTVC2H5.cjs +1612 -0
  32. package/dist/chunk-EYTVC2H5.cjs.map +1 -0
  33. package/dist/chunk-FEE2YBZ7.js +1972 -0
  34. package/dist/chunk-FEE2YBZ7.js.map +1 -0
  35. package/dist/chunk-FNO5K3A7.js +282 -0
  36. package/dist/chunk-FNO5K3A7.js.map +1 -0
  37. package/dist/chunk-IHHDXZPZ.js +382 -0
  38. package/dist/chunk-IHHDXZPZ.js.map +1 -0
  39. package/dist/chunk-J3EAIVA3.js +280 -0
  40. package/dist/chunk-J3EAIVA3.js.map +1 -0
  41. package/dist/chunk-KH3WF3K4.js +443 -0
  42. package/dist/chunk-KH3WF3K4.js.map +1 -0
  43. package/dist/chunk-M35X5PHO.js +196 -0
  44. package/dist/chunk-M35X5PHO.js.map +1 -0
  45. package/dist/chunk-QRGZD2JU.cjs +1972 -0
  46. package/dist/chunk-QRGZD2JU.cjs.map +1 -0
  47. package/dist/chunk-RBOER6EW.cjs +221 -0
  48. package/dist/chunk-RBOER6EW.cjs.map +1 -0
  49. package/dist/chunk-RQP77ZTY.js +9 -0
  50. package/dist/chunk-RQP77ZTY.js.map +1 -0
  51. package/dist/chunk-RSH6QSEC.cjs +196 -0
  52. package/dist/chunk-RSH6QSEC.cjs.map +1 -0
  53. package/dist/chunk-VMRDXOLX.cjs +148 -0
  54. package/dist/chunk-VMRDXOLX.cjs.map +1 -0
  55. package/dist/chunk-X4UHZX6F.js +58 -0
  56. package/dist/chunk-X4UHZX6F.js.map +1 -0
  57. package/dist/chunk-XBSGUVCY.cjs +382 -0
  58. package/dist/chunk-XBSGUVCY.cjs.map +1 -0
  59. package/dist/chunk-XKDZHAUE.js +1612 -0
  60. package/dist/chunk-XKDZHAUE.js.map +1 -0
  61. package/dist/chunk-ZUZGAO6G.cjs +280 -0
  62. package/dist/chunk-ZUZGAO6G.cjs.map +1 -0
  63. package/dist/content-C5aJZFlw.d.cts +35 -0
  64. package/dist/content-hLH5BNud.d.ts +35 -0
  65. package/dist/contracts/index.cjs +31 -0
  66. package/dist/contracts/index.cjs.map +1 -0
  67. package/dist/contracts/index.d.cts +5 -0
  68. package/dist/contracts/index.d.ts +5 -0
  69. package/dist/contracts/index.js +31 -0
  70. package/dist/contracts/index.js.map +1 -0
  71. package/dist/discovery-9E-LfwIw.d.cts +61 -0
  72. package/dist/discovery-D60yrjej.d.ts +61 -0
  73. package/dist/discovery.cjs +377 -0
  74. package/dist/discovery.cjs.map +1 -0
  75. package/dist/discovery.d.cts +22 -0
  76. package/dist/discovery.d.ts +22 -0
  77. package/dist/discovery.js +377 -0
  78. package/dist/discovery.js.map +1 -0
  79. package/dist/execution-bridge-fpCnH6z5.d.cts +52 -0
  80. package/dist/execution-bridge-rk0uVy_n.d.ts +52 -0
  81. package/dist/execution.cjs +18 -0
  82. package/dist/execution.cjs.map +1 -0
  83. package/dist/execution.d.cts +42 -0
  84. package/dist/execution.d.ts +42 -0
  85. package/dist/execution.js +18 -0
  86. package/dist/execution.js.map +1 -0
  87. package/dist/index.cjs +74 -0
  88. package/dist/index.cjs.map +1 -0
  89. package/dist/index.d.cts +54 -0
  90. package/dist/index.d.ts +54 -0
  91. package/dist/index.js +74 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/module-CYfE7YhM.d.ts +11 -0
  94. package/dist/module-Ca9L3qCn.d.cts +11 -0
  95. package/dist/planning-CHrOqQ6b.d.cts +879 -0
  96. package/dist/planning-CHrOqQ6b.d.ts +879 -0
  97. package/dist/ports-B0McVg7B.d.ts +143 -0
  98. package/dist/ports-BeGO1VRI.d.cts +49 -0
  99. package/dist/ports-GQy0x-RI.d.cts +143 -0
  100. package/dist/ports-ykGiNUSx.d.ts +49 -0
  101. package/dist/runtime/index.cjs +205 -0
  102. package/dist/runtime/index.cjs.map +1 -0
  103. package/dist/runtime/index.d.cts +75 -0
  104. package/dist/runtime/index.d.ts +75 -0
  105. package/dist/runtime/index.js +205 -0
  106. package/dist/runtime/index.js.map +1 -0
  107. package/dist/runtime/integration.cjs +423 -0
  108. package/dist/runtime/integration.cjs.map +1 -0
  109. package/dist/runtime/integration.d.cts +658 -0
  110. package/dist/runtime/integration.d.ts +658 -0
  111. package/dist/runtime/integration.js +423 -0
  112. package/dist/runtime/integration.js.map +1 -0
  113. package/dist/storage.cjs +21 -0
  114. package/dist/storage.cjs.map +1 -0
  115. package/dist/storage.d.cts +71 -0
  116. package/dist/storage.d.ts +71 -0
  117. package/dist/storage.js +21 -0
  118. package/dist/storage.js.map +1 -0
  119. package/dist/store-DPwHzGiz.d.cts +28 -0
  120. package/dist/store-DgdrPCV9.d.ts +28 -0
  121. package/dist/task-projection-CSorlMws.d.ts +11 -0
  122. package/dist/task-projection-DKKB_ueb.d.cts +11 -0
  123. package/examples/standalone.ts +22 -0
  124. package/package.json +143 -4
@@ -0,0 +1,143 @@
1
+ import { q as KanbanDiscoveryChange, N as KanbanRecordInput, S as KanbanRequest, T as KanbanService, j as KanbanBoard, W as KanbanSuggestionKind, V as KanbanSuggestion, d as KanbanArtifactRef, a7 as KanbanWorkflowState, J as KanbanProjectRecord, z as KanbanItemSummary, c as KanbanArchivedItem, t as KanbanEvent, Q as KanbanRecordSummary, K as KanbanActor, o as KanbanCommand, w as KanbanItem } from './planning-CHrOqQ6b.js';
2
+ import { b as KanbanScanInput, d as KanbanScanSession, e as KanbanScanText, K as KanbanDiscoveryResult, c as KanbanScanPolicy } from './discovery-D60yrjej.js';
3
+
4
+ interface KanbanDiscoveryState {
5
+ checkpoints: Record<string, string>;
6
+ observations?: Record<string, {
7
+ revision: string;
8
+ idleSince: number;
9
+ }>;
10
+ lastRun?: {
11
+ runId: string;
12
+ outcome: 'committed' | 'invalidated';
13
+ at: number;
14
+ code?: string;
15
+ };
16
+ pending?: {
17
+ runId: string;
18
+ autoCreate: boolean;
19
+ token: string;
20
+ leaseUntil: number;
21
+ input: KanbanScanInput;
22
+ executionStarted?: boolean;
23
+ executionSettled?: boolean;
24
+ changes?: KanbanDiscoveryChange[];
25
+ records?: KanbanRecordInput[];
26
+ request?: KanbanRequest;
27
+ };
28
+ }
29
+ interface KanbanScanSource {
30
+ scope?: KanbanBoard['scope'];
31
+ projectId?: string;
32
+ kind: 'local' | 'remote';
33
+ /** Must enumerate board-scoped sources, including archived sessions when requested. */
34
+ list(includeArchived: boolean): Promise<KanbanScanSession[]>;
35
+ inspect(sessionId: string): Promise<KanbanScanSession>;
36
+ read(session: KanbanScanSession, maxBytes: number): Promise<KanbanScanText>;
37
+ }
38
+ interface KanbanScanExecutor {
39
+ readonly identity: string;
40
+ /** Stable runId must reconnect to the existing analysis operation after response loss. */
41
+ run(input: KanbanScanInput): Promise<KanbanDiscoveryChange[] | KanbanDiscoveryResult>;
42
+ settled?(input: KanbanScanInput): Promise<boolean>;
43
+ }
44
+ interface KanbanDiscoveryOptions {
45
+ boardId: string;
46
+ store: KanbanStore;
47
+ service: KanbanService;
48
+ source: KanbanScanSource;
49
+ executor: KanbanScanExecutor;
50
+ policy: KanbanScanPolicy;
51
+ /** Revalidate project scope, source access, and chosen connection before reading/executing/committing. */
52
+ authorize(stage: 'read' | 'execute' | 'commit', input?: KanbanScanInput): Promise<void>;
53
+ now?: () => number;
54
+ id?: () => string;
55
+ log: KanbanModuleOptions['log'];
56
+ }
57
+
58
+ interface KanbanState {
59
+ workflow?: KanbanWorkflowState;
60
+ numbering?: {
61
+ item: number;
62
+ log: number;
63
+ decision: number;
64
+ };
65
+ presetVersions?: Record<string, number>;
66
+ records?: KanbanProjectRecord[];
67
+ discovery?: KanbanDiscoveryState;
68
+ archiveIndex?: KanbanItemSummary[];
69
+ archiveWrites?: Array<{
70
+ id: string;
71
+ value: KanbanArchivedItem | null;
72
+ }>;
73
+ restore?: KanbanArchivedItem;
74
+ schema: 1;
75
+ board: KanbanBoard;
76
+ sequence: number;
77
+ events: KanbanEvent[];
78
+ escalations: string[];
79
+ }
80
+ interface KanbanReadView {
81
+ /** Board metadata and summary indexes; no item/record bodies. */
82
+ state: KanbanState;
83
+ items: KanbanItemSummary[];
84
+ records: KanbanRecordSummary[];
85
+ }
86
+ interface KanbanStore {
87
+ boardId?(number: number): Promise<string | null>;
88
+ view?(id: string): Promise<KanbanReadView | null>;
89
+ ids(): Promise<string[]>;
90
+ archived(boardId: string, itemId: string): Promise<KanbanArchivedItem | null>;
91
+ events(id: string, after: number, limit: number, through: number): Promise<KanbanEvent[]>;
92
+ read(id: string): Promise<KanbanState | null>;
93
+ update(id: string, operationId: string, fingerprint: string, change: (state: KanbanState | null) => KanbanState): Promise<KanbanState>;
94
+ }
95
+ interface KanbanModuleOptions {
96
+ /** Host supplies metadata within the authorized user's/project's session scope. */
97
+ suggestions?(board: KanbanBoard, kind: KanbanSuggestionKind, search: string, limit: number): Promise<KanbanSuggestion[] | undefined>;
98
+ verifyOutputs?(input: {
99
+ stage?: 'observe' | 'accept';
100
+ board: KanbanBoard;
101
+ itemId: string;
102
+ dispatchId?: string;
103
+ outputs: KanbanArtifactRef[];
104
+ }): Promise<boolean>;
105
+ onCommitted?(boardId: string, service: KanbanService, now: number): Promise<void>;
106
+ store: KanbanStore;
107
+ /** Trusted identity resolved by the host, never from command payloads. */
108
+ actor: KanbanActor;
109
+ /** Must validate project access, delegated authority and session registration. */
110
+ authorize(input: {
111
+ actor: KanbanActor;
112
+ board: KanbanBoard;
113
+ action: 'create' | 'read' | 'install-content' | KanbanCommand['type'];
114
+ command?: KanbanCommand;
115
+ }): Promise<void>;
116
+ /** Confirm an automated owner has settled before releasing responsibility. */
117
+ verifyDeletion?(board: KanbanBoard): Promise<void>;
118
+ verifyLifecycle?(board: KanbanBoard, command: KanbanCommand): Promise<void>;
119
+ verifyRelease?(input: {
120
+ actor: KanbanActor;
121
+ board: KanbanBoard;
122
+ item: KanbanItem;
123
+ }): Promise<boolean>;
124
+ now?: () => number;
125
+ id?: () => string;
126
+ log(event: {
127
+ operationId: string;
128
+ boardId?: string;
129
+ sessionId?: string;
130
+ stage: string;
131
+ result: 'success' | 'failure';
132
+ code?: string;
133
+ durationMs: number;
134
+ }): void;
135
+ }
136
+ declare class KanbanError extends Error {
137
+ readonly code: string;
138
+ constructor(code: string);
139
+ }
140
+ declare class KanbanScanNotStartedError extends KanbanError {
141
+ }
142
+
143
+ export { type KanbanModuleOptions as K, KanbanError as a, type KanbanReadView as b, KanbanScanNotStartedError as c, type KanbanState as d, type KanbanStore as e, type KanbanDiscoveryOptions as f, type KanbanDiscoveryState as g, type KanbanScanExecutor as h, type KanbanScanSource as i };
@@ -0,0 +1,49 @@
1
+ import { u as KanbanExternalReference, J as KanbanProjectRecord } from './planning-CHrOqQ6b.cjs';
2
+
3
+ interface KanbanRuntimeDiagnostic {
4
+ operationId: string;
5
+ stage: string;
6
+ result: 'started' | 'success' | 'failure';
7
+ durationMs: number;
8
+ code?: string;
9
+ operation?: string;
10
+ boardId?: string;
11
+ itemId?: string;
12
+ count?: number;
13
+ }
14
+ interface KanbanJournalOptions {
15
+ directory?: string;
16
+ artifactScheme?: string;
17
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
18
+ }
19
+ interface KanbanReferencePolicy {
20
+ resource: string;
21
+ decision: string;
22
+ execution: string;
23
+ nativeExecution?: string;
24
+ workspace?: string;
25
+ inherit?(references: readonly KanbanExternalReference[]): KanbanExternalReference[];
26
+ }
27
+ declare const defaultReferences: KanbanReferencePolicy;
28
+ interface KanbanResourceCatalog {
29
+ system: string;
30
+ decisionSystem?: string;
31
+ list(): Promise<Array<{
32
+ reference: KanbanExternalReference;
33
+ label: string;
34
+ }>>;
35
+ validate(references: readonly KanbanExternalReference[]): Promise<void>;
36
+ }
37
+ interface KanbanWorkLogOptions {
38
+ directory?: string;
39
+ references?: KanbanReferencePolicy;
40
+ label?(stage: string): string;
41
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
42
+ onRecord?(input: {
43
+ boardId: string;
44
+ itemId: string;
45
+ record: KanbanProjectRecord;
46
+ }): Promise<void>;
47
+ }
48
+
49
+ export { type KanbanResourceCatalog as K, type KanbanRuntimeDiagnostic as a, type KanbanJournalOptions as b, type KanbanWorkLogOptions as c, type KanbanReferencePolicy as d, defaultReferences as e };
@@ -0,0 +1,143 @@
1
+ import { q as KanbanDiscoveryChange, N as KanbanRecordInput, S as KanbanRequest, T as KanbanService, j as KanbanBoard, W as KanbanSuggestionKind, V as KanbanSuggestion, d as KanbanArtifactRef, a7 as KanbanWorkflowState, J as KanbanProjectRecord, z as KanbanItemSummary, c as KanbanArchivedItem, t as KanbanEvent, Q as KanbanRecordSummary, K as KanbanActor, o as KanbanCommand, w as KanbanItem } from './planning-CHrOqQ6b.cjs';
2
+ import { b as KanbanScanInput, d as KanbanScanSession, e as KanbanScanText, K as KanbanDiscoveryResult, c as KanbanScanPolicy } from './discovery-9E-LfwIw.cjs';
3
+
4
+ interface KanbanDiscoveryState {
5
+ checkpoints: Record<string, string>;
6
+ observations?: Record<string, {
7
+ revision: string;
8
+ idleSince: number;
9
+ }>;
10
+ lastRun?: {
11
+ runId: string;
12
+ outcome: 'committed' | 'invalidated';
13
+ at: number;
14
+ code?: string;
15
+ };
16
+ pending?: {
17
+ runId: string;
18
+ autoCreate: boolean;
19
+ token: string;
20
+ leaseUntil: number;
21
+ input: KanbanScanInput;
22
+ executionStarted?: boolean;
23
+ executionSettled?: boolean;
24
+ changes?: KanbanDiscoveryChange[];
25
+ records?: KanbanRecordInput[];
26
+ request?: KanbanRequest;
27
+ };
28
+ }
29
+ interface KanbanScanSource {
30
+ scope?: KanbanBoard['scope'];
31
+ projectId?: string;
32
+ kind: 'local' | 'remote';
33
+ /** Must enumerate board-scoped sources, including archived sessions when requested. */
34
+ list(includeArchived: boolean): Promise<KanbanScanSession[]>;
35
+ inspect(sessionId: string): Promise<KanbanScanSession>;
36
+ read(session: KanbanScanSession, maxBytes: number): Promise<KanbanScanText>;
37
+ }
38
+ interface KanbanScanExecutor {
39
+ readonly identity: string;
40
+ /** Stable runId must reconnect to the existing analysis operation after response loss. */
41
+ run(input: KanbanScanInput): Promise<KanbanDiscoveryChange[] | KanbanDiscoveryResult>;
42
+ settled?(input: KanbanScanInput): Promise<boolean>;
43
+ }
44
+ interface KanbanDiscoveryOptions {
45
+ boardId: string;
46
+ store: KanbanStore;
47
+ service: KanbanService;
48
+ source: KanbanScanSource;
49
+ executor: KanbanScanExecutor;
50
+ policy: KanbanScanPolicy;
51
+ /** Revalidate project scope, source access, and chosen connection before reading/executing/committing. */
52
+ authorize(stage: 'read' | 'execute' | 'commit', input?: KanbanScanInput): Promise<void>;
53
+ now?: () => number;
54
+ id?: () => string;
55
+ log: KanbanModuleOptions['log'];
56
+ }
57
+
58
+ interface KanbanState {
59
+ workflow?: KanbanWorkflowState;
60
+ numbering?: {
61
+ item: number;
62
+ log: number;
63
+ decision: number;
64
+ };
65
+ presetVersions?: Record<string, number>;
66
+ records?: KanbanProjectRecord[];
67
+ discovery?: KanbanDiscoveryState;
68
+ archiveIndex?: KanbanItemSummary[];
69
+ archiveWrites?: Array<{
70
+ id: string;
71
+ value: KanbanArchivedItem | null;
72
+ }>;
73
+ restore?: KanbanArchivedItem;
74
+ schema: 1;
75
+ board: KanbanBoard;
76
+ sequence: number;
77
+ events: KanbanEvent[];
78
+ escalations: string[];
79
+ }
80
+ interface KanbanReadView {
81
+ /** Board metadata and summary indexes; no item/record bodies. */
82
+ state: KanbanState;
83
+ items: KanbanItemSummary[];
84
+ records: KanbanRecordSummary[];
85
+ }
86
+ interface KanbanStore {
87
+ boardId?(number: number): Promise<string | null>;
88
+ view?(id: string): Promise<KanbanReadView | null>;
89
+ ids(): Promise<string[]>;
90
+ archived(boardId: string, itemId: string): Promise<KanbanArchivedItem | null>;
91
+ events(id: string, after: number, limit: number, through: number): Promise<KanbanEvent[]>;
92
+ read(id: string): Promise<KanbanState | null>;
93
+ update(id: string, operationId: string, fingerprint: string, change: (state: KanbanState | null) => KanbanState): Promise<KanbanState>;
94
+ }
95
+ interface KanbanModuleOptions {
96
+ /** Host supplies metadata within the authorized user's/project's session scope. */
97
+ suggestions?(board: KanbanBoard, kind: KanbanSuggestionKind, search: string, limit: number): Promise<KanbanSuggestion[] | undefined>;
98
+ verifyOutputs?(input: {
99
+ stage?: 'observe' | 'accept';
100
+ board: KanbanBoard;
101
+ itemId: string;
102
+ dispatchId?: string;
103
+ outputs: KanbanArtifactRef[];
104
+ }): Promise<boolean>;
105
+ onCommitted?(boardId: string, service: KanbanService, now: number): Promise<void>;
106
+ store: KanbanStore;
107
+ /** Trusted identity resolved by the host, never from command payloads. */
108
+ actor: KanbanActor;
109
+ /** Must validate project access, delegated authority and session registration. */
110
+ authorize(input: {
111
+ actor: KanbanActor;
112
+ board: KanbanBoard;
113
+ action: 'create' | 'read' | 'install-content' | KanbanCommand['type'];
114
+ command?: KanbanCommand;
115
+ }): Promise<void>;
116
+ /** Confirm an automated owner has settled before releasing responsibility. */
117
+ verifyDeletion?(board: KanbanBoard): Promise<void>;
118
+ verifyLifecycle?(board: KanbanBoard, command: KanbanCommand): Promise<void>;
119
+ verifyRelease?(input: {
120
+ actor: KanbanActor;
121
+ board: KanbanBoard;
122
+ item: KanbanItem;
123
+ }): Promise<boolean>;
124
+ now?: () => number;
125
+ id?: () => string;
126
+ log(event: {
127
+ operationId: string;
128
+ boardId?: string;
129
+ sessionId?: string;
130
+ stage: string;
131
+ result: 'success' | 'failure';
132
+ code?: string;
133
+ durationMs: number;
134
+ }): void;
135
+ }
136
+ declare class KanbanError extends Error {
137
+ readonly code: string;
138
+ constructor(code: string);
139
+ }
140
+ declare class KanbanScanNotStartedError extends KanbanError {
141
+ }
142
+
143
+ export { type KanbanModuleOptions as K, KanbanError as a, type KanbanReadView as b, KanbanScanNotStartedError as c, type KanbanState as d, type KanbanStore as e, type KanbanDiscoveryOptions as f, type KanbanDiscoveryState as g, type KanbanScanExecutor as h, type KanbanScanSource as i };
@@ -0,0 +1,49 @@
1
+ import { u as KanbanExternalReference, J as KanbanProjectRecord } from './planning-CHrOqQ6b.js';
2
+
3
+ interface KanbanRuntimeDiagnostic {
4
+ operationId: string;
5
+ stage: string;
6
+ result: 'started' | 'success' | 'failure';
7
+ durationMs: number;
8
+ code?: string;
9
+ operation?: string;
10
+ boardId?: string;
11
+ itemId?: string;
12
+ count?: number;
13
+ }
14
+ interface KanbanJournalOptions {
15
+ directory?: string;
16
+ artifactScheme?: string;
17
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
18
+ }
19
+ interface KanbanReferencePolicy {
20
+ resource: string;
21
+ decision: string;
22
+ execution: string;
23
+ nativeExecution?: string;
24
+ workspace?: string;
25
+ inherit?(references: readonly KanbanExternalReference[]): KanbanExternalReference[];
26
+ }
27
+ declare const defaultReferences: KanbanReferencePolicy;
28
+ interface KanbanResourceCatalog {
29
+ system: string;
30
+ decisionSystem?: string;
31
+ list(): Promise<Array<{
32
+ reference: KanbanExternalReference;
33
+ label: string;
34
+ }>>;
35
+ validate(references: readonly KanbanExternalReference[]): Promise<void>;
36
+ }
37
+ interface KanbanWorkLogOptions {
38
+ directory?: string;
39
+ references?: KanbanReferencePolicy;
40
+ label?(stage: string): string;
41
+ diagnostic?(event: KanbanRuntimeDiagnostic): void;
42
+ onRecord?(input: {
43
+ boardId: string;
44
+ itemId: string;
45
+ record: KanbanProjectRecord;
46
+ }): Promise<void>;
47
+ }
48
+
49
+ export { type KanbanResourceCatalog as K, type KanbanRuntimeDiagnostic as a, type KanbanJournalOptions as b, type KanbanWorkLogOptions as c, type KanbanReferencePolicy as d, defaultReferences as e };
@@ -0,0 +1,205 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } async function _asyncOptionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = await fn(value); } else if (op === 'call' || op === 'optionalCall') { value = await fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+ var _chunkQRGZD2JUcjs = require('../chunk-QRGZD2JU.cjs');
10
+ require('../chunk-5Q7WB63A.cjs');
11
+ require('../chunk-DINLR6E6.cjs');
12
+ require('../chunk-ZUZGAO6G.cjs');
13
+ require('../chunk-VMRDXOLX.cjs');
14
+ require('../chunk-EYTVC2H5.cjs');
15
+ require('../chunk-XBSGUVCY.cjs');
16
+ require('../chunk-4XF6LQSU.cjs');
17
+
18
+
19
+ var _chunkRBOER6EWcjs = require('../chunk-RBOER6EW.cjs');
20
+
21
+
22
+ var _chunk7KDOTBRXcjs = require('../chunk-7KDOTBRX.cjs');
23
+ require('../chunk-RSH6QSEC.cjs');
24
+ require('../chunk-AOHQCX7K.cjs');
25
+
26
+ // src/runtime/public-authorization.ts
27
+ function runtimeAuthorization(options) {
28
+ return async (input) => {
29
+ await options.authorize(input);
30
+ const command = input.command;
31
+ if (_optionalChain([command, 'optionalAccess', _ => _.type]) !== "configure-automation") return;
32
+ if (!options.execution) {
33
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !command.settings.enabled, "AUTOMATION_UNAVAILABLE");
34
+ return;
35
+ }
36
+ const catalog = await options.execution.catalog(), settings = command.settings;
37
+ for (const reference of [settings.planner, settings.executor]) _chunkRBOER6EWcjs.requireValue.call(void 0, catalog.targets.some((target) => sameReference(target.reference, reference)), "AUTOMATION_TARGET_CHANGED");
38
+ if (settings.preparation) _chunkRBOER6EWcjs.requireValue.call(void 0, _optionalChain([catalog, 'access', _2 => _2.preparations, 'optionalAccess', _3 => _3.some, 'call', _4 => _4((target) => sameReference(target.reference, settings.preparation))]), "PREPARATION_UNAVAILABLE");
39
+ _chunkRBOER6EWcjs.requireValue.call(void 0, settings.coordinator.kind === catalog.coordinator.kind && settings.coordinator.id === catalog.coordinator.id && settings.worker.kind === catalog.worker.kind && settings.worker.id === catalog.worker.id, "AUTOMATION_PRINCIPAL_CHANGED");
40
+ };
41
+ }
42
+ function sameReference(left, right) {
43
+ return left.system === right.system && left.id === right.id && left.revision === right.revision;
44
+ }
45
+
46
+ // src/runtime/execution-bindings.ts
47
+ var ExecutionBindings = class {
48
+ constructor(journal) {
49
+ this.journal = journal;
50
+ }
51
+ async save(intent, handle) {
52
+ _chunkRBOER6EWcjs.requireValue.call(void 0, typeof _optionalChain([handle, 'optionalAccess', _5 => _5.id]) === "string" && handle.id.length > 0 && handle.id.length <= 512, "EXECUTION_HANDLE_INVALID");
53
+ const next = { scope: intent.scope, handle }, encoded = JSON.stringify(next);
54
+ _chunkRBOER6EWcjs.requireValue.call(void 0, new TextEncoder().encode(encoded).byteLength <= 128 * 1024, "EXECUTION_HANDLE_TOO_LARGE");
55
+ const saved = await this.journal.update("execution-binding:" + intent.id, (old) => {
56
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !old || JSON.stringify(old) === encoded, "EXECUTION_BINDING_CONFLICT");
57
+ return _nullishCoalesce(old, () => ( next));
58
+ });
59
+ return saved.handle;
60
+ }
61
+ async get(id) {
62
+ return await _asyncOptionalChain([(await this.journal.get("execution-binding:" + id)), 'optionalAccess', async _6 => _6.handle]);
63
+ }
64
+ };
65
+
66
+ // src/runtime/public-execution.ts
67
+ function createExecutionRuntime(context, adapter, resourceSystem = _chunkQRGZD2JUcjs.defaultReferences.resource) {
68
+ const bindings = new ExecutionBindings(context.journal), references = { ..._chunkQRGZD2JUcjs.defaultReferences, resource: resourceSystem };
69
+ const prepare = async (intent) => bindings.save(intent, await adapter.prepare(intent));
70
+ const controls = { control: {
71
+ control: async (request) => {
72
+ const handle = await bindings.get(_nullishCoalesce(request.attemptId, () => ( request.executionId)));
73
+ _chunkRBOER6EWcjs.requireValue.call(void 0, adapter.control, "TASK_CONTROL_UNSUPPORTED");
74
+ _chunkRBOER6EWcjs.requireValue.call(void 0, handle, "TASK_CONTROL_ROUTE_MISSING");
75
+ return adapter.control(handle, { operationId: request.operationId, action: request.action });
76
+ },
77
+ inspect: async (id, attempt = id) => {
78
+ const handle = await bindings.get(attempt);
79
+ if (!handle) return void 0;
80
+ const receipt = validateReceipt(await adapter.inspect(handle));
81
+ return { settled: ["succeeded", "failed", "cancelled"].includes(receipt.outcome), outcome: terminalOutcome(receipt) };
82
+ }
83
+ } };
84
+ const automation = _chunkQRGZD2JUcjs.createKanbanAutomation.call(void 0, {
85
+ ...context,
86
+ directory: context.journal.directory + "/executions",
87
+ catalog: () => adapter.catalog(),
88
+ log: (event) => context.journal.diagnostic(event),
89
+ controls: (board, service) => _chunkQRGZD2JUcjs.scanTaskControls.call(void 0, controls, context.journal, board, service),
90
+ drain: (board, service) => _chunkQRGZD2JUcjs.drainBoardAnalyses.call(void 0, controls, context.journal, board, service),
91
+ executor: async (execution) => workExecutor(context, adapter, prepare, execution.boardId, references, execution.dependencies),
92
+ analyze: async (board, item, service, active) => _chunkQRGZD2JUcjs.analyzeItem.call(void 0,
93
+ {
94
+ journal: context.journal,
95
+ active,
96
+ log: (event) => context.journal.diagnostic(event),
97
+ inheritReferences: (refs) => refs.filter((ref) => [references.resource, references.decision].includes(ref.system)),
98
+ port: {
99
+ prepare: async ({ id, target }) => prepare({ id, purpose: "planning", target, ...preparation(board), scope: scope(board, item), context: {
100
+ ...await executionContext(context, board, item, references),
101
+ workTypes: _nullishCoalesce(board.workTypes, () => ( _chunk7KDOTBRXcjs.DEFAULT_KANBAN_WORK_TYPES)),
102
+ related: board.items.map(({ id: id2, title, status, planning }) => ({ id: id2, title, status, planning }))
103
+ } }),
104
+ prepareExecution: async () => {
105
+ },
106
+ submit: async (handle) => {
107
+ await adapter.submit(handle);
108
+ },
109
+ inspect: async (_id, handle) => {
110
+ const receipt = validateReceipt(await adapter.inspect(handle));
111
+ return { state: receipt.outcome, output: receipt.result, code: receipt.code };
112
+ }
113
+ }
114
+ },
115
+ board,
116
+ item,
117
+ _optionalChain([board, 'access', _7 => _7.automation, 'optionalAccess', _8 => _8.enabled]) ? board.automation.planner : void 0,
118
+ service
119
+ )
120
+ });
121
+ return { ...automation, controls };
122
+ }
123
+ function workExecutor(context, adapter, prepare, boardId, references, dependencies) {
124
+ const frozen = async (dispatch, item, previous) => {
125
+ const board = await context.service.read(boardId);
126
+ _chunkRBOER6EWcjs.requireValue.call(void 0, board.automation, "AUTOMATION_UNAVAILABLE");
127
+ return { id: dispatch.id, handle: await prepare({
128
+ id: dispatch.id,
129
+ purpose: "work",
130
+ ...preparation(board),
131
+ scope: scope(board, item),
132
+ target: board.automation.executor,
133
+ context: { ...await executionContext(context, board, item, references), inputs: dispatch.inputs, dependencies: await dependencies(item) },
134
+ ...previous ? { previous } : {}
135
+ }) };
136
+ };
137
+ const observe = async (value, submit) => {
138
+ const saved = value;
139
+ _chunkRBOER6EWcjs.requireValue.call(void 0, _optionalChain([saved, 'optionalAccess', _9 => _9.id]) && _optionalChain([saved, 'access', _10 => _10.handle, 'optionalAccess', _11 => _11.id]), "EXECUTION_HANDLE_INVALID");
140
+ const receipt = validateReceipt(await (submit ? adapter.submit(saved.handle) : adapter.inspect(saved.handle)));
141
+ if (receipt.outcome === "succeeded" && receipt.result === void 0) return { outcome: "unknown", code: "EXECUTION_RESULT_PENDING", executionSessionId: receipt.executionId };
142
+ const outputs = receipt.outcome === "succeeded" && receipt.result !== void 0 ? await context.journal.artifact(saved.id, receipt.result) : void 0;
143
+ return { outcome: receipt.outcome, code: receipt.code, executionSessionId: receipt.executionId, controlCapabilities: receipt.controlCapabilities, outputs };
144
+ };
145
+ return { prepare: frozen, prepareContinuation: (dispatch, item, previous) => frozen(dispatch, item, previous.handle), start: (value) => observe(value, true), inspect: (value) => observe(value, false) };
146
+ }
147
+ function scope(board, item) {
148
+ return { boardId: board.id, itemId: item.id, itemRevision: item.revision };
149
+ }
150
+ function terminalOutcome(receipt) {
151
+ return receipt.outcome === "succeeded" || receipt.outcome === "failed" || receipt.outcome === "cancelled" ? receipt.outcome : void 0;
152
+ }
153
+ async function executionContext(context, board, item, references) {
154
+ const value = await _chunkQRGZD2JUcjs.workContext.call(void 0, context.journal, board, item, references), decision = value.decision;
155
+ return { ...value, decision: decision ? { sourceBoardId: decision.sourceBoardId, recordId: decision.recordId, recordRevision: decision.recordRevision, runId: decision.runId } : null };
156
+ }
157
+ function validateReceipt(receipt) {
158
+ _chunkRBOER6EWcjs.requireValue.call(void 0, receipt && ["running", "unknown", "succeeded", "failed", "cancelled"].includes(receipt.outcome), "EXECUTION_RECEIPT_INVALID");
159
+ _chunkRBOER6EWcjs.requireValue.call(void 0, receipt.executionId === void 0 || typeof receipt.executionId === "string" && receipt.executionId.length > 0 && receipt.executionId.length <= 512, "EXECUTION_RECEIPT_INVALID");
160
+ _chunkRBOER6EWcjs.requireValue.call(void 0, receipt.code === void 0 || typeof receipt.code === "string" && /^[A-Z][A-Z0-9_]{0,79}$/.test(receipt.code), "EXECUTION_RECEIPT_INVALID");
161
+ return receipt;
162
+ }
163
+ function preparation(board) {
164
+ return _optionalChain([board, 'access', _12 => _12.automation, 'optionalAccess', _13 => _13.preparation]) ? { preparation: { reference: board.automation.preparation, options: board.automation.preparationOptions } } : {};
165
+ }
166
+
167
+ // src/runtime/public-runtime.ts
168
+ async function createKanbanRuntime(options) {
169
+ let context, execution;
170
+ const assembled = await _chunkQRGZD2JUcjs.assembleKanbanRuntime.call(void 0, {
171
+ ...options,
172
+ authorize: runtimeAuthorization(options),
173
+ log: _nullishCoalesce(options.log, () => ( (() => {
174
+ }))),
175
+ referenceSystem: "kanban-execution",
176
+ executionSessions: options.activity ? { source: options.activity } : void 0,
177
+ verifyOutputs: async ({ board, itemId, dispatchId, outputs }) => {
178
+ if (!context || !dispatchId) return false;
179
+ const dispatch = (await context.service.workflow(board.id)).dispatches[dispatchId];
180
+ return _optionalChain([dispatch, 'optionalAccess', _14 => _14.itemId]) === itemId && context.journal.verify(outputs, dispatchId);
181
+ },
182
+ control: { control: {
183
+ control: (request) => _nullishCoalesce(_optionalChain([execution, 'optionalAccess', _15 => _15.controls, 'access', _16 => _16.control, 'access', _17 => _17.control, 'call', _18 => _18(request)]), () => ( Promise.resolve("unknown"))),
184
+ inspect: (id, attempt) => _nullishCoalesce(_optionalChain([execution, 'optionalAccess', _19 => _19.controls, 'access', _20 => _20.control, 'access', _21 => _21.inspect, 'optionalCall', _22 => _22(id, attempt)]), () => ( Promise.resolve(void 0)))
185
+ } },
186
+ extensions: (bound) => {
187
+ context = bound;
188
+ if (!options.execution) return [];
189
+ execution = createExecutionRuntime(bound, options.execution, _optionalChain([options, 'access', _23 => _23.resources, 'optionalAccess', _24 => _24.system]));
190
+ return [{ ...execution, capabilities: { automationCatalog: execution.automationCatalog, analysisStatus: execution.analysisStatus } }];
191
+ }
192
+ });
193
+ const service = assembled.service;
194
+ return { ...service, results: async (boardId, dispatchId) => {
195
+ const dispatch = (await service.workflow(boardId)).dispatches[dispatchId];
196
+ _chunkRBOER6EWcjs.requireValue.call(void 0, dispatch, "DISPATCH_NOT_FOUND");
197
+ const outputs = _nullishCoalesce(dispatch.outputs, () => ( []));
198
+ _chunkRBOER6EWcjs.requireValue.call(void 0, !outputs.length || await assembled.journal.verify(outputs, dispatchId), "ARTIFACT_INVALID");
199
+ return Promise.all(outputs.map(async (reference) => ({ reference, value: JSON.parse(await assembled.journal.get("artifact:" + reference.sha256)) })));
200
+ } };
201
+ }
202
+
203
+
204
+ exports.createKanbanRuntime = createKanbanRuntime;
205
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/runtime/index.cjs","../../src/runtime/public-authorization.ts","../../src/runtime/execution-bindings.ts","../../src/runtime/public-execution.ts","../../src/runtime/public-runtime.ts"],"names":["id"],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACF,yDAA8B;AAC9B;AACE;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACA;ACpBO,SAAS,oBAAA,CAAqB,OAAA,EAA+D;AAChG,EAAA,OAAO,MAAA,CAAM,KAAA,EAAA,GAAO;AAChB,IAAA,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AAC7B,IAAA,MAAM,QAAA,EAAQ,KAAA,CAAM,OAAA;AAAQ,IAAA,GAAA,iBAAG,OAAA,2BAAS,OAAA,IAAO,sBAAA,EAAuB,MAAA;AACtE,IAAA,GAAA,CAAG,CAAC,OAAA,CAAQ,SAAA,EAAU;AAAC,MAAA,4CAAA,CAAc,OAAA,CAAQ,QAAA,CAAS,OAAA,EAAQ,wBAAwB,CAAA;AAAE,MAAA,MAAA;AAAA,IAAO;AAC/F,IAAA,MAAM,QAAA,EAAQ,MAAM,OAAA,CAAQ,SAAA,CAAU,OAAA,CAAQ,CAAA,EAAE,SAAA,EAAS,OAAA,CAAQ,QAAA;AACjE,IAAA,IAAA,CAAA,MAAU,UAAA,GAAa,CAAC,QAAA,CAAS,OAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA,EAAE,4CAAA,OAAa,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAA,GAAQ,aAAA,CAAc,MAAA,CAAO,SAAA,EAAU,SAAS,CAAC,CAAA,EAAE,2BAA2B,CAAA;AAC5K,IAAA,GAAA,CAAG,QAAA,CAAS,WAAA,EAAY,4CAAA,gBAAa,OAAA,qBAAQ,YAAA,6BAAc,IAAA,mBAAK,CAAA,MAAA,EAAA,GAAQ,aAAA,CAAc,MAAA,CAAO,SAAA,EAAU,QAAA,CAAS,WAAY,CAAC,GAAA,EAAE,yBAAyB,CAAA;AACxJ,IAAA,4CAAA,QAAa,CAAS,WAAA,CAAY,KAAA,IAAO,OAAA,CAAQ,WAAA,CAAY,KAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAA,IAAK,OAAA,CAAQ,WAAA,CAAY,GAAA,GAC3G,QAAA,CAAS,MAAA,CAAO,KAAA,IAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,GAAM,QAAA,CAAS,MAAA,CAAO,GAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,EAAA,EAAG,8BAA8B,CAAA;AAAA,EAC3H,CAAA;AACJ;AACA,SAAS,aAAA,CAAc,IAAA,EAA6B,KAAA,EAAuC;AACvF,EAAA,OAAO,IAAA,CAAK,OAAA,IAAS,KAAA,CAAM,OAAA,GAAQ,IAAA,CAAK,GAAA,IAAK,KAAA,CAAM,GAAA,GAAI,IAAA,CAAK,SAAA,IAAW,KAAA,CAAM,QAAA;AACjF;ADyBA;AACA;AExCO,IAAM,kBAAA,EAAN,MAAwB;AAAA,EAC3B,WAAA,CAA6B,OAAA,EAAiC;AAAjC,IAAA,IAAA,CAAA,QAAA,EAAA,OAAA;AAAA,EAAkC;AAAA,EAC/D,MAAM,IAAA,CAAK,MAAA,EAA6B,MAAA,EAA6D;AACjG,IAAA,4CAAA,uBAAoB,MAAA,6BAAQ,KAAA,IAAK,SAAA,GAAU,MAAA,CAAO,EAAA,CAAG,OAAA,EAAO,EAAA,GAAG,MAAA,CAAO,EAAA,CAAG,OAAA,GAAQ,GAAA,EAAI,0BAA0B,CAAA;AAC/G,IAAA,MAAM,KAAA,EAAa,EAAC,KAAA,EAAM,MAAA,CAAO,KAAA,EAAM,OAAM,CAAA,EAAE,QAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAC1E,IAAA,4CAAA,IAAiB,WAAA,CAAY,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,WAAA,GAAY,IAAA,EAAI,IAAA,EAAK,4BAA4B,CAAA;AAChG,IAAA,MAAM,MAAA,EAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAgB,qBAAA,EAAqB,MAAA,CAAO,EAAA,EAAG,CAAA,GAAA,EAAA,GAAK;AAC/E,MAAA,4CAAA,CAAc,IAAA,GAAK,IAAA,CAAK,SAAA,CAAU,GAAG,EAAA,IAAI,OAAA,EAAQ,4BAA4B,CAAA;AAAE,MAAA,wBAAO,GAAA,UAAK,MAAA;AAAA,IAC/F,CAAC,CAAA;AACD,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACjB;AAAA,EACA,MAAM,GAAA,CAAI,EAAA,EAAoD;AAC1D,IAAA,kCAAA,CAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAa,qBAAA,EAAqB,EAAE,CAAA,CAAA,mCAAI,QAAA;AAAA,EACvE;AACJ,CAAA;AF6CA;AACA;AGnDO,SAAS,sBAAA,CAAuB,OAAA,EAA6B,OAAA,EAA+B,eAAA,EAAe,mCAAA,CAAkB,QAAA,EAAU;AAC1I,EAAA,MAAM,SAAA,EAAS,IAAI,iBAAA,CAAkB,OAAA,CAAQ,OAAO,CAAA,EAAE,WAAA,EAAW,EAAC,GAAG,mCAAA,EAAkB,QAAA,EAAS,eAAc,CAAA;AAC9G,EAAA,MAAM,QAAA,EAAQ,MAAA,CAAM,MAAA,EAAA,GAA+B,QAAA,CAAS,IAAA,CAAK,MAAA,EAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA;AACrG,EAAA,MAAM,SAAA,EAAkC,EAAC,OAAA,EAAQ;AAAA,IAC7C,OAAA,EAAQ,MAAA,CAAM,OAAA,EAAA,GAAS;AACnB,MAAA,MAAM,OAAA,EAAO,MAAM,QAAA,CAAS,GAAA,kBAAI,OAAA,CAAQ,SAAA,UAAW,OAAA,CAAQ,aAAW,CAAA;AACtE,MAAA,4CAAA,OAAa,CAAQ,OAAA,EAAQ,0BAA0B,CAAA;AAAE,MAAA,4CAAA,MAAa,EAAO,4BAA4B,CAAA;AACzG,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAO,EAAC,WAAA,EAAY,OAAA,CAAQ,WAAA,EAAY,MAAA,EAAO,OAAA,CAAQ,OAAM,CAAC,CAAA;AAAA,IACzF,CAAA;AAAA,IAAE,OAAA,EAAQ,MAAA,CAAM,EAAA,EAAG,QAAA,EAAQ,EAAA,EAAA,GAAK;AAC5B,MAAA,MAAM,OAAA,EAAO,MAAM,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAE,MAAA,GAAA,CAAG,CAAC,MAAA,EAAO,OAAO,KAAA,CAAA;AAC3D,MAAA,MAAM,QAAA,EAAQ,eAAA,CAAgB,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC3D,MAAA,OAAO,EAAC,OAAA,EAAQ,CAAC,WAAA,EAAY,QAAA,EAAS,WAAW,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAE,OAAA,EAAQ,eAAA,CAAgB,OAAO,EAAC,CAAA;AAAA,IACjH;AAAA,EAAC,EAAC,CAAA;AACN,EAAA,MAAM,WAAA,EAAW,sDAAA;AAAuB,IAAC,GAAG,OAAA;AAAA,IAAQ,SAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAU,aAAA;AAAA,IAAc,OAAA,EAAQ,CAAA,EAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,IAC9H,GAAA,EAAI,CAAA,KAAA,EAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AAAA,IAAE,QAAA,EAAS,CAAC,KAAA,EAAM,OAAA,EAAA,GAAU,gDAAA,QAAiB,EAAS,OAAA,CAAQ,OAAA,EAAQ,KAAA,EAAM,OAAO,CAAA;AAAA,IAC9H,KAAA,EAAM,CAAC,KAAA,EAAM,OAAA,EAAA,GAAU,kDAAA,QAAmB,EAAS,OAAA,CAAQ,OAAA,EAAQ,KAAA,EAAM,OAAO,CAAA;AAAA,IAChF,QAAA,EAAS,MAAA,CAAM,SAAA,EAAA,GAAW,YAAA,CAAa,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAAQ,SAAA,CAAU,OAAA,EAAQ,UAAA,EAAW,SAAA,CAAU,YAAY,CAAA;AAAA,IAClH,OAAA,EAAQ,MAAA,CAAM,KAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,MAAA,EAAA,GAAS,2CAAA;AAAA,MAAY;AAAA,QAAC,OAAA,EAAQ,OAAA,CAAQ,OAAA;AAAA,QAAQ,MAAA;AAAA,QAAO,GAAA,EAAI,CAAA,KAAA,EAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AAAA,QAC7H,iBAAA,EAAkB,CAAA,IAAA,EAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAA,GAAA,EAAA,GAAK,CAAC,UAAA,CAAW,QAAA,EAAS,UAAA,CAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QACvG,IAAA,EAAK;AAAA,UAAC,OAAA,EAAQ,MAAA,CAAM,EAAC,EAAA,EAAG,OAAM,CAAA,EAAA,GAAI,OAAA,CAAQ,EAAC,EAAA,EAAG,OAAA,EAAQ,UAAA,EAAW,MAAA,EAAO,GAAG,WAAA,CAAY,KAAK,CAAA,EAAE,KAAA,EAAM,KAAA,CAAM,KAAA,EAAM,IAAI,CAAA,EAAE,OAAA,EAAQ;AAAA,YAAC,GAAG,MAAM,gBAAA,CAAiB,OAAA,EAAQ,KAAA,EAAM,IAAA,EAAK,UAAU,CAAA;AAAA,YAClL,SAAA,mBAAU,KAAA,CAAM,SAAA,UAAW,6CAAA;AAAA,YAA0B,OAAA,EAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,EAAC,EAAA,EAAAA,GAAAA,EAAG,KAAA,EAAM,MAAA,EAAO,SAAQ,CAAA,EAAA,GAAA,CAAK,EAAC,EAAA,EAAAA,GAAAA,EAAG,KAAA,EAAM,MAAA,EAAO,SAAQ,CAAA,CAAE;AAAA,UAAC,EAAC,CAAC,CAAA;AAAA,UAC1I,gBAAA,EAAiB,MAAA,CAAA,EAAA,GAAS;AAAA,UAAC,CAAA;AAAA,UAAE,MAAA,EAAO,MAAA,CAAM,MAAA,EAAA,GAAQ;AAAC,YAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAAA,UAAE,CAAA;AAAA,UAChF,OAAA,EAAQ,MAAA,CAAM,GAAA,EAAI,MAAA,EAAA,GAAS;AAAC,YAAA,MAAM,QAAA,EAAQ,eAAA,CAAgB,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAE,YAAA,OAAO,EAAC,KAAA,EAAM,OAAA,CAAQ,OAAA,EAAQ,MAAA,EAAO,OAAA,CAAQ,MAAA,EAAO,IAAA,EAAK,OAAA,CAAQ,KAAI,CAAA;AAAA,UAAE;AAAA,QAAC;AAAA,MAAC,CAAA;AAAA,MACtK,KAAA;AAAA,MAAM,IAAA;AAAA,sBAAK,KAAA,qBAAM,UAAA,6BAAY,UAAA,EAAQ,KAAA,CAAM,UAAA,CAAW,QAAA,EAAQ,KAAA,CAAA;AAAA,MAAU;AAAA,IAAO;AAAA,EAAC,CAAC,CAAA;AACzF,EAAA,OAAO,EAAC,GAAG,UAAA,EAAW,SAAQ,CAAA;AAClC;AACA,SAAS,YAAA,CAAa,OAAA,EAA6B,OAAA,EAA+B,OAAA,EAAuE,OAAA,EAAe,UAAA,EAAoC,YAAA,EAAsE;AAC9Q,EAAA,MAAM,OAAA,EAAO,MAAA,CAAM,QAAA,EAAuD,IAAA,EAAgB,QAAA,EAAA,GAAkC;AACxH,IAAA,MAAM,MAAA,EAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAE,IAAA,4CAAA,KAAa,CAAM,UAAA,EAAW,wBAAwB,CAAA;AACtG,IAAA,OAAO,EAAC,EAAA,EAAG,QAAA,CAAS,EAAA,EAAG,MAAA,EAAO,MAAM,OAAA,CAAQ;AAAA,MAAC,EAAA,EAAG,QAAA,CAAS,EAAA;AAAA,MAAG,OAAA,EAAQ,MAAA;AAAA,MAAO,GAAG,WAAA,CAAY,KAAK,CAAA;AAAA,MAAE,KAAA,EAAM,KAAA,CAAM,KAAA,EAAM,IAAI,CAAA;AAAA,MAAE,MAAA,EAAO,KAAA,CAAM,UAAA,CAAW,QAAA;AAAA,MAC7I,OAAA,EAAQ,EAAC,GAAG,MAAM,gBAAA,CAAiB,OAAA,EAAQ,KAAA,EAAM,IAAA,EAAK,UAAU,CAAA,EAAE,MAAA,EAAO,QAAA,CAAS,MAAA,EAAO,YAAA,EAAa,MAAM,YAAA,CAAa,IAAI,EAAC,CAAA;AAAA,MAAE,GAAI,SAAA,EAAS,EAAC,SAAQ,EAAA,EAAE,CAAC;AAAA,IAAE,CAAC,EAAC,CAAA;AAAA,EACrK,CAAA;AACA,EAAA,MAAM,QAAA,EAAQ,MAAA,CAAM,KAAA,EAAc,MAAA,EAAA,GAAiB;AAC/C,IAAA,MAAM,MAAA,EAAM,KAAA;AAAkD,IAAA,4CAAA,gBAAa,KAAA,6BAAO,KAAA,mBAAI,KAAA,uBAAM,MAAA,+BAAQ,IAAA,EAAG,0BAA0B,CAAA;AACjI,IAAA,MAAM,QAAA,EAAQ,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,MAAM,EAAA,EAAE,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AACvG,IAAA,GAAA,CAAG,OAAA,CAAQ,QAAA,IAAU,YAAA,GAAa,OAAA,CAAQ,OAAA,IAAS,KAAA,CAAA,EAAU,OAAO,EAAC,OAAA,EAAQ,SAAA,EAAmB,IAAA,EAAK,0BAAA,EAA2B,kBAAA,EAAmB,OAAA,CAAQ,YAAW,CAAA;AACtK,IAAA,MAAM,QAAA,EAAQ,OAAA,CAAQ,QAAA,IAAU,YAAA,GAAa,OAAA,CAAQ,OAAA,IAAS,KAAA,EAAA,EAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,EAAA,EAAG,OAAA,CAAQ,MAAM,EAAA,EAAE,KAAA,CAAA;AAChI,IAAA,OAAO,EAAC,OAAA,EAAQ,OAAA,CAAQ,OAAA,EAAQ,IAAA,EAAK,OAAA,CAAQ,IAAA,EAAK,kBAAA,EAAmB,OAAA,CAAQ,WAAA,EAAY,mBAAA,EAAoB,OAAA,CAAQ,mBAAA,EAAoB,QAAO,CAAA;AAAA,EACpJ,CAAA;AACA,EAAA,OAAO,EAAC,OAAA,EAAQ,MAAA,EAAO,mBAAA,EAAoB,CAAC,QAAA,EAAS,IAAA,EAAK,QAAA,EAAA,GAAW,MAAA,CAAO,QAAA,EAAS,IAAA,EAAM,QAAA,CAA4C,MAAM,CAAA,EAAE,KAAA,EAAM,CAAA,KAAA,EAAA,GAAO,OAAA,CAAQ,KAAA,EAAM,IAAI,CAAA,EAAE,OAAA,EAAQ,CAAA,KAAA,EAAA,GAAO,OAAA,CAAQ,KAAA,EAAM,KAAK,EAAC,CAAA;AACvN;AACA,SAAS,KAAA,CAAM,KAAA,EAAkB,IAAA,EAAgD;AAAC,EAAA,OAAO,EAAC,OAAA,EAAQ,KAAA,CAAM,EAAA,EAAG,MAAA,EAAO,IAAA,CAAK,EAAA,EAAG,YAAA,EAAa,IAAA,CAAK,SAAQ,CAAA;AAAE;AACtJ,SAAS,eAAA,CAAgB,OAAA,EAA2E;AAChG,EAAA,OAAO,OAAA,CAAQ,QAAA,IAAU,YAAA,GAAa,OAAA,CAAQ,QAAA,IAAU,SAAA,GAAU,OAAA,CAAQ,QAAA,IAAU,YAAA,EAAY,OAAA,CAAQ,QAAA,EAAQ,KAAA,CAAA;AACpH;AAEA,MAAA,SAAe,gBAAA,CAAiB,OAAA,EAA6B,KAAA,EAAkB,IAAA,EAAgB,UAAA,EAAqC;AAChI,EAAA,MAAM,MAAA,EAAM,MAAM,2CAAA,OAAY,CAAQ,OAAA,EAAQ,KAAA,EAAM,IAAA,EAAK,UAAU,CAAA,EAAE,SAAA,EAAS,KAAA,CAAM,QAAA;AACpF,EAAA,OAAO,EAAC,GAAG,KAAA,EAAM,QAAA,EAAS,SAAA,EAAS,EAAC,aAAA,EAAc,QAAA,CAAS,aAAA,EAAc,QAAA,EAAS,QAAA,CAAS,QAAA,EAAS,cAAA,EAAe,QAAA,CAAS,cAAA,EAAe,KAAA,EAAM,QAAA,CAAS,MAAK,EAAA,EAAE,KAAI,CAAA;AACzK;AACA,SAAS,eAAA,CAAgB,OAAA,EAAuD;AAC5E,EAAA,4CAAA,QAAa,GAAS,CAAC,SAAA,EAAU,SAAA,EAAU,WAAA,EAAY,QAAA,EAAS,WAAW,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAE,2BAA2B,CAAA;AAClI,EAAA,4CAAA,OAAa,CAAQ,YAAA,IAAc,KAAA,EAAA,GAAW,OAAO,OAAA,CAAQ,YAAA,IAAc,SAAA,GAAU,OAAA,CAAQ,WAAA,CAAY,OAAA,EAAO,EAAA,GAAG,OAAA,CAAQ,WAAA,CAAY,OAAA,GAAQ,GAAA,EAAI,2BAA2B,CAAA;AAC9K,EAAA,4CAAA,OAAa,CAAQ,KAAA,IAAO,KAAA,EAAA,GAAW,OAAO,OAAA,CAAQ,KAAA,IAAO,SAAA,GAAU,wBAAA,CAAyB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAE,2BAA2B,CAAA;AAC9I,EAAA,OAAO,OAAA;AACX;AAEA,SAAS,WAAA,CAAY,KAAA,EAA6D;AAC9E,EAAA,uBAAO,KAAA,uBAAM,UAAA,+BAAY,cAAA,EAAY,EAAC,WAAA,EAAY,EAAC,SAAA,EAAU,KAAA,CAAM,UAAA,CAAW,WAAA,EAAY,OAAA,EAAQ,KAAA,CAAM,UAAA,CAAW,mBAAkB,EAAC,EAAA,EAAE,CAAC,CAAA;AAC7I;AH4FA;AACA;AI/JA,MAAA,SAAsB,mBAAA,CAAoB,OAAA,EAAqD;AAC3F,EAAA,IAAI,OAAA,EAAuC,SAAA;AAC3C,EAAA,MAAM,UAAA,EAAU,MAAM,qDAAA;AAAsB,IAAC,GAAG,OAAA;AAAA,IAAQ,SAAA,EAAU,oBAAA,CAAqB,OAAO,CAAA;AAAA,IAAE,GAAA,mBAAI,OAAA,CAAQ,GAAA,UAAA,CAAM,CAAA,EAAA,GAAI;AAAA,IAAC,CAAA,GAAA;AAAA,IACnH,eAAA,EAAgB,kBAAA;AAAA,IAAmB,iBAAA,EAAkB,OAAA,CAAQ,SAAA,EAAS,EAAC,MAAA,EAAO,OAAA,CAAQ,SAAQ,EAAA,EAAE,KAAA,CAAA;AAAA,IAChG,aAAA,EAAc,MAAA,CAAM,EAAC,KAAA,EAAM,MAAA,EAAO,UAAA,EAAW,QAAO,CAAA,EAAA,GAAI;AACpD,MAAA,GAAA,CAAG,CAAC,QAAA,GAAS,CAAC,UAAA,EAAW,OAAO,KAAA;AAChC,MAAA,MAAM,SAAA,EAAA,CAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA,CAAA,CAAG,UAAA,CAAW,UAAU,CAAA;AAC/E,MAAA,uBAAO,QAAA,+BAAU,SAAA,IAAS,OAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAQ,UAAU,CAAA;AAAA,IAC/E,CAAA;AAAA,IAAE,OAAA,EAAQ,EAAC,OAAA,EAAQ;AAAA,MAAC,OAAA,EAAQ,CAAA,OAAA,EAAA,oCAAS,SAAA,+BAAW,QAAA,uBAAS,OAAA,uBAAQ,OAAA,qBAAQ,OAAO,GAAA,UAAG,OAAA,CAAQ,OAAA,CAAQ,SAAS,GAAA;AAAA,MACxG,OAAA,EAAQ,CAAC,EAAA,EAAG,OAAA,EAAA,oCAAU,SAAA,+BAAW,QAAA,uBAAS,OAAA,uBAAQ,OAAA,4BAAA,CAAU,EAAA,EAAG,OAAO,GAAA,UAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAS;AAAA,IAAC,EAAC,CAAA;AAAA,IACxG,UAAA,EAAW,CAAA,KAAA,EAAA,GAAO;AACd,MAAA,QAAA,EAAQ,KAAA;AAAM,MAAA,GAAA,CAAG,CAAC,OAAA,CAAQ,SAAA,EAAU,OAAO,CAAC,CAAA;AAC5C,MAAA,UAAA,EAAU,sBAAA,CAAuB,KAAA,EAAM,OAAA,CAAQ,SAAA,kBAAU,OAAA,uBAAQ,SAAA,+BAAW,QAAM,CAAA;AAClF,MAAA,OAAO,CAAC,EAAC,GAAG,SAAA,EAAU,YAAA,EAAa,EAAC,iBAAA,EAAkB,SAAA,CAAU,iBAAA,EAAkB,cAAA,EAAe,SAAA,CAAU,eAAc,EAAC,CAAC,CAAA;AAAA,IAC/H;AAAA,EAAC,CAAC,CAAA;AACN,EAAA,MAAM,QAAA,EAAQ,SAAA,CAAU,OAAA;AACxB,EAAA,OAAO,EAAC,GAAG,OAAA,EAAQ,OAAA,EAAQ,MAAA,CAAM,OAAA,EAAQ,UAAA,EAAA,GAAa;AAClD,IAAA,MAAM,SAAA,EAAA,CAAU,MAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,CAAA,CAAG,UAAA,CAAW,UAAU,CAAA;AAAE,IAAA,4CAAA,QAAa,EAAS,oBAAoB,CAAA;AAClH,IAAA,MAAM,QAAA,mBAAQ,QAAA,CAAS,OAAA,UAAS,CAAC,GAAA;AAAE,IAAA,4CAAA,CAAc,OAAA,CAAQ,OAAA,GAAQ,MAAM,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAQ,UAAU,CAAA,EAAE,kBAAkB,CAAA;AACtI,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAM,SAAA,EAAA,GAAA,CAAY,EAAC,SAAA,EAAU,KAAA,EAAM,IAAA,CAAK,KAAA,CAAO,MAAM,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAY,YAAA,EAAY,SAAA,CAAU,MAAM,CAAG,EAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACzJ,EAAC,CAAA;AACL;AJ6KA;AACE;AACF,kDAAC","file":"/home/li/share/prj/x1/libraries/kanban/dist/runtime/index.cjs","sourcesContent":[null,"import type {KanbanExternalReference} from '../contracts';\nimport type {KanbanModuleOptions} from '../ports';\nimport type {KanbanRuntimeOptions} from './public-ports';\nimport {requireValue} from '../rules';\n/** Catalog validation complements the host's current principal/resource authorization. */\nexport function runtimeAuthorization(options:KanbanRuntimeOptions):KanbanModuleOptions['authorize'] {\n return async input=>{\n await options.authorize(input);\n const command=input.command;if(command?.type!=='configure-automation')return;\n if(!options.execution){requireValue(!command.settings.enabled,'AUTOMATION_UNAVAILABLE');return;}\n const catalog=await options.execution.catalog(),settings=command.settings;\n for(const reference of [settings.planner,settings.executor])requireValue(catalog.targets.some(target=>sameReference(target.reference,reference)),'AUTOMATION_TARGET_CHANGED');\n if(settings.preparation)requireValue(catalog.preparations?.some(target=>sameReference(target.reference,settings.preparation!)),'PREPARATION_UNAVAILABLE');\n requireValue(settings.coordinator.kind===catalog.coordinator.kind&&settings.coordinator.id===catalog.coordinator.id\n &&settings.worker.kind===catalog.worker.kind&&settings.worker.id===catalog.worker.id,'AUTOMATION_PRINCIPAL_CHANGED');\n };\n}\nfunction sameReference(left:KanbanExternalReference,right:KanbanExternalReference):boolean {\n return left.system===right.system&&left.id===right.id&&left.revision===right.revision;\n}\n","import type {KanbanExecutionHandle,KanbanExecutionIntent} from './public-ports';\nimport type {KanbanAutomationJournal} from './automation-journal';\nimport {requireValue} from '../rules';\ninterface Binding {scope:KanbanExecutionIntent['scope'];handle:KanbanExecutionHandle}\n/** Stable intent identities are the only index used by control and recovery. */\nexport class ExecutionBindings {\n constructor(private readonly journal:KanbanAutomationJournal) {}\n async save(intent:KanbanExecutionIntent,handle:KanbanExecutionHandle):Promise<KanbanExecutionHandle> {\n requireValue(typeof handle?.id==='string'&&handle.id.length>0&&handle.id.length<=512,'EXECUTION_HANDLE_INVALID');\n const next:Binding={scope:intent.scope,handle},encoded=JSON.stringify(next);\n requireValue(new TextEncoder().encode(encoded).byteLength<=128*1024,'EXECUTION_HANDLE_TOO_LARGE');\n const saved=await this.journal.update<Binding>('execution-binding:'+intent.id,old=>{\n requireValue(!old||JSON.stringify(old)===encoded,'EXECUTION_BINDING_CONFLICT');return old??next;\n });\n return saved.handle;\n }\n async get(id:string):Promise<KanbanExecutionHandle|undefined> {\n return (await this.journal.get<Binding>('execution-binding:'+id))?.handle;\n }\n}\n","import type {KanbanBoard,KanbanItem} from '../contracts';\nimport {DEFAULT_KANBAN_WORK_TYPES} from '../contracts';\nimport type {KanbanExecutionPort} from '../execution';\nimport type {KanbanRuntimeContext} from './runtime-ports';\nimport type {KanbanExecutionAdapter,KanbanExecutionHandle,KanbanExecutionIntent,KanbanExecutionReceipt} from './public-ports';\nimport type {KanbanTaskControlOptions} from './control-ports';\nimport {ExecutionBindings} from './execution-bindings';\nimport {createKanbanAutomation} from './automation';\nimport {analyzeItem} from './analysis';\nimport {drainBoardAnalyses} from './board-drain';\nimport {scanTaskControls} from './task-controls';\nimport {workContext} from './work-context';\nimport {defaultReferences} from './ports';\nimport {requireValue} from '../rules';\nexport function createExecutionRuntime(context:KanbanRuntimeContext,adapter:KanbanExecutionAdapter,resourceSystem=defaultReferences.resource) {\n const bindings=new ExecutionBindings(context.journal),references={...defaultReferences,resource:resourceSystem};\n const prepare=async(intent:KanbanExecutionIntent)=>bindings.save(intent,await adapter.prepare(intent));\n const controls:KanbanTaskControlOptions={control:{\n control:async request=>{\n const handle=await bindings.get(request.attemptId??request.executionId);\n requireValue(adapter.control,'TASK_CONTROL_UNSUPPORTED');requireValue(handle,'TASK_CONTROL_ROUTE_MISSING');\n return adapter.control(handle,{operationId:request.operationId,action:request.action});\n },inspect:async(id,attempt=id)=>{\n const handle=await bindings.get(attempt);if(!handle)return undefined;\n const receipt=validateReceipt(await adapter.inspect(handle));\n return {settled:['succeeded','failed','cancelled'].includes(receipt.outcome),outcome:terminalOutcome(receipt)};\n }}};\n const automation=createKanbanAutomation({...context,directory:context.journal.directory+'/executions',catalog:()=>adapter.catalog(),\n log:event=>context.journal.diagnostic(event),controls:(board,service)=>scanTaskControls(controls,context.journal,board,service),\n drain:(board,service)=>drainBoardAnalyses(controls,context.journal,board,service),\n executor:async execution=>workExecutor(context,adapter,prepare,execution.boardId,references,execution.dependencies),\n analyze:async(board,item,service,active)=>analyzeItem({journal:context.journal,active,log:event=>context.journal.diagnostic(event),\n inheritReferences:refs=>refs.filter(ref=>[references.resource,references.decision].includes(ref.system)),\n port:{prepare:async({id,target})=>prepare({id,purpose:'planning',target,...preparation(board),scope:scope(board,item),context:{...await executionContext(context,board,item,references),\n workTypes:board.workTypes??DEFAULT_KANBAN_WORK_TYPES,related:board.items.map(({id,title,status,planning})=>({id,title,status,planning}))}}),\n prepareExecution:async()=>{},submit:async handle=>{await adapter.submit(handle);},\n inspect:async(_id,handle)=>{const receipt=validateReceipt(await adapter.inspect(handle));return {state:receipt.outcome,output:receipt.result,code:receipt.code};}}},\n board,item,board.automation?.enabled?board.automation.planner:undefined,service)});\n return {...automation,controls};\n}\nfunction workExecutor(context:KanbanRuntimeContext,adapter:KanbanExecutionAdapter,prepare:(intent:KanbanExecutionIntent)=>Promise<KanbanExecutionHandle>,boardId:string,references:typeof defaultReferences,dependencies:(item:KanbanItem)=>Promise<unknown>):KanbanExecutionPort {\n const frozen=async(dispatch:Parameters<KanbanExecutionPort['prepare']>[0],item:KanbanItem,previous?:KanbanExecutionHandle)=>{\n const board=await context.service.read(boardId);requireValue(board.automation,'AUTOMATION_UNAVAILABLE');\n return {id:dispatch.id,handle:await prepare({id:dispatch.id,purpose:'work',...preparation(board),scope:scope(board,item),target:board.automation.executor,\n context:{...await executionContext(context,board,item,references),inputs:dispatch.inputs,dependencies:await dependencies(item)},...(previous?{previous}:{})})};\n };\n const observe=async(value:unknown,submit:boolean)=>{\n const saved=value as {id:string;handle:KanbanExecutionHandle};requireValue(saved?.id&&saved.handle?.id,'EXECUTION_HANDLE_INVALID');\n const receipt=validateReceipt(await (submit?adapter.submit(saved.handle):adapter.inspect(saved.handle)));\n if(receipt.outcome==='succeeded'&&receipt.result===undefined)return {outcome:'unknown' as const,code:'EXECUTION_RESULT_PENDING',executionSessionId:receipt.executionId};\n const outputs=receipt.outcome==='succeeded'&&receipt.result!==undefined?await context.journal.artifact(saved.id,receipt.result):undefined;\n return {outcome:receipt.outcome,code:receipt.code,executionSessionId:receipt.executionId,controlCapabilities:receipt.controlCapabilities,outputs};\n };\n return {prepare:frozen,prepareContinuation:(dispatch,item,previous)=>frozen(dispatch,item,(previous as {handle:KanbanExecutionHandle}).handle),start:value=>observe(value,true),inspect:value=>observe(value,false)};\n}\nfunction scope(board:KanbanBoard,item:KanbanItem):KanbanExecutionIntent['scope'] {return {boardId:board.id,itemId:item.id,itemRevision:item.revision};}\nfunction terminalOutcome(receipt:KanbanExecutionReceipt):'succeeded'|'failed'|'cancelled'|undefined {\n return receipt.outcome==='succeeded'||receipt.outcome==='failed'||receipt.outcome==='cancelled'?receipt.outcome:undefined;\n}\n\nasync function executionContext(context:KanbanRuntimeContext,board:KanbanBoard,item:KanbanItem,references:typeof defaultReferences) {\n const value=await workContext(context.journal,board,item,references),decision=value.decision;\n return {...value,decision:decision?{sourceBoardId:decision.sourceBoardId,recordId:decision.recordId,recordRevision:decision.recordRevision,runId:decision.runId}:null};\n}\nfunction validateReceipt(receipt:KanbanExecutionReceipt):KanbanExecutionReceipt {\n requireValue(receipt&&['running','unknown','succeeded','failed','cancelled'].includes(receipt.outcome),'EXECUTION_RECEIPT_INVALID');\n requireValue(receipt.executionId===undefined||typeof receipt.executionId==='string'&&receipt.executionId.length>0&&receipt.executionId.length<=512,'EXECUTION_RECEIPT_INVALID');\n requireValue(receipt.code===undefined||typeof receipt.code==='string'&&/^[A-Z][A-Z0-9_]{0,79}$/.test(receipt.code),'EXECUTION_RECEIPT_INVALID');\n return receipt;\n}\n\nfunction preparation(board:KanbanBoard):Pick<KanbanExecutionIntent,'preparation'> {\n return board.automation?.preparation?{preparation:{reference:board.automation.preparation,options:board.automation.preparationOptions}}:{};\n}\n","import {assembleKanbanRuntime} from './runtime';\nimport {runtimeAuthorization} from './public-authorization';\nimport {createExecutionRuntime} from './public-execution';\nimport {requireValue} from '../rules';\nimport type {KanbanRuntime,KanbanRuntimeOptions} from './public-ports';\nimport type {KanbanRuntimeContext} from './runtime-ports';\n/** The public instance contains semantic operations only; all coordination state is private. */\nexport async function createKanbanRuntime(options:KanbanRuntimeOptions):Promise<KanbanRuntime> {\n let context:KanbanRuntimeContext|undefined,execution:ReturnType<typeof createExecutionRuntime>|undefined;\n const assembled=await assembleKanbanRuntime({...options,authorize:runtimeAuthorization(options),log:options.log??(()=>{}),\n referenceSystem:'kanban-execution',executionSessions:options.activity?{source:options.activity}:undefined,\n verifyOutputs:async({board,itemId,dispatchId,outputs})=>{\n if(!context||!dispatchId)return false;\n const dispatch=(await context.service.workflow(board.id)).dispatches[dispatchId];\n return dispatch?.itemId===itemId&&context.journal.verify(outputs,dispatchId);\n },control:{control:{control:request=>execution?.controls.control.control(request)??Promise.resolve('unknown'),\n inspect:(id,attempt)=>execution?.controls.control.inspect?.(id,attempt)??Promise.resolve(undefined)}},\n extensions:bound=>{\n context=bound;if(!options.execution)return [];\n execution=createExecutionRuntime(bound,options.execution,options.resources?.system);\n return [{...execution,capabilities:{automationCatalog:execution.automationCatalog,analysisStatus:execution.analysisStatus}}];\n }});\n const service=assembled.service;\n return {...service,results:async(boardId,dispatchId)=>{\n const dispatch=(await service.workflow(boardId)).dispatches[dispatchId];requireValue(dispatch,'DISPATCH_NOT_FOUND');\n const outputs=dispatch.outputs??[];requireValue(!outputs.length||await assembled.journal.verify(outputs,dispatchId),'ARTIFACT_INVALID');\n return Promise.all(outputs.map(async reference=>({reference,value:JSON.parse((await assembled.journal.get<string>('artifact:'+reference.sha256))!)})));\n }};\n}\n"]}