@younndai/lyt-runner 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +200 -0
- package/NOTICE +23 -0
- package/README.md +110 -0
- package/dist/expander/automator-to-agent.d.ts +4 -0
- package/dist/expander/automator-to-agent.d.ts.map +1 -0
- package/dist/expander/automator-to-agent.js +129 -0
- package/dist/expander/automator-to-agent.js.map +1 -0
- package/dist/expander/index.d.ts +17 -0
- package/dist/expander/index.d.ts.map +1 -0
- package/dist/expander/index.js +62 -0
- package/dist/expander/index.js.map +1 -0
- package/dist/expander/parse-record.d.ts +10 -0
- package/dist/expander/parse-record.d.ts.map +1 -0
- package/dist/expander/parse-record.js +162 -0
- package/dist/expander/parse-record.js.map +1 -0
- package/dist/expander/types.d.ts +39 -0
- package/dist/expander/types.d.ts.map +1 -0
- package/dist/expander/types.js +17 -0
- package/dist/expander/types.js.map +1 -0
- package/dist/hooks/frontmatter.d.ts +10 -0
- package/dist/hooks/frontmatter.d.ts.map +1 -0
- package/dist/hooks/frontmatter.js +90 -0
- package/dist/hooks/frontmatter.js.map +1 -0
- package/dist/hooks/stamp-on-write.d.ts +43 -0
- package/dist/hooks/stamp-on-write.d.ts.map +1 -0
- package/dist/hooks/stamp-on-write.js +289 -0
- package/dist/hooks/stamp-on-write.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/ops/index.d.ts +24 -0
- package/dist/ops/index.d.ts.map +1 -0
- package/dist/ops/index.js +56 -0
- package/dist/ops/index.js.map +1 -0
- package/dist/ops/leases.d.ts +28 -0
- package/dist/ops/leases.d.ts.map +1 -0
- package/dist/ops/leases.js +93 -0
- package/dist/ops/leases.js.map +1 -0
- package/dist/ops/llm.d.ts +28 -0
- package/dist/ops/llm.d.ts.map +1 -0
- package/dist/ops/llm.js +132 -0
- package/dist/ops/llm.js.map +1 -0
- package/dist/ops/mesh.d.ts +11 -0
- package/dist/ops/mesh.d.ts.map +1 -0
- package/dist/ops/mesh.js +35 -0
- package/dist/ops/mesh.js.map +1 -0
- package/dist/ops/vault.d.ts +26 -0
- package/dist/ops/vault.d.ts.map +1 -0
- package/dist/ops/vault.js +153 -0
- package/dist/ops/vault.js.map +1 -0
- package/dist/protocol/five-step.d.ts +22 -0
- package/dist/protocol/five-step.d.ts.map +1 -0
- package/dist/protocol/five-step.js +312 -0
- package/dist/protocol/five-step.js.map +1 -0
- package/dist/protocol/run-context.d.ts +35 -0
- package/dist/protocol/run-context.d.ts.map +1 -0
- package/dist/protocol/run-context.js +56 -0
- package/dist/protocol/run-context.js.map +1 -0
- package/dist/runtime.d.ts +18 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +28 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
// 5-step protocol orchestrator (block-B Commit 4).
|
|
17
|
+
//
|
|
18
|
+
// Per arc-thoughts §6.6:201-216 (LOCKED 2026-05-27) every automator run
|
|
19
|
+
// follows the same five-step shape regardless of archetype:
|
|
20
|
+
//
|
|
21
|
+
// 1. Acquire machine lease (libSQL row with TTL)
|
|
22
|
+
// 2. Sync own vault (git pull --ff-only)
|
|
23
|
+
// 3. Run automator body (the @AUTOMATOR @STEPs after yai.lyt expansion)
|
|
24
|
+
// 4. Commit + push vault changes (gated --no-push for tests + dry-runs)
|
|
25
|
+
// 5. Release lease (clean status) OR mark released_reason='error' on
|
|
26
|
+
// failure path
|
|
27
|
+
//
|
|
28
|
+
// This orchestrator implements the protocol in TypeScript rather than as a
|
|
29
|
+
// YON document because the protocol IS framework: every automator inherits
|
|
30
|
+
// it. Per arc §6.6 "5-step covers ~95% of automators"; 6-step (cross-vault
|
|
31
|
+
// writes) is v3. v1 transaction_mode is `none` (arc §6.8) — failed body
|
|
32
|
+
// step leaves the vault in whatever state the body got it to, with
|
|
33
|
+
// automator_runs.status='failed' carrying the error trail.
|
|
34
|
+
//
|
|
35
|
+
// Crash recovery: any error in steps 2-4 produces a `failed_*` status,
|
|
36
|
+
// surfaces an error summary, and best-effort releases the lease with
|
|
37
|
+
// reason='error'. Step 5 release failure is non-fatal — the auto-expiry
|
|
38
|
+
// sweep on the next acquireLease() call collects the orphan.
|
|
39
|
+
//
|
|
40
|
+
// Block-B Commit 5 wires this into the `automator_runs` + `provenance` +
|
|
41
|
+
// `audit_log` per-vault libSQL tables. Commit 4's orchestrator is the
|
|
42
|
+
// stable skeleton those writes hook into.
|
|
43
|
+
import { acquireLease, insertAutomatorRun, insertAutomatorRunEvent, newUuidv7Bytes, releaseLease, updateAutomatorRunStatus, } from "@younndai/lyt-vault";
|
|
44
|
+
import { createVaultOps } from "../ops/vault.js";
|
|
45
|
+
import { createRunContext, finalizeContext, finishStep, startStep, } from "./run-context.js";
|
|
46
|
+
export async function runFiveStep(runtime, opts) {
|
|
47
|
+
if (runtime.db === undefined && opts.dryRun !== true) {
|
|
48
|
+
throw new Error("runFiveStep: LytRuntime.db is undefined; either pass config.db to createLytRunner() or invoke with { dryRun: true }");
|
|
49
|
+
}
|
|
50
|
+
const startedAt = runtime.getNow();
|
|
51
|
+
const runId = opts.runIdOverride ?? newUuidv7Bytes();
|
|
52
|
+
const ctx = createRunContext({
|
|
53
|
+
runId,
|
|
54
|
+
automatorRid: opts.automatorRid,
|
|
55
|
+
vaultRid: opts.vaultRid,
|
|
56
|
+
vaultPath: opts.vaultPath,
|
|
57
|
+
machineId: runtime.machineId,
|
|
58
|
+
startedAt,
|
|
59
|
+
});
|
|
60
|
+
// Block-B Commit 5: INSERT automator_runs row at orchestrator entry so
|
|
61
|
+
// every event written downstream (incl. body-side @STAMP audit rows) has
|
|
62
|
+
// a parent row to FK-reference. Skipped when no vault-side DB has been
|
|
63
|
+
// supplied (unit-test path) or when dryRun is set (no-write contract).
|
|
64
|
+
const vaultDb = opts.vaultDb;
|
|
65
|
+
const persistRunLedger = vaultDb !== undefined && opts.dryRun !== true;
|
|
66
|
+
if (persistRunLedger) {
|
|
67
|
+
await insertAutomatorRun(vaultDb, {
|
|
68
|
+
id: runId,
|
|
69
|
+
automatorName: opts.automatorName ?? "automator:unknown",
|
|
70
|
+
vaultRid: opts.vaultRid,
|
|
71
|
+
startedAt,
|
|
72
|
+
status: "pending",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Steps 1 + 5 use leases-repo directly. Step 2 + 4 reuse the registered
|
|
76
|
+
// vault ops so the protocol invokes the same code path as an
|
|
77
|
+
// automator-body @STEP that references `std:vault.sync@v1` /
|
|
78
|
+
// `std:vault.commit@v1`. Single source of truth for the git shell.
|
|
79
|
+
const vaultOps = createVaultOps({ ...runtime, vaultPath: opts.vaultPath });
|
|
80
|
+
const vaultSync = vaultOps["vault.sync"];
|
|
81
|
+
const vaultCommit = vaultOps["vault.commit"];
|
|
82
|
+
// Dummy ExecutionContext for the in-protocol direct invocation. Runtime
|
|
83
|
+
// ops only read .args; the other fields aren't touched. Cast through
|
|
84
|
+
// unknown to satisfy the structural contract without inventing a sandbox.
|
|
85
|
+
const dummyCtx = {
|
|
86
|
+
sandboxRoot: opts.vaultPath,
|
|
87
|
+
env: {},
|
|
88
|
+
blocks: {
|
|
89
|
+
get: () => undefined,
|
|
90
|
+
set: () => undefined,
|
|
91
|
+
has: () => false,
|
|
92
|
+
keys: () => [],
|
|
93
|
+
},
|
|
94
|
+
args: {},
|
|
95
|
+
inputs: new Map(),
|
|
96
|
+
signal: new AbortController().signal,
|
|
97
|
+
};
|
|
98
|
+
// ---- Step 1 — acquire lease ----------------------------------------
|
|
99
|
+
const stepAcquire = startStep(ctx, "acquire", runtime.getNow());
|
|
100
|
+
await recordStepStarted(persistRunLedger ? vaultDb : null, runId, stepAcquire, runtime.getNow());
|
|
101
|
+
if (opts.dryRun === true) {
|
|
102
|
+
// Skip — record the step as ok so the trace still shows 5 entries.
|
|
103
|
+
finishStep(stepAcquire, runtime.getNow(), true);
|
|
104
|
+
ctx.status = "lease_acquired";
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
try {
|
|
108
|
+
const lease = await acquireLease(runtime.db, {
|
|
109
|
+
automatorRid: opts.automatorRid,
|
|
110
|
+
vaultRid: opts.vaultRid,
|
|
111
|
+
machineId: runtime.machineId,
|
|
112
|
+
...(opts.ttlMs !== undefined ? { ttlMs: opts.ttlMs } : {}),
|
|
113
|
+
now: runtime.getNow(),
|
|
114
|
+
});
|
|
115
|
+
ctx.leaseId = lease.leaseId;
|
|
116
|
+
finishStep(stepAcquire, runtime.getNow(), true);
|
|
117
|
+
ctx.status = "lease_acquired";
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
121
|
+
finishStep(stepAcquire, runtime.getNow(), false, msg);
|
|
122
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepAcquire, runtime.getNow());
|
|
123
|
+
finalizeContext(ctx, runtime.getNow(), "failed_lease", msg);
|
|
124
|
+
await recordTerminalStatus(persistRunLedger ? vaultDb : null, ctx);
|
|
125
|
+
return { context: ctx, ok: false };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepAcquire, runtime.getNow());
|
|
129
|
+
// ---- Step 2 — vault sync -------------------------------------------
|
|
130
|
+
const stepSync = startStep(ctx, "sync", runtime.getNow());
|
|
131
|
+
await recordStepStarted(persistRunLedger ? vaultDb : null, runId, stepSync, runtime.getNow());
|
|
132
|
+
if (opts.dryRun === true) {
|
|
133
|
+
finishStep(stepSync, runtime.getNow(), true);
|
|
134
|
+
ctx.status = "synced";
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
try {
|
|
138
|
+
await vaultSync(dummyCtx, { vault_path: opts.vaultPath });
|
|
139
|
+
finishStep(stepSync, runtime.getNow(), true);
|
|
140
|
+
ctx.status = "synced";
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
144
|
+
finishStep(stepSync, runtime.getNow(), false, msg);
|
|
145
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepSync, runtime.getNow());
|
|
146
|
+
await releaseOnError(runtime, ctx, "sync_failed");
|
|
147
|
+
finalizeContext(ctx, runtime.getNow(), "failed_sync", msg);
|
|
148
|
+
await recordTerminalStatus(persistRunLedger ? vaultDb : null, ctx);
|
|
149
|
+
return { context: ctx, ok: false };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepSync, runtime.getNow());
|
|
153
|
+
// ---- Step 3 — run body ---------------------------------------------
|
|
154
|
+
const stepBody = startStep(ctx, "body", runtime.getNow());
|
|
155
|
+
await recordStepStarted(persistRunLedger ? vaultDb : null, runId, stepBody, runtime.getNow());
|
|
156
|
+
ctx.status = "body_running";
|
|
157
|
+
try {
|
|
158
|
+
ctx.bodyResult = await opts.runBody(ctx);
|
|
159
|
+
finishStep(stepBody, runtime.getNow(), true);
|
|
160
|
+
ctx.status = "body_completed";
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
164
|
+
finishStep(stepBody, runtime.getNow(), false, msg);
|
|
165
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepBody, runtime.getNow());
|
|
166
|
+
await releaseOnError(runtime, ctx, "body_failed");
|
|
167
|
+
finalizeContext(ctx, runtime.getNow(), "failed_body", msg);
|
|
168
|
+
await recordTerminalStatus(persistRunLedger ? vaultDb : null, ctx);
|
|
169
|
+
return { context: ctx, ok: false };
|
|
170
|
+
}
|
|
171
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepBody, runtime.getNow());
|
|
172
|
+
// ---- Step 4 — vault commit -----------------------------------------
|
|
173
|
+
const stepCommit = startStep(ctx, "commit", runtime.getNow());
|
|
174
|
+
await recordStepStarted(persistRunLedger ? vaultDb : null, runId, stepCommit, runtime.getNow());
|
|
175
|
+
if (opts.dryRun === true) {
|
|
176
|
+
finishStep(stepCommit, runtime.getNow(), true);
|
|
177
|
+
ctx.status = "committed";
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
try {
|
|
181
|
+
const commitArgs = { vault_path: opts.vaultPath };
|
|
182
|
+
if (opts.commitMessage !== undefined)
|
|
183
|
+
commitArgs["message"] = opts.commitMessage;
|
|
184
|
+
if (opts.noPush === true)
|
|
185
|
+
commitArgs["no_push"] = true;
|
|
186
|
+
await vaultCommit(dummyCtx, commitArgs);
|
|
187
|
+
finishStep(stepCommit, runtime.getNow(), true);
|
|
188
|
+
ctx.status = "committed";
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
192
|
+
finishStep(stepCommit, runtime.getNow(), false, msg);
|
|
193
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepCommit, runtime.getNow());
|
|
194
|
+
await releaseOnError(runtime, ctx, "commit_failed");
|
|
195
|
+
finalizeContext(ctx, runtime.getNow(), "failed_commit", msg);
|
|
196
|
+
await recordTerminalStatus(persistRunLedger ? vaultDb : null, ctx);
|
|
197
|
+
return { context: ctx, ok: false };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepCommit, runtime.getNow());
|
|
201
|
+
// ---- Step 5 — release lease ----------------------------------------
|
|
202
|
+
const stepRelease = startStep(ctx, "release", runtime.getNow());
|
|
203
|
+
await recordStepStarted(persistRunLedger ? vaultDb : null, runId, stepRelease, runtime.getNow());
|
|
204
|
+
if (opts.dryRun === true || ctx.leaseId === null) {
|
|
205
|
+
finishStep(stepRelease, runtime.getNow(), true);
|
|
206
|
+
finalizeContext(ctx, runtime.getNow(), "completed");
|
|
207
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepRelease, runtime.getNow());
|
|
208
|
+
await recordTerminalStatus(persistRunLedger ? vaultDb : null, ctx);
|
|
209
|
+
return { context: ctx, ok: true };
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
await releaseLease(runtime.db, {
|
|
213
|
+
leaseId: ctx.leaseId,
|
|
214
|
+
reason: "completed",
|
|
215
|
+
now: runtime.getNow(),
|
|
216
|
+
});
|
|
217
|
+
finishStep(stepRelease, runtime.getNow(), true);
|
|
218
|
+
finalizeContext(ctx, runtime.getNow(), "completed");
|
|
219
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepRelease, runtime.getNow());
|
|
220
|
+
await recordTerminalStatus(persistRunLedger ? vaultDb : null, ctx);
|
|
221
|
+
return { context: ctx, ok: true };
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
// Release failure is non-fatal — the auto-expiry sweep on the next
|
|
225
|
+
// acquireLease() call collects the orphan. Surface the error but
|
|
226
|
+
// declare the run completed (body + commit succeeded).
|
|
227
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
228
|
+
finishStep(stepRelease, runtime.getNow(), false, msg);
|
|
229
|
+
await recordStepFinished(persistRunLedger ? vaultDb : null, runId, stepRelease, runtime.getNow());
|
|
230
|
+
finalizeContext(ctx, runtime.getNow(), "failed_release", msg);
|
|
231
|
+
await recordTerminalStatus(persistRunLedger ? vaultDb : null, ctx);
|
|
232
|
+
return { context: ctx, ok: false };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Block-B Commit 5 — per-vault automator_runs ledger helpers. All three
|
|
237
|
+
// are no-ops when `vaultDb` is null (no per-vault DB supplied, or dryRun).
|
|
238
|
+
// Each catches its own errors and logs to stderr rather than propagating
|
|
239
|
+
// — the goal is observability, not blocking the protocol path on a logged
|
|
240
|
+
// event write failure. The five-step contract surface (lease + git + body)
|
|
241
|
+
// already drives the user-visible status.
|
|
242
|
+
// ---------------------------------------------------------------------------
|
|
243
|
+
async function recordStepStarted(vaultDb, runId, step, ts) {
|
|
244
|
+
if (vaultDb === null)
|
|
245
|
+
return;
|
|
246
|
+
try {
|
|
247
|
+
await insertAutomatorRunEvent(vaultDb, {
|
|
248
|
+
id: newUuidv7Bytes(),
|
|
249
|
+
runId,
|
|
250
|
+
ts,
|
|
251
|
+
level: "info",
|
|
252
|
+
message: `step.${step.step}.started`,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
// eslint-disable-next-line no-console
|
|
257
|
+
console.warn(`runFiveStep: recordStepStarted(${step.step}) failed`, err instanceof Error ? err.message : err);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async function recordStepFinished(vaultDb, runId, step, ts) {
|
|
261
|
+
if (vaultDb === null)
|
|
262
|
+
return;
|
|
263
|
+
try {
|
|
264
|
+
const outcome = step.ok === true ? "completed" : "failed";
|
|
265
|
+
await insertAutomatorRunEvent(vaultDb, {
|
|
266
|
+
id: newUuidv7Bytes(),
|
|
267
|
+
runId,
|
|
268
|
+
ts,
|
|
269
|
+
level: step.ok === true ? "info" : "error",
|
|
270
|
+
message: `step.${step.step}.${outcome}`,
|
|
271
|
+
data: {
|
|
272
|
+
duration_ms: step.durationMs ?? 0,
|
|
273
|
+
...(step.errorSummary !== null ? { error: step.errorSummary } : {}),
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
// eslint-disable-next-line no-console
|
|
279
|
+
console.warn(`runFiveStep: recordStepFinished(${step.step}) failed`, err instanceof Error ? err.message : err);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
async function recordTerminalStatus(vaultDb, ctx) {
|
|
283
|
+
if (vaultDb === null)
|
|
284
|
+
return;
|
|
285
|
+
try {
|
|
286
|
+
await updateAutomatorRunStatus(vaultDb, {
|
|
287
|
+
id: ctx.runId,
|
|
288
|
+
status: ctx.status,
|
|
289
|
+
...(ctx.endedAt !== null ? { endedAt: ctx.endedAt } : {}),
|
|
290
|
+
...(ctx.errorSummary !== null ? { errorSummary: ctx.errorSummary } : {}),
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
// eslint-disable-next-line no-console
|
|
295
|
+
console.warn("runFiveStep: recordTerminalStatus failed", err instanceof Error ? err.message : err);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async function releaseOnError(runtime, ctx, reason) {
|
|
299
|
+
if (runtime.db === undefined || ctx.leaseId === null)
|
|
300
|
+
return;
|
|
301
|
+
try {
|
|
302
|
+
await releaseLease(runtime.db, {
|
|
303
|
+
leaseId: ctx.leaseId,
|
|
304
|
+
reason,
|
|
305
|
+
now: runtime.getNow(),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
// Best-effort cleanup; the auto-expiry sweep is the safety net.
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=five-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"five-step.js","sourceRoot":"","sources":["../../src/protocol/five-step.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type LytRunStatus = "pending" | "lease_acquired" | "synced" | "body_running" | "body_completed" | "committed" | "completed" | "failed_lease" | "failed_sync" | "failed_body" | "failed_commit" | "failed_release";
|
|
2
|
+
export interface LytRunStepTiming {
|
|
3
|
+
step: "acquire" | "sync" | "body" | "commit" | "release";
|
|
4
|
+
startedAt: number;
|
|
5
|
+
endedAt: number | null;
|
|
6
|
+
durationMs: number | null;
|
|
7
|
+
ok: boolean | null;
|
|
8
|
+
errorSummary: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface LytRunContext {
|
|
11
|
+
runId: Uint8Array;
|
|
12
|
+
automatorRid: Uint8Array;
|
|
13
|
+
vaultRid: Uint8Array;
|
|
14
|
+
vaultPath: string;
|
|
15
|
+
machineId: string;
|
|
16
|
+
leaseId: Uint8Array | null;
|
|
17
|
+
startedAt: number;
|
|
18
|
+
endedAt: number | null;
|
|
19
|
+
status: LytRunStatus;
|
|
20
|
+
steps: LytRunStepTiming[];
|
|
21
|
+
errorSummary: string | null;
|
|
22
|
+
bodyResult: unknown;
|
|
23
|
+
}
|
|
24
|
+
export declare function createRunContext(args: {
|
|
25
|
+
runId: Uint8Array;
|
|
26
|
+
automatorRid: Uint8Array;
|
|
27
|
+
vaultRid: Uint8Array;
|
|
28
|
+
vaultPath: string;
|
|
29
|
+
machineId: string;
|
|
30
|
+
startedAt: number;
|
|
31
|
+
}): LytRunContext;
|
|
32
|
+
export declare function startStep(ctx: LytRunContext, step: LytRunStepTiming["step"], now: number): LytRunStepTiming;
|
|
33
|
+
export declare function finishStep(timing: LytRunStepTiming, now: number, ok: boolean, errorSummary?: string | null): void;
|
|
34
|
+
export declare function finalizeContext(ctx: LytRunContext, now: number, status: LytRunStatus, errorSummary?: string | null): void;
|
|
35
|
+
//# sourceMappingURL=run-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-context.d.ts","sourceRoot":"","sources":["../../src/protocol/run-context.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,gBAAgB,GAChB,QAAQ,GACR,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,WAAW,GACX,cAAc,GACd,aAAa,GACb,aAAa,GACb,eAAe,GACf,gBAAgB,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,UAAU,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAI5B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,UAAU,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,aAAa,CAehB;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAC9B,GAAG,EAAE,MAAM,GACV,gBAAgB,CAWlB;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,OAAO,EACX,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,IAAI,CAKN;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EACpB,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,IAAI,CAIN"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export function createRunContext(args) {
|
|
17
|
+
return {
|
|
18
|
+
runId: args.runId,
|
|
19
|
+
automatorRid: args.automatorRid,
|
|
20
|
+
vaultRid: args.vaultRid,
|
|
21
|
+
vaultPath: args.vaultPath,
|
|
22
|
+
machineId: args.machineId,
|
|
23
|
+
leaseId: null,
|
|
24
|
+
startedAt: args.startedAt,
|
|
25
|
+
endedAt: null,
|
|
26
|
+
status: "pending",
|
|
27
|
+
steps: [],
|
|
28
|
+
errorSummary: null,
|
|
29
|
+
bodyResult: undefined,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function startStep(ctx, step, now) {
|
|
33
|
+
const timing = {
|
|
34
|
+
step,
|
|
35
|
+
startedAt: now,
|
|
36
|
+
endedAt: null,
|
|
37
|
+
durationMs: null,
|
|
38
|
+
ok: null,
|
|
39
|
+
errorSummary: null,
|
|
40
|
+
};
|
|
41
|
+
ctx.steps.push(timing);
|
|
42
|
+
return timing;
|
|
43
|
+
}
|
|
44
|
+
export function finishStep(timing, now, ok, errorSummary = null) {
|
|
45
|
+
timing.endedAt = now;
|
|
46
|
+
timing.durationMs = Math.max(0, now - timing.startedAt);
|
|
47
|
+
timing.ok = ok;
|
|
48
|
+
timing.errorSummary = errorSummary;
|
|
49
|
+
}
|
|
50
|
+
export function finalizeContext(ctx, now, status, errorSummary = null) {
|
|
51
|
+
ctx.endedAt = now;
|
|
52
|
+
ctx.status = status;
|
|
53
|
+
if (errorSummary !== null)
|
|
54
|
+
ctx.errorSummary = errorSummary;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=run-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-context.js","sourceRoot":"","sources":["../../src/protocol/run-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA4DH,MAAM,UAAU,gBAAgB,CAAC,IAOhC;IACC,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,GAAkB,EAClB,IAA8B,EAC9B,GAAW;IAEX,MAAM,MAAM,GAAqB;QAC/B,IAAI;QACJ,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,EAAE,EAAE,IAAI;QACR,YAAY,EAAE,IAAI;KACnB,CAAC;IACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,MAAwB,EACxB,GAAW,EACX,EAAW,EACX,eAA8B,IAAI;IAElC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAkB,EAClB,GAAW,EACX,MAAoB,EACpB,eAA8B,IAAI;IAElC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC;IAClB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,YAAY,KAAK,IAAI;QAAE,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Client } from "@libsql/client";
|
|
2
|
+
import type { LlmGateway } from "@younndai/lyt-llm";
|
|
3
|
+
export interface LytRuntime {
|
|
4
|
+
db: Client | undefined;
|
|
5
|
+
vaultPath: string | undefined;
|
|
6
|
+
machineId: string;
|
|
7
|
+
llmGateway: LlmGateway | undefined;
|
|
8
|
+
getNow: () => number;
|
|
9
|
+
}
|
|
10
|
+
export interface LytRuntimeConfig {
|
|
11
|
+
db?: Client;
|
|
12
|
+
vaultPath?: string;
|
|
13
|
+
machineId: string;
|
|
14
|
+
llmGateway?: LlmGateway;
|
|
15
|
+
getNow?: () => number;
|
|
16
|
+
}
|
|
17
|
+
export declare function createLytRuntime(config: LytRuntimeConfig): LytRuntime;
|
|
18
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IAGxB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAWrE"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export function createLytRuntime(config) {
|
|
17
|
+
if (typeof config.machineId !== "string" || config.machineId.length === 0) {
|
|
18
|
+
throw new Error("createLytRuntime: machineId is required and must be non-empty");
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
db: config.db,
|
|
22
|
+
vaultPath: config.vaultPath,
|
|
23
|
+
machineId: config.machineId,
|
|
24
|
+
llmGateway: config.llmGateway,
|
|
25
|
+
getNow: config.getNow ?? (() => Date.now()),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA6CH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@younndai/lyt-runner",
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "Lyt automation runner — a thin layer on @younndai/yon-runner that expands declarative @AUTOMATOR + @DIRECTIVE records into core YON before execution and registers the vault-aware std:vault.* + std:mesh.* + std:lease.* ops.",
|
|
5
|
+
"homepage": "https://linkyourthink.com",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/younndai/lyt",
|
|
9
|
+
"directory": "packages/lyt-runner"
|
|
10
|
+
},
|
|
11
|
+
"author": {
|
|
12
|
+
"name": "MARLINK TRADING SRL (YounndAI)",
|
|
13
|
+
"url": "https://younndai.com"
|
|
14
|
+
},
|
|
15
|
+
"contributors": [
|
|
16
|
+
{
|
|
17
|
+
"name": "Alexandru Mareș",
|
|
18
|
+
"url": "https://allemaar.com"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"license": "Apache-2.0",
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=20.9",
|
|
24
|
+
"npm": ">=10"
|
|
25
|
+
},
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"README.md",
|
|
38
|
+
"LICENSE",
|
|
39
|
+
"NOTICE"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"typecheck": "tsc --noEmit",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"test:watch": "vitest",
|
|
46
|
+
"clean": "rimraf --glob dist .turbo *.tsbuildinfo",
|
|
47
|
+
"prepack": "npm run clean && npm run build",
|
|
48
|
+
"prepublishOnly": "node ../../scripts/check-no-vendored-deps.mjs --root ../.."
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@younndai/yon-runner": "^2.0.0",
|
|
52
|
+
"@younndai/yon-parser": "^2.0.0",
|
|
53
|
+
"@younndai/lyt-vault": "^0.9.0",
|
|
54
|
+
"@younndai/lyt-llm": "^0.9.0",
|
|
55
|
+
"@libsql/client": "^0.15.15"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@lyt/typescript-config": "*",
|
|
59
|
+
"@types/node": "^22.10.5",
|
|
60
|
+
"rimraf": "*",
|
|
61
|
+
"typescript": "*",
|
|
62
|
+
"vitest": "*"
|
|
63
|
+
},
|
|
64
|
+
"publishConfig": {
|
|
65
|
+
"access": "public"
|
|
66
|
+
},
|
|
67
|
+
"keywords": [
|
|
68
|
+
"lyt",
|
|
69
|
+
"runner",
|
|
70
|
+
"yon",
|
|
71
|
+
"automator",
|
|
72
|
+
"younndai"
|
|
73
|
+
]
|
|
74
|
+
}
|