@h-rig/run-plugin 0.0.6-alpha.186

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 (70) hide show
  1. package/README.md +1 -0
  2. package/dist/src/plugin.d.ts +4 -0
  3. package/dist/src/plugin.js +4319 -0
  4. package/dist/src/read-model/inspect-command.d.ts +19 -0
  5. package/dist/src/read-model/inspect-command.js +341 -0
  6. package/dist/src/read-model/plugin.d.ts +4 -0
  7. package/dist/src/read-model/plugin.js +2550 -0
  8. package/dist/src/read-model/read-model-backend/diagnostics.d.ts +9 -0
  9. package/dist/src/read-model/read-model-backend/diagnostics.js +51 -0
  10. package/dist/src/read-model/read-model-backend/guard.d.ts +4 -0
  11. package/dist/src/read-model/read-model-backend/guard.js +25 -0
  12. package/dist/src/read-model/read-model-backend/inbox.d.ts +23 -0
  13. package/dist/src/read-model/read-model-backend/inbox.js +669 -0
  14. package/dist/src/read-model/read-model-backend/index.d.ts +8 -0
  15. package/dist/src/read-model/read-model-backend/index.js +1163 -0
  16. package/dist/src/read-model/read-model-backend/inspect.d.ts +26 -0
  17. package/dist/src/read-model/read-model-backend/inspect.js +770 -0
  18. package/dist/src/read-model/read-model-backend/projection.d.ts +39 -0
  19. package/dist/src/read-model/read-model-backend/projection.js +669 -0
  20. package/dist/src/read-model/read-model-backend/run-status.d.ts +27 -0
  21. package/dist/src/read-model/read-model-backend/run-status.js +237 -0
  22. package/dist/src/read-model/read-model-backend/stats.d.ts +12 -0
  23. package/dist/src/read-model/read-model-backend/stats.js +800 -0
  24. package/dist/src/read-model/read-model-service.d.ts +2 -0
  25. package/dist/src/read-model/read-model-service.js +1725 -0
  26. package/dist/src/read-model/reconcile.d.ts +23 -0
  27. package/dist/src/read-model/reconcile.js +306 -0
  28. package/dist/src/read-model/run-format.d.ts +23 -0
  29. package/dist/src/read-model/run-format.js +202 -0
  30. package/dist/src/read-model/runs-screen.d.ts +14 -0
  31. package/dist/src/read-model/runs-screen.js +217 -0
  32. package/dist/src/read-model/session-journal.d.ts +26 -0
  33. package/dist/src/read-model/session-journal.js +355 -0
  34. package/dist/src/read-model/stats-command.d.ts +16 -0
  35. package/dist/src/read-model/stats-command.js +88 -0
  36. package/dist/src/read-model/stats-format.d.ts +1 -0
  37. package/dist/src/read-model/stats-format.js +8 -0
  38. package/dist/src/worker/autohost.d.ts +11 -0
  39. package/dist/src/worker/autohost.js +858 -0
  40. package/dist/src/worker/constants.d.ts +3 -0
  41. package/dist/src/worker/constants.js +10 -0
  42. package/dist/src/worker/extension.d.ts +14 -0
  43. package/dist/src/worker/extension.js +881 -0
  44. package/dist/src/worker/host.d.ts +1 -0
  45. package/dist/src/worker/host.js +1 -0
  46. package/dist/src/worker/inbox-command.d.ts +23 -0
  47. package/dist/src/worker/inbox-command.js +163 -0
  48. package/dist/src/worker/index.d.ts +2 -0
  49. package/dist/src/worker/index.js +1767 -0
  50. package/dist/src/worker/local-run-changes.d.ts +3 -0
  51. package/dist/src/worker/local-run-changes.js +65 -0
  52. package/dist/src/worker/notifications.d.ts +1 -0
  53. package/dist/src/worker/notifications.js +27 -0
  54. package/dist/src/worker/notify-cap.d.ts +11 -0
  55. package/dist/src/worker/notify-cap.js +13 -0
  56. package/dist/src/worker/panel-plugin.d.ts +11 -0
  57. package/dist/src/worker/panel-plugin.js +37 -0
  58. package/dist/src/worker/plugin.d.ts +3 -0
  59. package/dist/src/worker/plugin.js +1761 -0
  60. package/dist/src/worker/run-control-service.d.ts +2 -0
  61. package/dist/src/worker/run-control-service.js +210 -0
  62. package/dist/src/worker/session-journal-writer.d.ts +4 -0
  63. package/dist/src/worker/session-journal-writer.js +184 -0
  64. package/dist/src/worker/stall.d.ts +21 -0
  65. package/dist/src/worker/stall.js +55 -0
  66. package/dist/src/worker/utils.d.ts +21 -0
  67. package/dist/src/worker/utils.js +29 -0
  68. package/dist/src/worker/workflow-journal-writer.d.ts +7 -0
  69. package/dist/src/worker/workflow-journal-writer.js +76 -0
  70. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ // @bun
@@ -0,0 +1,23 @@
1
+ import type { CommandOutcome, RunInboxResolutionInit, RunInboxResolutionResult, RunReadModelInboxRecord } from "@rig/contracts";
2
+ import type { RuntimeCliContext } from "@rig/core/config";
3
+ export type InboxKind = "approvals" | "inputs";
4
+ export type InboxRecord = RunReadModelInboxRecord;
5
+ export interface InboxFilters {
6
+ readonly run?: string;
7
+ readonly task?: string;
8
+ }
9
+ export interface InboxDeps {
10
+ readonly listInbox?: (projectRoot: string, kind: InboxKind, filters: InboxFilters) => Promise<readonly InboxRecord[]>;
11
+ readonly getInboxCounts?: (projectRoot: string) => Promise<{
12
+ readonly approvals: number;
13
+ readonly inputs: number;
14
+ } | null>;
15
+ readonly resolveInboxRequest?: (projectRoot: string, runId: string, resolution: RunInboxResolutionInit) => Promise<RunInboxResolutionResult>;
16
+ }
17
+ export declare function listInboxRecords(context: Pick<RuntimeCliContext, "projectRoot">, kind: InboxKind, filters?: InboxFilters, deps?: InboxDeps): Promise<readonly InboxRecord[]>;
18
+ export declare function listInbox(context: Pick<RuntimeCliContext, "projectRoot">, kind: InboxKind, filters?: InboxFilters, deps?: InboxDeps): Promise<readonly InboxRecord[]>;
19
+ export declare function readPendingInboxCounts(context: Pick<RuntimeCliContext, "projectRoot">, deps?: InboxDeps): Promise<{
20
+ approvals: number;
21
+ inputs: number;
22
+ } | null>;
23
+ export declare function executeInbox(context: RuntimeCliContext, args: string[], deps?: InboxDeps): Promise<CommandOutcome>;
@@ -0,0 +1,163 @@
1
+ // @bun
2
+ // packages/run-plugin/src/worker/inbox-command.ts
3
+ import { RUN_CONTROL, RUN_READ_MODEL } from "@rig/contracts";
4
+ import { defineCapability } from "@rig/core/capability";
5
+ import { requireCapabilityForRoot } from "@rig/core/capability-loaders";
6
+ import { CliError, requireNoExtraArgs, takeOption } from "@rig/std-shared/cli-args";
7
+ import { printFormattedOutput } from "@rig/std-shared/cli-format";
8
+ var RunControlCap = defineCapability(RUN_CONTROL);
9
+ var RunReadModelCap = defineCapability(RUN_READ_MODEL);
10
+ async function loadRunControl(projectRoot) {
11
+ return requireCapabilityForRoot(projectRoot, RunControlCap, "RUN_CONTROL capability unavailable for this project root: load @rig/run-plugin (standard bundle).");
12
+ }
13
+ async function loadRunReadModel(projectRoot) {
14
+ return requireCapabilityForRoot(projectRoot, RunReadModelCap, "RUN_READ_MODEL capability unavailable for this project root: load @rig/run-plugin (standard bundle).");
15
+ }
16
+ function readModelKind(kind) {
17
+ return kind === "approvals" ? "approval" : "input";
18
+ }
19
+ async function listInboxRecords(context, kind, filters = {}, deps = {}) {
20
+ if (deps.listInbox)
21
+ return deps.listInbox(context.projectRoot, kind, filters);
22
+ const readModel = await loadRunReadModel(context.projectRoot);
23
+ return readModel.listInboxRecords({
24
+ projectRoot: context.projectRoot,
25
+ kind: readModelKind(kind),
26
+ ...filters.run ? { runId: filters.run } : {},
27
+ ...filters.task ? { taskId: filters.task } : {}
28
+ });
29
+ }
30
+ async function listInbox(context, kind, filters = {}, deps = {}) {
31
+ return listInboxRecords(context, kind, filters, deps);
32
+ }
33
+ async function readPendingInboxCounts(context, deps = {}) {
34
+ if (deps.getInboxCounts)
35
+ return deps.getInboxCounts(context.projectRoot);
36
+ try {
37
+ const counts = await (await loadRunReadModel(context.projectRoot)).getInboxCounts({ projectRoot: context.projectRoot, kind: "all" });
38
+ return { approvals: counts.approvals, inputs: counts.inputs };
39
+ } catch {
40
+ return null;
41
+ }
42
+ }
43
+ function resolutionAttachError(runId, verb, error) {
44
+ const target = runId ?? "<run-id>";
45
+ const detail = error instanceof Error ? error.message : String(error);
46
+ throw new CliError(`rig inbox ${verb} could not deliver a resolution from this one-shot command.`, 2, {
47
+ hint: `${detail}
48
+ Attach to resolve interactively: rig run attach ${target}`
49
+ });
50
+ }
51
+ async function readInboxSnapshot(context, filters, deps) {
52
+ const [approvals, inputs] = await Promise.all([
53
+ listInbox(context, "approvals", filters, deps),
54
+ listInbox(context, "inputs", filters, deps)
55
+ ]);
56
+ return { approvals, inputs };
57
+ }
58
+ function renderInboxSnapshot(readModel, snapshot) {
59
+ console.clear();
60
+ console.log(`rig inbox \u2014 watching (Ctrl-C to stop) \u2014 ${new Date().toLocaleTimeString()}`);
61
+ printFormattedOutput(readModel.formatInboxList("approvals", snapshot.approvals.map((entry) => ({ ...entry }))));
62
+ printFormattedOutput(readModel.formatInboxList("inputs", snapshot.inputs.map((entry) => ({ ...entry }))));
63
+ if (snapshot.approvals.length === 0 && snapshot.inputs.length === 0)
64
+ console.log("Nothing pending.");
65
+ }
66
+ function sleep(ms) {
67
+ const { promise, resolve } = Promise.withResolvers();
68
+ setTimeout(resolve, ms);
69
+ return promise;
70
+ }
71
+ async function watchInbox(context, filters, deps) {
72
+ const snapshot = await readInboxSnapshot(context, filters, deps);
73
+ if (context.outputMode !== "text")
74
+ return { ok: true, group: "inbox", command: "watch", details: snapshot };
75
+ const readModel = await loadRunReadModel(context.projectRoot);
76
+ renderInboxSnapshot(readModel, snapshot);
77
+ while (true) {
78
+ await sleep(500);
79
+ renderInboxSnapshot(readModel, await readInboxSnapshot(context, filters, deps));
80
+ }
81
+ }
82
+ async function deliverInboxResolution(context, runId, resolution, deps) {
83
+ const result = deps.resolveInboxRequest ? await deps.resolveInboxRequest(context.projectRoot, runId, resolution) : await (await loadRunControl(context.projectRoot)).resolveInboxRequest({ projectRoot: context.projectRoot, runId, resolution });
84
+ if (!result.delivered)
85
+ throw new Error(result.detail ?? `Inbox request ${resolution.requestId} was not delivered.`);
86
+ return result;
87
+ }
88
+ async function executeInbox(context, args, deps = {}) {
89
+ const [command = "approvals", ...rest] = args;
90
+ const text = context.outputMode === "text";
91
+ switch (command) {
92
+ case "approvals":
93
+ case "inputs": {
94
+ const run = takeOption(rest, "--run");
95
+ const task = takeOption(run.rest, "--task");
96
+ requireNoExtraArgs(task.rest, `rig inbox ${command} [--run <id>] [--task <id>]`);
97
+ const kind = command === "approvals" ? "approvals" : "inputs";
98
+ const filters = { ...run.value ? { run: run.value } : {}, ...task.value ? { task: task.value } : {} };
99
+ const entries = await listInbox(context, kind, filters, deps);
100
+ if (text) {
101
+ const readModel = await loadRunReadModel(context.projectRoot);
102
+ printFormattedOutput(readModel.formatInboxList(kind, entries.map((entry) => ({ ...entry }))));
103
+ }
104
+ return { ok: true, group: "inbox", command, details: { entries } };
105
+ }
106
+ case "approve": {
107
+ const run = takeOption(rest, "--run");
108
+ const request = takeOption(run.rest, "--request");
109
+ const decision = takeOption(request.rest, "--decision");
110
+ requireNoExtraArgs(decision.rest, "rig inbox approve --run <id> --request <id> --decision approve|reject");
111
+ if (!run.value || !request.value)
112
+ throw new CliError("rig inbox approve requires --run and --request.", 2);
113
+ const rawDecision = (decision.value ?? "approve").trim().toLowerCase();
114
+ if (rawDecision !== "approve" && rawDecision !== "approved" && rawDecision !== "reject" && rawDecision !== "rejected")
115
+ throw new CliError("--decision must be approve or reject.", 2);
116
+ const normalizedDecision = rawDecision === "approved" ? "approve" : rawDecision === "rejected" ? "reject" : rawDecision;
117
+ try {
118
+ await deliverInboxResolution(context, run.value, { kind: "approval", requestId: request.value, decision: normalizedDecision }, deps);
119
+ } catch (error) {
120
+ resolutionAttachError(run.value, "approve", error);
121
+ }
122
+ if (text)
123
+ printFormattedOutput(`Resolved approval ${request.value} for run ${run.value}.`);
124
+ return { ok: true, group: "inbox", command, details: { runId: run.value, requestId: request.value, decision: normalizedDecision } };
125
+ }
126
+ case "respond":
127
+ case "answer": {
128
+ const run = takeOption(rest, "--run");
129
+ const request = takeOption(run.rest, "--request");
130
+ const textResult = takeOption(request.rest, "--text");
131
+ const answerResult = takeOption(textResult.rest, "--answer");
132
+ requireNoExtraArgs(answerResult.rest, `rig inbox ${command} --run <id> --request <id> (--text|--answer) <answer>`);
133
+ if (textResult.value && answerResult.value)
134
+ throw new CliError("Pass only one of --text or --answer.", 2);
135
+ const answer = textResult.value ?? answerResult.value;
136
+ if (!run.value || !request.value || !answer)
137
+ resolutionAttachError(run.value, "respond", new Error(`rig inbox ${command} requires --run, --request, and --text/--answer.`));
138
+ try {
139
+ await deliverInboxResolution(context, run.value, { kind: "input", requestId: request.value, answers: { answer } }, deps);
140
+ } catch (error) {
141
+ resolutionAttachError(run.value, "respond", error);
142
+ }
143
+ if (text)
144
+ printFormattedOutput(`Sent response ${request.value} for run ${run.value}.`);
145
+ return { ok: true, group: "inbox", command, details: { runId: run.value, requestId: request.value, responded: true } };
146
+ }
147
+ case "watch": {
148
+ const run = takeOption(rest, "--run");
149
+ const task = takeOption(run.rest, "--task");
150
+ requireNoExtraArgs(task.rest, "rig inbox watch [--run <id>] [--task <id>]");
151
+ const filters = { ...run.value ? { run: run.value } : {}, ...task.value ? { task: task.value } : {} };
152
+ return watchInbox(context, filters, deps);
153
+ }
154
+ default:
155
+ throw new CliError(`Unknown inbox command: ${command}`, 1, { hint: "Run `rig inbox --help` to list inbox commands." });
156
+ }
157
+ }
158
+ export {
159
+ readPendingInboxCounts,
160
+ listInboxRecords,
161
+ listInbox,
162
+ executeInbox
163
+ };
@@ -0,0 +1,2 @@
1
+ export { default, __rigExtensionTest, __rigRunWorkerTest } from "./extension";
2
+ export * from "./plugin";