cueline 0.1.2 → 0.1.4

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 (116) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/.codex-plugin/plugin.json +3 -3
  3. package/CHANGELOG.md +38 -0
  4. package/README.ja.md +65 -21
  5. package/README.ko.md +65 -21
  6. package/README.md +70 -23
  7. package/README.zh-CN.md +65 -21
  8. package/README.zh-TW.md +68 -22
  9. package/dist/src/api-contracts.d.ts +77 -0
  10. package/dist/src/api-contracts.js +2 -0
  11. package/dist/src/api-contracts.js.map +1 -0
  12. package/dist/src/api-controller-handoff.d.ts +6 -0
  13. package/dist/src/api-controller-handoff.js +253 -0
  14. package/dist/src/api-controller-handoff.js.map +1 -0
  15. package/dist/src/api-runtime-lifecycle.d.ts +22 -0
  16. package/dist/src/api-runtime-lifecycle.js +568 -0
  17. package/dist/src/api-runtime-lifecycle.js.map +1 -0
  18. package/dist/src/api.d.ts +9 -27
  19. package/dist/src/api.js +138 -42
  20. package/dist/src/api.js.map +1 -1
  21. package/dist/src/browser/browser-adapter.d.ts +11 -1
  22. package/dist/src/browser/codex-iab/bootstrap.d.ts +16 -0
  23. package/dist/src/browser/codex-iab/bootstrap.js +49 -0
  24. package/dist/src/browser/codex-iab/bootstrap.js.map +1 -1
  25. package/dist/src/browser/codex-iab/chatgpt-client.js +346 -120
  26. package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -1
  27. package/dist/src/browser/codex-iab/recovery-evidence.d.ts +6 -0
  28. package/dist/src/browser/codex-iab/recovery-evidence.js +37 -0
  29. package/dist/src/browser/codex-iab/recovery-evidence.js.map +1 -0
  30. package/dist/src/browser/codex-iab/submission-url.d.ts +2 -0
  31. package/dist/src/browser/codex-iab/submission-url.js +53 -0
  32. package/dist/src/browser/codex-iab/submission-url.js.map +1 -0
  33. package/dist/src/cli/main.js +305 -20
  34. package/dist/src/cli/main.js.map +1 -1
  35. package/dist/src/core/controller-abort.d.ts +1 -0
  36. package/dist/src/core/controller-abort.js +11 -0
  37. package/dist/src/core/controller-abort.js.map +1 -0
  38. package/dist/src/core/controller-command-execution.d.ts +9 -0
  39. package/dist/src/core/controller-command-execution.js +299 -0
  40. package/dist/src/core/controller-command-execution.js.map +1 -0
  41. package/dist/src/core/controller-loop.d.ts +3 -37
  42. package/dist/src/core/controller-loop.js +386 -291
  43. package/dist/src/core/controller-loop.js.map +1 -1
  44. package/dist/src/core/controller-turn.d.ts +16 -0
  45. package/dist/src/core/controller-turn.js +309 -0
  46. package/dist/src/core/controller-turn.js.map +1 -0
  47. package/dist/src/core/controller-types.d.ts +58 -0
  48. package/dist/src/core/controller-types.js +2 -0
  49. package/dist/src/core/controller-types.js.map +1 -0
  50. package/dist/src/core/persisted-run.d.ts +4 -0
  51. package/dist/src/core/persisted-run.js +19 -0
  52. package/dist/src/core/persisted-run.js.map +1 -0
  53. package/dist/src/core/process-liveness.d.ts +2 -0
  54. package/dist/src/core/process-liveness.js +44 -0
  55. package/dist/src/core/process-liveness.js.map +1 -0
  56. package/dist/src/core/run-status.d.ts +53 -0
  57. package/dist/src/core/run-status.js +224 -0
  58. package/dist/src/core/run-status.js.map +1 -0
  59. package/dist/src/core/state-machine.d.ts +17 -4
  60. package/dist/src/core/state-machine.js +170 -16
  61. package/dist/src/core/state-machine.js.map +1 -1
  62. package/dist/src/jobs/status.d.ts +7 -1
  63. package/dist/src/jobs/status.js.map +1 -1
  64. package/dist/src/jobs/supervisor.d.ts +2 -0
  65. package/dist/src/jobs/supervisor.js +47 -13
  66. package/dist/src/jobs/supervisor.js.map +1 -1
  67. package/dist/src/protocol/types.d.ts +1 -1
  68. package/dist/src/protocol/validate-command.js +18 -0
  69. package/dist/src/protocol/validate-command.js.map +1 -1
  70. package/dist/src/router/resolver.d.ts +2 -1
  71. package/dist/src/router/resolver.js +31 -13
  72. package/dist/src/router/resolver.js.map +1 -1
  73. package/dist/src/runners/process-runner.d.ts +2 -2
  74. package/dist/src/runners/process-runner.js +113 -9
  75. package/dist/src/runners/process-runner.js.map +1 -1
  76. package/dist/src/runners/runner-adapter.d.ts +9 -2
  77. package/dist/src/runners/runner-adapter.js.map +1 -1
  78. package/dist/src/state/atomic-write.js +17 -2
  79. package/dist/src/state/atomic-write.js.map +1 -1
  80. package/dist/src/state/cancellation.d.ts +42 -0
  81. package/dist/src/state/cancellation.js +168 -0
  82. package/dist/src/state/cancellation.js.map +1 -0
  83. package/dist/src/state/event-log.d.ts +17 -1
  84. package/dist/src/state/event-log.js +328 -18
  85. package/dist/src/state/event-log.js.map +1 -1
  86. package/dist/src/state/paths.d.ts +4 -0
  87. package/dist/src/state/paths.js +4 -0
  88. package/dist/src/state/paths.js.map +1 -1
  89. package/dist/src/state/runtime-lease.d.ts +53 -0
  90. package/dist/src/state/runtime-lease.js +727 -0
  91. package/dist/src/state/runtime-lease.js.map +1 -0
  92. package/dist/src/state/runtime-retirement.d.ts +16 -0
  93. package/dist/src/state/runtime-retirement.js +95 -0
  94. package/dist/src/state/runtime-retirement.js.map +1 -0
  95. package/dist/src/state/runtime-takeover-intent.d.ts +1 -0
  96. package/dist/src/state/runtime-takeover-intent.js +18 -0
  97. package/dist/src/state/runtime-takeover-intent.js.map +1 -0
  98. package/dist/src/state/store.d.ts +12 -1
  99. package/dist/src/state/store.js +246 -40
  100. package/dist/src/state/store.js.map +1 -1
  101. package/dist/src/version.d.ts +1 -1
  102. package/dist/src/version.js +1 -1
  103. package/docs/architecture.md +16 -11
  104. package/docs/assets/cueline-loop-en.svg +11 -10
  105. package/docs/assets/cueline-loop-ja.svg +11 -10
  106. package/docs/assets/cueline-loop-ko.svg +11 -10
  107. package/docs/assets/cueline-loop-zh-CN.svg +11 -10
  108. package/docs/assets/cueline-loop-zh-TW.svg +11 -10
  109. package/docs/compatibility.md +16 -8
  110. package/docs/controller-protocol.md +8 -4
  111. package/docs/runner-contract.md +26 -6
  112. package/docs/state-and-recovery.md +69 -16
  113. package/package.json +4 -3
  114. package/schemas/controller-observation.schema.json +1 -1
  115. package/scripts/validate-plugin.mjs +66 -0
  116. package/skills/cueline/SKILL.md +89 -13
@@ -0,0 +1,77 @@
1
+ import type { BrowserAdapter } from "./browser/browser-adapter.js";
2
+ import type { CodexIabAdapterOptions } from "./browser/codex-iab/chatgpt-client.js";
3
+ import type { RoutingConfig } from "./router/types.js";
4
+ import type { JobResultStatus } from "./runners/runner-adapter.js";
5
+ export interface CueLineRuntimeOptions {
6
+ browser?: BrowserAdapter;
7
+ browserOptions?: Omit<CodexIabAdapterOptions, "conversationUrl">;
8
+ conversationUrl?: string;
9
+ routingConfig?: RoutingConfig;
10
+ routingConfigPath?: string;
11
+ home?: string;
12
+ cwd?: string;
13
+ environment?: NodeJS.ProcessEnv;
14
+ defaultTimeoutMs?: number;
15
+ maxRounds?: number;
16
+ maxRepairAttempts?: number;
17
+ now?: () => Date;
18
+ signal?: AbortSignal;
19
+ cancellationPollIntervalMs?: number;
20
+ runTimeoutMs?: number;
21
+ executor?: "caller" | "process";
22
+ maxConcurrency?: number;
23
+ laneConcurrency?: Readonly<Record<string, number>>;
24
+ }
25
+ export interface StartCueLineRunOptions extends CueLineRuntimeOptions {
26
+ request: string;
27
+ runId?: string;
28
+ }
29
+ export interface ContinueCueLineRunOptions extends CueLineRuntimeOptions {
30
+ runId: string;
31
+ reconcileRequestId?: string;
32
+ abandonOtherPendingTurns?: boolean;
33
+ manualSendConfirmed?: boolean;
34
+ }
35
+ export interface ManualControllerSubmissionConfirmation {
36
+ runId: string;
37
+ requestId: string;
38
+ conversationUrl: string;
39
+ outcome: "confirmed" | "already_confirmed";
40
+ }
41
+ export interface CueLineCallerJobResultInput {
42
+ status: JobResultStatus;
43
+ stdout?: string;
44
+ stderr?: string;
45
+ output?: string;
46
+ error?: string;
47
+ exitCode?: number | null;
48
+ startedAt?: string;
49
+ finishedAt?: string;
50
+ }
51
+ export interface CueLineCallerJobSubmissionResult {
52
+ runId: string;
53
+ jobId: string;
54
+ outcome: "submitted" | "already_terminal";
55
+ }
56
+ export interface CueLineRuntimeReconciliationResult {
57
+ runId: string;
58
+ outcome: "reconciled" | "owner_alive" | "processes_alive" | "already_terminal";
59
+ affectedJobs: number;
60
+ survivingJobs: string[];
61
+ }
62
+ export interface CueLineRuntimeTakeoverResult {
63
+ runId: string;
64
+ outcome: "taken_over" | "already_available" | "already_terminal";
65
+ next: "continue" | "reconcile_runtime" | "none";
66
+ previousOwnerId?: string;
67
+ }
68
+ export interface CueLineRunCancellationResult {
69
+ runId: string;
70
+ outcome: "requested" | "cancelled" | "already_terminal";
71
+ affectedJobs: number;
72
+ }
73
+ export interface CueLineJobCancellationResult {
74
+ runId: string;
75
+ jobId: string;
76
+ outcome: "requested" | "cancelled" | "ambiguous" | "already_terminal";
77
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api-contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-contracts.js","sourceRoot":"","sources":["../../src/api-contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { CueLineCallerJobResultInput, CueLineCallerJobSubmissionResult, CueLineRuntimeOptions, ManualControllerSubmissionConfirmation } from "./api-contracts.js";
2
+ export declare function confirmManualControllerSubmission(runId: string, options: Pick<CueLineRuntimeOptions, "home" | "environment" | "now"> & {
3
+ requestId: string;
4
+ conversationUrl?: string;
5
+ }): Promise<ManualControllerSubmissionConfirmation>;
6
+ export declare function submitCueLineCallerJobResult(runId: string, jobId: string, input: CueLineCallerJobResultInput, options?: Pick<CueLineRuntimeOptions, "home" | "environment" | "now">): Promise<CueLineCallerJobSubmissionResult>;
@@ -0,0 +1,253 @@
1
+ import { CueLineError } from "./core/errors.js";
2
+ import { loadPersistedRunStore } from "./core/persisted-run.js";
3
+ import { runtimeEnvironment } from "./core/runtime.js";
4
+ import { JobStatusStore } from "./jobs/status.js";
5
+ import { defaultCueLineHome } from "./state/paths.js";
6
+ import { readRuntimeLease, retireDeadRuntimeLease, RuntimeLease, } from "./state/runtime-lease.js";
7
+ import { readAuthoritativeRunEvents } from "./state/store.js";
8
+ function normalizedConversationUrl(value) {
9
+ try {
10
+ const parsed = new URL(value);
11
+ return `${parsed.origin}${parsed.pathname}`;
12
+ }
13
+ catch {
14
+ return value;
15
+ }
16
+ }
17
+ export async function confirmManualControllerSubmission(runId, options) {
18
+ const environment = options.environment ?? runtimeEnvironment();
19
+ const home = options.home ?? defaultCueLineHome(environment);
20
+ await loadPersistedRunStore(home, runId);
21
+ const runtime = await readRuntimeLease(home, runId, {
22
+ ...(options.now === undefined ? {} : { now: options.now }),
23
+ });
24
+ const retiredOwner = (runtime.ownership === "active" || runtime.ownership === "stale") &&
25
+ runtime.ownerId !== undefined &&
26
+ (await retireDeadRuntimeLease(home, runId, runtime.ownerId))
27
+ ? { ownerId: runtime.ownerId, ownership: runtime.ownership }
28
+ : undefined;
29
+ const lease = await RuntimeLease.claim({
30
+ home,
31
+ runId,
32
+ ...(options.now === undefined ? {} : { now: options.now }),
33
+ });
34
+ try {
35
+ const store = await loadPersistedRunStore(home, runId);
36
+ store.bindRuntimeOwner(lease.ownerId);
37
+ if (retiredOwner !== undefined) {
38
+ await store.append("runtime_dead_owner_retired", {
39
+ owner_id: retiredOwner.ownerId,
40
+ previous_ownership: retiredOwner.ownership,
41
+ });
42
+ }
43
+ const state = store.state;
44
+ const turn = (state.pendingControllerTurns ?? []).find((candidate) => candidate.requestId === options.requestId) ??
45
+ (state.abandonedControllerTurns ?? []).find((candidate) => candidate.requestId === options.requestId);
46
+ if (!turn) {
47
+ throw new CueLineError("CONTROLLER_RECONCILIATION_REQUEST_NOT_FOUND", `Controller request '${options.requestId}' is neither pending nor recoverably abandoned in run '${runId}'.`);
48
+ }
49
+ const conversationUrl = options.conversationUrl ?? turn.conversationUrl ?? state.conversationUrl;
50
+ if (!conversationUrl || !state.conversationUrl) {
51
+ throw new CueLineError("CONTROLLER_RECONCILIATION_URL_REQUIRED", "Manual submission confirmation requires the exact persisted ChatGPT conversation URL.");
52
+ }
53
+ if (normalizedConversationUrl(conversationUrl) !==
54
+ normalizedConversationUrl(state.conversationUrl)) {
55
+ throw new CueLineError("CONTROLLER_RECONCILIATION_CONVERSATION_MISMATCH", "The operator-confirmed conversation URL does not match the persisted CueLine conversation.");
56
+ }
57
+ if (turn.conversationUrl !== null &&
58
+ normalizedConversationUrl(conversationUrl) !==
59
+ normalizedConversationUrl(turn.conversationUrl)) {
60
+ throw new CueLineError("CONTROLLER_RECONCILIATION_CONVERSATION_MISMATCH", "The operator-confirmed conversation URL does not match the exact conversation bound to this controller turn.");
61
+ }
62
+ const events = await readAuthoritativeRunEvents(home, runId);
63
+ for (const event of events) {
64
+ if (event.type !== "controller_command_accepted")
65
+ continue;
66
+ const payload = typeof event.payload === "object" &&
67
+ event.payload !== null &&
68
+ !Array.isArray(event.payload)
69
+ ? event.payload
70
+ : {};
71
+ const command = typeof payload.command === "object" &&
72
+ payload.command !== null &&
73
+ !Array.isArray(payload.command)
74
+ ? payload.command
75
+ : {};
76
+ const acceptedRequestId = command.request_id;
77
+ const acceptedRound = command.round;
78
+ if (acceptedRequestId === options.requestId ||
79
+ (typeof acceptedRound === "number" && acceptedRound >= turn.round)) {
80
+ throw new CueLineError("CONTROLLER_RECONCILIATION_SUPERSEDED", "A command for this request or the same/newer controller round was already accepted; refusing duplicate reconciliation.");
81
+ }
82
+ }
83
+ if (turn.manualSendConfirmed) {
84
+ return {
85
+ runId,
86
+ requestId: turn.requestId,
87
+ conversationUrl,
88
+ outcome: "already_confirmed",
89
+ };
90
+ }
91
+ await store.append("controller_turn_manual_submission_confirmed", {
92
+ round: turn.round,
93
+ request_id: turn.requestId,
94
+ conversation_url: conversationUrl,
95
+ operator_confirmation: true,
96
+ });
97
+ await store.snapshot();
98
+ return { runId, requestId: turn.requestId, conversationUrl, outcome: "confirmed" };
99
+ }
100
+ finally {
101
+ await lease.release();
102
+ }
103
+ }
104
+ function assertCallerJobResultInput(input) {
105
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
106
+ throw new CueLineError("CALLER_JOB_RESULT_INVALID", "Caller job result must be an object.");
107
+ }
108
+ const value = input;
109
+ const terminalStatuses = new Set([
110
+ "succeeded",
111
+ "failed",
112
+ "timed_out",
113
+ "cancelled",
114
+ "ambiguous",
115
+ ]);
116
+ if (typeof value.status !== "string" || !terminalStatuses.has(value.status)) {
117
+ throw new CueLineError("CALLER_JOB_STATUS_INVALID", `Unsupported caller job status '${String(value.status)}'.`);
118
+ }
119
+ for (const field of [
120
+ "stdout",
121
+ "stderr",
122
+ "output",
123
+ "error",
124
+ "startedAt",
125
+ "finishedAt",
126
+ ]) {
127
+ if (value[field] !== undefined && typeof value[field] !== "string") {
128
+ throw new CueLineError("CALLER_JOB_RESULT_INVALID", `Caller job result field '${field}' must be a string when provided.`);
129
+ }
130
+ }
131
+ if (value.exitCode !== undefined &&
132
+ value.exitCode !== null &&
133
+ !Number.isSafeInteger(value.exitCode)) {
134
+ throw new CueLineError("CALLER_JOB_RESULT_INVALID", "Caller job result exitCode must be a safe integer or null when provided.");
135
+ }
136
+ }
137
+ export async function submitCueLineCallerJobResult(runId, jobId, input, options = {}) {
138
+ const environment = options.environment ?? runtimeEnvironment();
139
+ const home = options.home ?? defaultCueLineHome(environment);
140
+ const now = options.now ?? (() => new Date());
141
+ assertCallerJobResultInput(input);
142
+ await loadPersistedRunStore(home, runId);
143
+ const runtime = await readRuntimeLease(home, runId, { now });
144
+ const retiredOwner = (runtime.ownership === "active" || runtime.ownership === "stale") &&
145
+ runtime.ownerId !== undefined &&
146
+ (await retireDeadRuntimeLease(home, runId, runtime.ownerId))
147
+ ? { ownerId: runtime.ownerId, ownership: runtime.ownership }
148
+ : undefined;
149
+ const lease = await RuntimeLease.claim({ home, runId, now });
150
+ try {
151
+ const store = await loadPersistedRunStore(home, runId);
152
+ store.bindRuntimeOwner(lease.ownerId);
153
+ if (retiredOwner !== undefined) {
154
+ await store.append("runtime_dead_owner_retired", {
155
+ owner_id: retiredOwner.ownerId,
156
+ previous_ownership: retiredOwner.ownership,
157
+ });
158
+ }
159
+ if (store.state.executor !== "caller") {
160
+ throw new CueLineError("CALLER_EXECUTOR_REQUIRED", `Run '${runId}' uses the process executor; caller results are not accepted.`);
161
+ }
162
+ const job = store.state.jobs[jobId];
163
+ if (!job) {
164
+ throw new CueLineError("JOB_NOT_FOUND", `No job '${jobId}' exists in run '${runId}'.`);
165
+ }
166
+ if (job.status !== "pending" && job.status !== "running") {
167
+ return { runId, jobId, outcome: "already_terminal" };
168
+ }
169
+ const statusStore = new JobStatusStore(home);
170
+ let terminal = await statusStore.read(jobId);
171
+ if (terminal?.status === "pending" || terminal?.status === "running") {
172
+ terminal = undefined;
173
+ }
174
+ if (terminal !== undefined) {
175
+ if (terminal.runId !== runId || terminal.jobKey !== job.jobKey) {
176
+ throw new CueLineError("CALLER_JOB_RESULT_CONFLICT", `Persisted terminal evidence for '${jobId}' does not belong to this caller job.`);
177
+ }
178
+ }
179
+ else {
180
+ const stdout = input.stdout ?? "";
181
+ const stderr = input.stderr ?? "";
182
+ const output = input.output ??
183
+ (stdout === ""
184
+ ? stderr
185
+ : stderr === ""
186
+ ? stdout
187
+ : `${stdout}${stdout.endsWith("\n") ? "" : "\n"}${stderr}`);
188
+ const startedAt = input.startedAt ?? now().toISOString();
189
+ const finishedAt = input.finishedAt ?? now().toISOString();
190
+ const result = {
191
+ status: input.status,
192
+ exitCode: input.exitCode ?? (input.status === "succeeded" ? 0 : null),
193
+ stdout,
194
+ stderr,
195
+ output,
196
+ emptyOutput: output.length === 0,
197
+ timedOut: input.status === "timed_out",
198
+ cancelled: input.status === "cancelled",
199
+ ambiguousSideEffects: job.spec.mode === "work" && input.status !== "succeeded",
200
+ retryable: false,
201
+ startedAt,
202
+ finishedAt,
203
+ };
204
+ terminal = {
205
+ jobId,
206
+ runId,
207
+ jobKey: job.jobKey,
208
+ lane: job.spec.lane,
209
+ mode: job.spec.mode,
210
+ execution: "foreground",
211
+ status: input.status,
212
+ startedAt,
213
+ finishedAt,
214
+ result,
215
+ ...(input.error === undefined ? {} : { error: input.error }),
216
+ };
217
+ await statusStore.write(terminal);
218
+ }
219
+ const events = await readAuthoritativeRunEvents(home, runId);
220
+ const alreadyRecorded = events.some((event) => {
221
+ if (event.type !== "caller_job_result_submitted")
222
+ return false;
223
+ const payload = typeof event.payload === "object" &&
224
+ event.payload !== null &&
225
+ !Array.isArray(event.payload)
226
+ ? event.payload
227
+ : {};
228
+ return payload.job_id === jobId;
229
+ });
230
+ if (!alreadyRecorded) {
231
+ await store.append("caller_job_result_submitted", {
232
+ job_id: jobId,
233
+ status: terminal.status,
234
+ });
235
+ }
236
+ const terminalResult = terminal.result;
237
+ const controllerOutput = terminal.status === "succeeded" && terminalResult?.stdout.trim() !== ""
238
+ ? terminalResult?.stdout
239
+ : terminalResult?.output;
240
+ await store.append("job_status", {
241
+ job_id: jobId,
242
+ status: terminal.status,
243
+ ...(controllerOutput === undefined ? {} : { output: controllerOutput }),
244
+ ...(terminal.error === undefined ? {} : { error: terminal.error }),
245
+ });
246
+ await store.snapshot();
247
+ return { runId, jobId, outcome: "submitted" };
248
+ }
249
+ finally {
250
+ await lease.release();
251
+ }
252
+ }
253
+ //# sourceMappingURL=api-controller-handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-controller-handoff.js","sourceRoot":"","sources":["../../src/api-controller-handoff.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE9D,SAAS,yBAAyB,CAAC,KAAa;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,KAAa,EACb,OAGC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE;QAClD,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,YAAY,GAChB,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC;QACjE,OAAO,CAAC,OAAO,KAAK,SAAS;QAC7B,CAAC,MAAM,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;QAC5D,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC;QACrC,IAAI;QACJ,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC3D,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC,MAAM,CAAC,4BAA4B,EAAE;gBAC/C,QAAQ,EAAE,YAAY,CAAC,OAAO;gBAC9B,kBAAkB,EAAE,YAAY,CAAC,SAAS;aAC3C,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,IAAI,GACR,CAAC,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,IAAI,CACvC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CACzD;YACD,CAAC,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,IAAI,CACzC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CACzD,CAAC;QACJ,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,YAAY,CACpB,6CAA6C,EAC7C,uBAAuB,OAAO,CAAC,SAAS,0DAA0D,KAAK,IAAI,CAC5G,CAAC;QACJ,CAAC;QACD,MAAM,eAAe,GACnB,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,CAAC;QAC3E,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC/C,MAAM,IAAI,YAAY,CACpB,wCAAwC,EACxC,uFAAuF,CACxF,CAAC;QACJ,CAAC;QACD,IACE,yBAAyB,CAAC,eAAe,CAAC;YAC1C,yBAAyB,CAAC,KAAK,CAAC,eAAe,CAAC,EAChD,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,iDAAiD,EACjD,4FAA4F,CAC7F,CAAC;QACJ,CAAC;QACD,IACE,IAAI,CAAC,eAAe,KAAK,IAAI;YAC7B,yBAAyB,CAAC,eAAe,CAAC;gBACxC,yBAAyB,CAAC,IAAI,CAAC,eAAe,CAAC,EACjD,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,iDAAiD,EACjD,8GAA8G,CAC/G,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,6BAA6B;gBAAE,SAAS;YAC3D,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBACjC,KAAK,CAAC,OAAO,KAAK,IAAI;gBACtB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC3B,CAAC,CAAE,KAAK,CAAC,OAAmC;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,OAAO,GACX,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;gBACnC,OAAO,CAAC,OAAO,KAAK,IAAI;gBACxB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC7B,CAAC,CAAE,OAAO,CAAC,OAAmC;gBAC9C,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;YAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;YACpC,IACE,iBAAiB,KAAK,OAAO,CAAC,SAAS;gBACvC,CAAC,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,EAClE,CAAC;gBACD,MAAM,IAAI,YAAY,CACpB,sCAAsC,EACtC,wHAAwH,CACzH,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO;gBACL,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,eAAe;gBACf,OAAO,EAAE,mBAAmB;aAC7B,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC,MAAM,CAAC,6CAA6C,EAAE;YAChE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,gBAAgB,EAAE,eAAe;YACjC,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACrF,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,YAAY,CAAC,2BAA2B,EAAE,sCAAsC,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;QAC/B,WAAW;QACX,QAAQ;QACR,WAAW;QACX,WAAW;QACX,WAAW;KACZ,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,YAAY,CACpB,2BAA2B,EAC3B,kCAAkC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAC3D,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,KAAK,IAAI;QAClB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,WAAW;QACX,YAAY;KACJ,EAAE,CAAC;QACX,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACnE,MAAM,IAAI,YAAY,CACpB,2BAA2B,EAC3B,4BAA4B,KAAK,mCAAmC,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IACE,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,QAAQ,KAAK,IAAI;QACvB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EACrC,CAAC;QACD,MAAM,IAAI,YAAY,CACpB,2BAA2B,EAC3B,0EAA0E,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAa,EACb,KAAa,EACb,KAAkC,EAClC,OAAO,GAAgE,EAAE;IAEzE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAChB,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC;QACjE,OAAO,CAAC,OAAO,KAAK,SAAS;QAC7B,CAAC,MAAM,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;QAC5D,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC,MAAM,CAAC,4BAA4B,EAAE;gBAC/C,QAAQ,EAAE,YAAY,CAAC,OAAO;gBAC9B,kBAAkB,EAAE,YAAY,CAAC,SAAS;aAC3C,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,YAAY,CACpB,0BAA0B,EAC1B,QAAQ,KAAK,+DAA+D,CAC7E,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,WAAW,KAAK,oBAAoB,KAAK,IAAI,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;QACvD,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,MAAM,KAAK,SAAS,IAAI,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YACrE,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/D,MAAM,IAAI,YAAY,CACpB,4BAA4B,EAC5B,oCAAoC,KAAK,uCAAuC,CACjF,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YAClC,MAAM,MAAM,GACV,KAAK,CAAC,MAAM;gBACZ,CAAC,MAAM,KAAK,EAAE;oBACZ,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,MAAM,KAAK,EAAE;wBACb,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG;gBACb,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrE,MAAM;gBACN,MAAM;gBACN,MAAM;gBACN,WAAW,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAChC,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,WAAW;gBACtC,SAAS,EAAE,KAAK,CAAC,MAAM,KAAK,WAAW;gBACvC,oBAAoB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;gBAC9E,SAAS,EAAE,KAAc;gBACzB,SAAS;gBACT,UAAU;aACX,CAAC;YACF,QAAQ,GAAG;gBACT,KAAK;gBACL,KAAK;gBACL,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;gBACnB,SAAS,EAAE,YAAY;gBACvB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS;gBACT,UAAU;gBACV,MAAM;gBACN,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;aACzC,CAAC;YACtB,MAAM,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,6BAA6B;gBAAE,OAAO,KAAK,CAAC;YAC/D,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBACjC,KAAK,CAAC,OAAO,KAAK,IAAI;gBACtB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC3B,CAAC,CAAE,KAAK,CAAC,OAAmC;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,MAAM,CAAC,6BAA6B,EAAE;gBAChD,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;QACvC,MAAM,gBAAgB,GACpB,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;YACrE,CAAC,CAAC,cAAc,EAAE,MAAM;YACxB,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC;QAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE;YAC/B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;YACvE,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;SACnE,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { CueLineJobCancellationResult, CueLineRunCancellationResult, CueLineRuntimeOptions, CueLineRuntimeReconciliationResult, CueLineRuntimeTakeoverResult } from "./api-contracts.js";
2
+ import type { CueLineResult } from "./core/controller-loop.js";
3
+ import { type CueLineRunStatusSummary } from "./core/run-status.js";
4
+ import type { CueLineRunState } from "./core/state-machine.js";
5
+ declare function terminalResult(state: CueLineRunState): CueLineResult;
6
+ export declare function loadCueLineRunState(runId: string, options?: Pick<CueLineRuntimeOptions, "home" | "environment">): Promise<CueLineRunState>;
7
+ export declare function loadCueLineRunStatus(runId: string, options?: Pick<CueLineRuntimeOptions, "home" | "environment" | "now">): Promise<CueLineRunStatusSummary>;
8
+ /**
9
+ * Explicitly releases one exact stale owner. This is the operator-authorized
10
+ * path for shared Node/REPL hosts whose PID remains alive after the outer tool
11
+ * call disappeared. It never steals an active or newly-heartbeating lease.
12
+ */
13
+ export declare function takeoverCueLineRuntime(runId: string, options?: Pick<CueLineRuntimeOptions, "home" | "environment" | "now">): Promise<CueLineRuntimeTakeoverResult>;
14
+ export declare function reconcileCueLineRuntime(runId: string, options?: Pick<CueLineRuntimeOptions, "home" | "environment" | "now">): Promise<CueLineRuntimeReconciliationResult>;
15
+ export declare function isTerminalRun(state: CueLineRunState): boolean;
16
+ export declare function cancelCueLineRun(runId: string, options?: Pick<CueLineRuntimeOptions, "home" | "environment" | "now"> & {
17
+ reason?: string;
18
+ }): Promise<CueLineRunCancellationResult>;
19
+ export declare function cancelCueLineJob(runId: string, jobId: string, options?: Pick<CueLineRuntimeOptions, "home" | "environment" | "now"> & {
20
+ reason?: string;
21
+ }): Promise<CueLineJobCancellationResult>;
22
+ export { terminalResult };