@bragi-gmbh/codebus 1.4.0 → 1.6.1

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 (146) hide show
  1. package/dist/ci-hooks/ci-hooks.js +126 -0
  2. package/dist/ci-hooks/ci-hooks.js.map +1 -0
  3. package/dist/commands/adr.js +30 -0
  4. package/dist/commands/adr.js.map +1 -0
  5. package/dist/commands/agent.js +175 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/as.js +1 -1
  8. package/dist/commands/as.js.map +1 -1
  9. package/dist/commands/ask.js +1 -1
  10. package/dist/commands/ask.js.map +1 -1
  11. package/dist/commands/checkin.js +1 -1
  12. package/dist/commands/checkin.js.map +1 -1
  13. package/dist/commands/ci-findings.js +129 -0
  14. package/dist/commands/ci-findings.js.map +1 -0
  15. package/dist/commands/ci-reply.js +117 -0
  16. package/dist/commands/ci-reply.js.map +1 -0
  17. package/dist/commands/ci-steer-escalate.js +65 -0
  18. package/dist/commands/ci-steer-escalate.js.map +1 -0
  19. package/dist/commands/cli-mcp-correlation.js +131 -0
  20. package/dist/commands/cli-mcp-correlation.js.map +1 -0
  21. package/dist/commands/connector-attach-detach.js +542 -0
  22. package/dist/commands/connector-attach-detach.js.map +1 -0
  23. package/dist/commands/connector.js +513 -0
  24. package/dist/commands/connector.js.map +1 -0
  25. package/dist/commands/contract.js +33 -0
  26. package/dist/commands/contract.js.map +1 -0
  27. package/dist/commands/correlation.js +194 -0
  28. package/dist/commands/correlation.js.map +1 -0
  29. package/dist/commands/decision.js +63 -0
  30. package/dist/commands/decision.js.map +1 -1
  31. package/dist/commands/digest.js +14 -3
  32. package/dist/commands/digest.js.map +1 -1
  33. package/dist/commands/do.js +127 -0
  34. package/dist/commands/do.js.map +1 -0
  35. package/dist/commands/factory-attention.js +106 -0
  36. package/dist/commands/factory-attention.js.map +1 -0
  37. package/dist/commands/factory-context-read.js +171 -0
  38. package/dist/commands/factory-context-read.js.map +1 -0
  39. package/dist/commands/factory-interventions.js +102 -0
  40. package/dist/commands/factory-interventions.js.map +1 -0
  41. package/dist/commands/factory.js +187 -0
  42. package/dist/commands/factory.js.map +1 -1
  43. package/dist/commands/github-login.js +109 -53
  44. package/dist/commands/github-login.js.map +1 -1
  45. package/dist/commands/graph-pull.js +130 -0
  46. package/dist/commands/graph-pull.js.map +1 -0
  47. package/dist/commands/graph.js +5 -1
  48. package/dist/commands/graph.js.map +1 -1
  49. package/dist/commands/inbox.js +7 -7
  50. package/dist/commands/inbox.js.map +1 -1
  51. package/dist/commands/ingest.js +1 -1
  52. package/dist/commands/ingest.js.map +1 -1
  53. package/dist/commands/init.js +10 -1
  54. package/dist/commands/init.js.map +1 -1
  55. package/dist/commands/install.js +1160 -55
  56. package/dist/commands/install.js.map +1 -1
  57. package/dist/commands/integration-ledger.js +81 -0
  58. package/dist/commands/integration-ledger.js.map +1 -0
  59. package/dist/commands/knowledge.js +194 -0
  60. package/dist/commands/knowledge.js.map +1 -0
  61. package/dist/commands/links.js +1 -1
  62. package/dist/commands/links.js.map +1 -1
  63. package/dist/commands/login.js +1 -1
  64. package/dist/commands/login.js.map +1 -1
  65. package/dist/commands/morning.js +50 -1
  66. package/dist/commands/morning.js.map +1 -1
  67. package/dist/commands/plan-compiler.js +260 -0
  68. package/dist/commands/plan-compiler.js.map +1 -0
  69. package/dist/commands/plan-lint.js +275 -0
  70. package/dist/commands/plan-lint.js.map +1 -0
  71. package/dist/commands/plan-score.js +203 -0
  72. package/dist/commands/plan-score.js.map +1 -0
  73. package/dist/commands/plan.js +481 -15
  74. package/dist/commands/plan.js.map +1 -1
  75. package/dist/commands/product-validity.js +168 -0
  76. package/dist/commands/product-validity.js.map +1 -0
  77. package/dist/commands/question.js +1 -1
  78. package/dist/commands/question.js.map +1 -1
  79. package/dist/commands/read-policy.js +131 -0
  80. package/dist/commands/read-policy.js.map +1 -0
  81. package/dist/commands/read.js +1 -1
  82. package/dist/commands/read.js.map +1 -1
  83. package/dist/commands/repo.js +106 -8
  84. package/dist/commands/repo.js.map +1 -1
  85. package/dist/commands/repository-protection.js +209 -0
  86. package/dist/commands/repository-protection.js.map +1 -0
  87. package/dist/commands/resolve.js +2 -2
  88. package/dist/commands/resolve.js.map +1 -1
  89. package/dist/commands/self-healing.js +26 -0
  90. package/dist/commands/self-healing.js.map +1 -0
  91. package/dist/commands/send.js +1 -1
  92. package/dist/commands/send.js.map +1 -1
  93. package/dist/commands/serial-merge.js +303 -0
  94. package/dist/commands/serial-merge.js.map +1 -0
  95. package/dist/commands/session.js +1 -1
  96. package/dist/commands/session.js.map +1 -1
  97. package/dist/commands/spend.js +31 -0
  98. package/dist/commands/spend.js.map +1 -0
  99. package/dist/commands/task.js +92 -1
  100. package/dist/commands/task.js.map +1 -1
  101. package/dist/commands/taxonomy.js +21 -0
  102. package/dist/commands/taxonomy.js.map +1 -0
  103. package/dist/commands/verify.js +77 -0
  104. package/dist/commands/verify.js.map +1 -0
  105. package/dist/config/self-healing-analysis.json +158 -0
  106. package/dist/errors.js +18 -4
  107. package/dist/errors.js.map +1 -1
  108. package/dist/execution/client.js +53 -0
  109. package/dist/execution/client.js.map +1 -0
  110. package/dist/execution/local.js +24 -0
  111. package/dist/execution/local.js.map +1 -0
  112. package/dist/execution/ssh.js +38 -0
  113. package/dist/execution/ssh.js.map +1 -0
  114. package/dist/graph.js +78 -16
  115. package/dist/graph.js.map +1 -1
  116. package/dist/index.js +40 -2
  117. package/dist/index.js.map +1 -1
  118. package/dist/json-lite.js +248 -0
  119. package/dist/json-lite.js.map +1 -0
  120. package/dist/knowledge-drift.js +40 -0
  121. package/dist/knowledge-drift.js.map +1 -0
  122. package/dist/lint/parallelism.js +414 -0
  123. package/dist/lint/parallelism.js.map +1 -0
  124. package/dist/mail-latency.js +11 -1
  125. package/dist/mail-latency.js.map +1 -1
  126. package/dist/mcp-ci-findings.js +31 -0
  127. package/dist/mcp-ci-findings.js.map +1 -0
  128. package/dist/mcp-correlation.js +290 -0
  129. package/dist/mcp-correlation.js.map +1 -0
  130. package/dist/mcp-factory-context-read.js +81 -0
  131. package/dist/mcp-factory-context-read.js.map +1 -0
  132. package/dist/mcp-registry.js +147 -1
  133. package/dist/mcp-registry.js.map +1 -1
  134. package/dist/mcp.js +94 -5
  135. package/dist/mcp.js.map +1 -1
  136. package/dist/openrouter-reservation-guard.js +97 -0
  137. package/dist/openrouter-reservation-guard.js.map +1 -0
  138. package/dist/self-healing-analysis-loader.js +150 -0
  139. package/dist/self-healing-analysis-loader.js.map +1 -0
  140. package/dist/sender.js +11 -9
  141. package/dist/sender.js.map +1 -1
  142. package/dist/toml-lite.js +546 -0
  143. package/dist/toml-lite.js.map +1 -0
  144. package/dist/version-check.js +23 -7
  145. package/dist/version-check.js.map +1 -1
  146. package/package.json +5 -3
@@ -0,0 +1,194 @@
1
+ import { CodebusError } from "../errors.js";
2
+ import { makeCtx } from "../client.js";
3
+ import { resolveConfig } from "../config.js";
4
+ import { randomUUID } from "node:crypto";
5
+ export class CorrelationError extends CodebusError {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = "CorrelationError";
9
+ }
10
+ }
11
+ /** Validate null/absent fields explicitly; never silently drop unknown ids. */
12
+ function pickFirst(...vals) {
13
+ for (const v of vals) {
14
+ if (v === undefined || v === null)
15
+ continue;
16
+ if (typeof v !== "string")
17
+ throw new CorrelationError(`correlation id must be a string, got: ${typeof v}`);
18
+ const t = v.trim();
19
+ if (t.length === 0)
20
+ continue;
21
+ return t;
22
+ }
23
+ return undefined;
24
+ }
25
+ function requireField(name, value) {
26
+ // Explicit null/absent validation: missing is a typed error, never a silent drop.
27
+ if (value === undefined || value === null || value.trim().length === 0) {
28
+ throw new CorrelationError(`correlation chain missing required field: ${name}`);
29
+ }
30
+ return value;
31
+ }
32
+ export function validateCorrelationEnvelope(chain) {
33
+ for (const f of ["actor", "environment", "transport"]) {
34
+ const v = chain?.[f];
35
+ // Require all three fields to be present and strings; reject non-strings (numbers, objects, etc)
36
+ if (typeof v !== "string" || v.trim().length === 0) {
37
+ throw new CorrelationError(`correlation envelope field '${f}' must be a non-empty string, got: ${typeof v} ${JSON.stringify(v)}`);
38
+ }
39
+ }
40
+ // Validate specific field values
41
+ if (chain.environment !== "dev" && chain.environment !== "prod") {
42
+ throw new CorrelationError(`correlation envelope has invalid environment: ${chain.environment} (expected 'dev' | 'prod')`);
43
+ }
44
+ if (chain.transport !== "cli" && chain.transport !== "mcp") {
45
+ throw new CorrelationError(`correlation envelope has invalid transport: ${chain.transport} (expected 'cli' | 'mcp')`);
46
+ }
47
+ }
48
+ /**
49
+ * Resolve the authenticated person's GitHub login from the CodeBus session.
50
+ * Uses the identity precedence from resolveConfig: flags > env > session/cwd/config.
51
+ * Returns undefined when no CodeBus identity is available (e.g., in tests).
52
+ */
53
+ async function resolveGithubLogin(overrides) {
54
+ try {
55
+ const cfg = resolveConfig(overrides || {});
56
+ const ctx = await makeCtx(cfg);
57
+ const { data, error } = await ctx.supabase
58
+ .from("agents")
59
+ .select("people!person_id(github_login)")
60
+ .eq("slug", ctx.agentSlug)
61
+ .single();
62
+ if (error)
63
+ return undefined;
64
+ return data?.people?.github_login ?? undefined;
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ /**
71
+ * Build a fully validated T-01 correlation chain.
72
+ * Fills run_id (generated when absent), actor (GitHub login), environment (--env, default 'prod' per ADR-0011).
73
+ * respects Overrides (--url, --token, --agent, --workspace) per identity precedence: flags > env > session/cwd/config.
74
+ * Actor resolution: opts.actor > partial.actor > githubLogin (verified CodeBus identity) > env vars.
75
+ */
76
+ export async function buildCorrelationChain(partial, opts = {}) {
77
+ // Idempotency lookups BEFORE policy checks on retry paths: resolve the
78
+ // cheapest deterministic fields first (ids), then enforce policy (actor/env/transport).
79
+ const plan_id = pickFirst(partial.plan_id, partial.plan);
80
+ const stage_id = pickFirst(partial.stage_id, partial.stage);
81
+ const child_id = pickFirst(partial.child_id, partial.child);
82
+ const binding_id = pickFirst(partial.binding_id, partial.binding);
83
+ const run_id = pickFirst(partial.run_id, partial.run) ?? randomUUID();
84
+ const jira_key = pickFirst(partial.jira_key);
85
+ const pr_url = pickFirst(partial.pr_url, partial.pr);
86
+ const receipt_id = pickFirst(partial.receipt_id, partial.receipt);
87
+ requireField("plan_id", plan_id);
88
+ requireField("stage_id", stage_id);
89
+ requireField("child_id", child_id);
90
+ requireField("binding_id", binding_id);
91
+ requireField("run_id", run_id);
92
+ // Actor: explicit opt > partial > verified CodeBus GitHub login > GitHub env vars.
93
+ // Actor must be a GitHub login (people.github_login), not an agent slug.
94
+ // Never silently drop: absent actor is a typed error.
95
+ let actor = pickFirst(opts.actor, partial.actor, opts.githubLogin);
96
+ if (!actor && opts.overrides) {
97
+ actor = await resolveGithubLogin(opts.overrides);
98
+ }
99
+ if (!actor) {
100
+ actor = pickFirst(process.env.GITHUB_USER, process.env.GH_USER, process.env.GITHUB_ACTOR);
101
+ }
102
+ if (!actor) {
103
+ throw new CorrelationError(`correlation chain requires actor (GitHub login); provide via --actor flag, authenticate with codebus login, or set GITHUB_USER/GITHUB_ACTOR env`);
104
+ }
105
+ const environment = pickFirst(opts.environment, opts.env, partial.environment, partial.env) ?? "prod";
106
+ const transport = pickFirst(opts.transport, partial.transport) ?? "cli";
107
+ const chain = {
108
+ plan_id: plan_id,
109
+ stage_id: stage_id,
110
+ child_id: child_id,
111
+ binding_id: binding_id,
112
+ run_id: run_id,
113
+ actor: actor || "",
114
+ environment: environment || "prod",
115
+ transport: transport || "cli",
116
+ };
117
+ if (jira_key !== undefined)
118
+ chain.jira_key = jira_key;
119
+ if (pr_url !== undefined)
120
+ chain.pr_url = pr_url;
121
+ if (receipt_id !== undefined)
122
+ chain.receipt_id = receipt_id;
123
+ // Negative-fixture behavior: missing actor/environment/transport raises typed error.
124
+ validateCorrelationEnvelope(chain);
125
+ return chain;
126
+ }
127
+ /** Resolve the authenticated person's GitHub login from the CodeBus session. */
128
+ async function resolveActorFromSession(o) {
129
+ try {
130
+ const ctx = await makeCtx(resolveConfig(o));
131
+ const { data, error } = await ctx.supabase
132
+ .from("agents")
133
+ .select("people!person_id(github_login)")
134
+ .eq("slug", ctx.agentSlug)
135
+ .single();
136
+ if (error)
137
+ return undefined;
138
+ return data?.people?.github_login ?? undefined;
139
+ }
140
+ catch {
141
+ return undefined;
142
+ }
143
+ }
144
+ export async function correlationCmd(o) {
145
+ try {
146
+ // Resolve actor via CodeBus identity (ADR-0003/ADR-0011 precedence: flags > env > session/cwd/config).
147
+ // An explicit --actor is VERIFIED against the authenticated GitHub login
148
+ // whenever a session identity resolves: a caller must not be able to emit
149
+ // a chain naming an arbitrary GitHub login while authenticated as someone
150
+ // else. Without a resolvable session (offline/tests), --actor is trusted
151
+ // as the flag tier of the precedence.
152
+ let actor = o.actor;
153
+ const resolvedLogin = await resolveActorFromSession(o);
154
+ if (resolvedLogin) {
155
+ if (actor && actor !== resolvedLogin) {
156
+ throw new CorrelationError(`--actor '${actor}' does not match authenticated GitHub login '${resolvedLogin}'`);
157
+ }
158
+ actor = resolvedLogin;
159
+ }
160
+ const chain = await buildCorrelationChain({
161
+ jira_key: o.jiraKey,
162
+ plan: o.plan,
163
+ stage: o.stage,
164
+ child: o.child,
165
+ binding: o.binding,
166
+ run: o.run,
167
+ pr: o.pr,
168
+ receipt: o.receipt,
169
+ actor: actor,
170
+ env: o.env,
171
+ }, { transport: "cli", overrides: o });
172
+ console.log(JSON.stringify(chain, null, 2));
173
+ }
174
+ catch (err) {
175
+ if (err instanceof CodebusError)
176
+ throw err;
177
+ throw new CodebusError(`Failed to build correlation chain: ${err instanceof Error ? err.message : String(err)}`, 1);
178
+ }
179
+ }
180
+ export function registerCorrelation(program, g) {
181
+ g(program.command("correlation").description("build a T-01 correlation chain"))
182
+ .option("--jira-key <k>", "jira key")
183
+ .option("--plan <id>", "plan id")
184
+ .option("--stage <id>", "stage id")
185
+ .option("--child <id>", "child id")
186
+ .option("--binding <id>", "binding id")
187
+ .option("--run <id>", "run id (generated when absent)")
188
+ .option("--pr <url>", "pr url")
189
+ .option("--receipt <id>", "receipt id")
190
+ .option("--actor <login>", "GitHub login (defaults to authenticated CodeBus identity, then GITHUB_USER/GH_USER/GITHUB_ACTOR env)")
191
+ .option("--env <e>", "environment dev|prod (default prod per ADR-0011)")
192
+ .action((o) => correlationCmd(o));
193
+ }
194
+ //# sourceMappingURL=correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation.js","sourceRoot":"","sources":["../../src/commands/correlation.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,52 @@ export async function acceptDecisionCore(ctx, idOrDisplay) {
34
34
  throw new CodebusError(`accept failed (owner-only): ${error.message}`);
35
35
  return { display_id: data.display_id, status: data.status, id: data.id };
36
36
  }
37
+ export async function transitionDecisionCore(ctx, decisionId, opts) {
38
+ const { data, error } = await ctx.supabase.rpc("decision_transition", {
39
+ p_decision_id: decisionId,
40
+ p_expected_status: opts.from,
41
+ p_new_status: opts.to,
42
+ });
43
+ if (error)
44
+ throw new CodebusError(error.message);
45
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
46
+ throw new CodebusError("decision transition RPC returned an invalid response");
47
+ }
48
+ return data;
49
+ }
50
+ /**
51
+ * Shared core: list all decisions in the workspace (read-only).
52
+ * Exported for reuse in MCP tool.
53
+ */
54
+ export async function decisionListCore(ctx) {
55
+ const ws = await workspaceId(ctx);
56
+ const { data, error } = await ctx.supabase.from("decisions")
57
+ .select("display_id, id, slug, title, status, created_at")
58
+ .eq("workspace_id", ws).order("created_at", { ascending: false });
59
+ if (error)
60
+ throw new CodebusError(error.message);
61
+ return data ?? [];
62
+ }
63
+ /**
64
+ * Shared core: show a single decision by CB-DEC-… display id or UUID.
65
+ * Exported for reuse in MCP tool.
66
+ */
67
+ export async function decisionShowCore(ctx, idOrDisplay) {
68
+ const ws = await workspaceId(ctx);
69
+ const isDisplay = /^CB-DEC-/i.test(idOrDisplay);
70
+ const key = isDisplay ? "display_id" : "id";
71
+ const val = isDisplay ? idOrDisplay.toUpperCase() : idOrDisplay;
72
+ // display ids are only unique per workspace (bus_counters, 0004) — scope
73
+ // the lookup, or a multi-workspace agent could show the WRONG workspace's
74
+ // decision when two workspaces happen to share a display_id.
75
+ const { data, error } = await ctx.supabase.from("decisions")
76
+ .select("*").eq("workspace_id", ws).eq(key, val).maybeSingle();
77
+ if (error)
78
+ throw new CodebusError(error.message);
79
+ if (!data)
80
+ throw new CodebusError(`decision not found (or not visible to you): ${idOrDisplay}`);
81
+ return data;
82
+ }
37
83
  async function addDecision(o) {
38
84
  const ctx = await makeCtx(resolveConfig(o));
39
85
  const result = await createDecisionCore(ctx, { title: o.title, slug: o.slug, body: o.body });
@@ -44,9 +90,26 @@ async function acceptDecision(idOrDisplay, o) {
44
90
  const result = await acceptDecisionCore(ctx, idOrDisplay);
45
91
  console.log(render([{ display_id: result.display_id, status: result.status }], { json: !!o.json }));
46
92
  }
93
+ async function listDecisions(o) {
94
+ const rows = await decisionListCore(await makeCtx(resolveConfig(o)));
95
+ console.log(render(rows, { json: !!o.json }));
96
+ }
97
+ async function showDecision(idOrDisplay, o) {
98
+ const result = await decisionShowCore(await makeCtx(resolveConfig(o)), idOrDisplay);
99
+ console.log(o.json ? JSON.stringify(result, null, 2) : render([result], { json: false }));
100
+ }
47
101
  export function registerDecision(program, g) {
48
102
  const dec = program.command("decision").description("decision operations");
49
103
  g(dec.command("add")).requiredOption("--title <t>").option("--slug <s>").option("--body <b>").action(addDecision);
104
+ g(dec.command("list")).action(listDecisions);
105
+ g(dec.command("show").argument("<id>", "CB-DEC-… or UUID")).action(showDecision);
50
106
  g(dec.command("accept").argument("<id>")).action((id, o) => acceptDecision(id, o));
107
+ g(dec.command("transition").argument("<id>"))
108
+ .requiredOption("--from <status>")
109
+ .requiredOption("--to <status>")
110
+ .action(async (id, o) => {
111
+ const result = await transitionDecisionCore(await makeCtx(resolveConfig(o)), id, { from: o.from, to: o.to });
112
+ console.log(render([result], { json: !!o.json }));
113
+ });
51
114
  }
52
115
  //# sourceMappingURL=decision.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/commands/decision.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/commands/decision.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAa,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAO,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAQ,EACR,IAAqD;IAErD,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;SACzD,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;IACpG,IAAI,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,EAAE,UAAU,EAAE,IAAK,CAAC,UAAU,EAAE,IAAI,EAAE,IAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAK,CAAC,MAAM,EAAE,EAAE,EAAE,IAAK,CAAC,EAAE,EAAE,CAAC;AAChG,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAQ,EACR,WAAmB;IAEnB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAChE,yEAAyE;IACzE,2EAA2E;IAC3E,yEAAyE;IACzE,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnF,IAAI,SAAS;QAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;IAClD,IAAI,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,UAAU,EAAE,IAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAK,CAAC,MAAM,EAAE,EAAE,EAAE,IAAK,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAQ,EACR,UAAkB,EAClB,IAAkC;IAElC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE;QACpE,aAAa,EAAE,UAAU;QACzB,iBAAiB,EAAE,IAAI,CAAC,IAAI;QAC5B,YAAY,EAAE,IAAI,CAAC,EAAE;KACtB,CAAC,CAAC;IACH,IAAI,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,YAAY,CAAC,sDAAsD,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,IAA+B,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAQ;IAC7C,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;SACzD,MAAM,CAAC,iDAAiD,CAAC;SACzD,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,IAAI,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,IAAI,IAAI,EAAE,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAQ,EAAE,WAAmB;IAClE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAChE,yEAAyE;IACzE,0EAA0E;IAC1E,6DAA6D;IAC7D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;SACzD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IACjE,IAAI,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,YAAY,CAAC,+CAA+C,WAAW,EAAE,CAAC,CAAC;IAChG,OAAO,IAA+B,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,CAA8E;IACvG,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,CAAiC;IAClF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,CAAiC;IAC5D,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,CAAiC;IAChF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,CAA0B;IAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAC3E,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClH,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACjF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAC1C,cAAc,CAAC,iBAAiB,CAAC;SACjC,cAAc,CAAC,eAAe,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,CAA2D,EAAE,EAAE;QAChF,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7G,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -18,6 +18,9 @@ const COUNT_LABEL = {
18
18
  // reply work order is never indistinguishable from FYI chatter in the
19
19
  // counts. Ranked and counted separately; never a reason to act.
20
20
  8: "FYI",
21
+ 9: "DECIDE",
22
+ 10: "STUCK",
23
+ 11: "UNKNOWN",
21
24
  };
22
25
  export function digestCounts(items) {
23
26
  const counts = {};
@@ -27,6 +30,10 @@ export function digestCounts(items) {
27
30
  }
28
31
  return counts;
29
32
  }
33
+ export const DIGEST_ALGORITHM_VERSION = "digest-v2";
34
+ export function stableDigestItems(items) {
35
+ return [...items].sort((a, b) => a.class_rank - b.class_rank || b.score - a.score || a.display_id.localeCompare(b.display_id) || a.id.localeCompare(b.id));
36
+ }
30
37
  // FYI class (0061, RC2): class_rank 8 is deliberately non-actionable — the
31
38
  // whole point of the class-7/8 split is that nothing is owed on an item in
32
39
  // class 8. review finding on this PR: NEXT (`codebus next`, MCP
@@ -49,7 +56,9 @@ export async function fetchAndCacheDigest(ctx) {
49
56
  const { data, error } = await ctx.supabase.rpc("bus_digest", { p_workspace: ws });
50
57
  if (error)
51
58
  throw new CodebusError(error.message);
52
- const items = (data ?? []);
59
+ const { data: sourceData } = await ctx.supabase.rpc("action_snapshot_sources", { p_workspace_id: ws });
60
+ const sources = sourceData && typeof sourceData === "object" && !Array.isArray(sourceData) ? sourceData : {};
61
+ const items = stableDigestItems((data ?? []).map((item) => ({ ...item, ...(sources[item.display_id] ?? {}) })));
53
62
  // S5: Count speak_now messages in my inbox that are still UNHANDLED. Gate on
54
63
  // handled_at, not read_at (review MAJOR finding #2 — delivery gap #5/#6):
55
64
  // read_at is a pure "opened" marker, so gating here on read_at meant a
@@ -80,6 +89,7 @@ export async function fetchAndCacheDigest(ctx) {
80
89
  counts: digestCounts(items),
81
90
  items,
82
91
  speak_now_count: speakNowCount,
92
+ algorithm_version: DIGEST_ALGORITHM_VERSION,
83
93
  };
84
94
  await mkdir(CACHE_DIR, { recursive: true });
85
95
  await writeFile(DIGEST_FILE, JSON.stringify(snapshot, null, 2), { mode: 0o600 });
@@ -111,7 +121,8 @@ async function refreshCmd(o) {
111
121
  }
112
122
  }
113
123
  export function registerDigest(program, g) {
114
- const d = program.command("digest").description("deterministic attention digest");
115
- g(d.command("refresh")).action(refreshCmd);
124
+ const d = g(program.command("digest")).description("deterministic attention digest");
125
+ const refresh = g(d.command("refresh", { isDefault: true }));
126
+ refresh.action((o, command) => refreshCmd({ ...command.parent?.opts(), ...o }));
116
127
  }
117
128
  //# sourceMappingURL=digest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { createHash } from "node:crypto";
4
+ import { createInterface } from "node:readline/promises";
5
+ import { stdin as input, stdout as output } from "node:process";
6
+ import { resolveConfig } from "../config.js";
7
+ import { makeCtx, workspaceId } from "../client.js";
8
+ import { CodebusError } from "../errors.js";
9
+ import { render } from "../output.js";
10
+ import { dispatchFactoryRunCore, makeExecutionClient } from "./factory.js";
11
+ import { readCachedDigest } from "./digest.js";
12
+ const execFileAsync = promisify(execFile);
13
+ function parseEnvelope(value) {
14
+ if (!value || typeof value !== "object" || Array.isArray(value))
15
+ throw new CodebusError("action_resolve returned an invalid envelope");
16
+ const e = value;
17
+ if (e.version !== 1 || typeof e.action_id !== "string" || typeof e.operation !== "string" || !e.source || typeof e.source !== "object" || typeof e.idempotency_key !== "string")
18
+ throw new CodebusError("action_resolve returned an invalid envelope");
19
+ return e;
20
+ }
21
+ export function resolveActionTarget(target, snapshot) {
22
+ if (!/^\d+$/.test(target))
23
+ return target.toUpperCase();
24
+ const item = snapshot?.items?.[Number(target) - 1];
25
+ if (!item?.display_id)
26
+ throw new CodebusError(`digest snapshot index is stale: ${target}`);
27
+ return item.display_id;
28
+ }
29
+ async function promptRelease(displayId) {
30
+ if (!input.isTTY || !output.isTTY)
31
+ throw new CodebusError("authority-sensitive commit requires an interactive TTY — run 'codebus do' from a terminal, not a piped/automation context.");
32
+ const rl = createInterface({ input, output });
33
+ try {
34
+ const answer = await rl.question(`Type ${displayId} to authorize: `);
35
+ if (answer !== displayId)
36
+ throw new CodebusError("interactive confirmation did not match the display id — re-run 'codebus do' and type the display id exactly.");
37
+ return answer;
38
+ }
39
+ finally {
40
+ rl.close();
41
+ }
42
+ }
43
+ export async function dispatchActionCore(ctx, target, phase, options) {
44
+ const displayId = resolveActionTarget(target, options.snapshot ?? null);
45
+ const snapshotItem = /^\d+$/.test(target) ? options.snapshot?.items?.[Number(target) - 1] : undefined;
46
+ const expected = { ...(snapshotItem?.source_revision ? { expected_revision: snapshotItem.source_revision } : {}), ...(snapshotItem?.source_state_digest ? { expected_state_digest: snapshotItem.source_state_digest } : {}) };
47
+ const rpc = async (rpcPhase, params = {}) => {
48
+ const { data, error } = await ctx.supabase.rpc("action_resolve", { p_workspace_id: options.workspaceId, p_display_id: displayId, p_phase: rpcPhase, p_params: { ...expected, ...params } });
49
+ if (error)
50
+ throw new CodebusError(`action ${rpcPhase} failed: ${error.message} — inspect the run with 'codebus factory status' (or '--json --run-id <id>'); re-run 'codebus do' to resume.`);
51
+ return parseEnvelope(data);
52
+ };
53
+ if (phase === "commit") {
54
+ if (!options.commitToken)
55
+ throw new CodebusError("commit requires the single-use token returned by prepare");
56
+ const prepared = await rpc("prepare", { commit_token: options.commitToken });
57
+ let proof = options.releaseProof;
58
+ if (!proof && ["approve", "merge", "answer", "ratify"].includes(prepared.operation)) {
59
+ const confirmation = await promptRelease(displayId);
60
+ const { data, error } = await ctx.supabase.rpc("action_release_proof", { p_workspace_id: options.workspaceId, p_display_id: displayId, p_commit_token: options.commitToken, p_confirmation: confirmation });
61
+ if (error)
62
+ throw new CodebusError(`action release proof failed: ${error.message}`);
63
+ proof = data && typeof data === "object" && typeof data.proof === "string" ? data.proof : undefined;
64
+ if (!proof)
65
+ throw new CodebusError("action release proof returned no proof");
66
+ }
67
+ if (["approve", "merge"].includes(prepared.operation) && prepared.source.kind === "pr") {
68
+ if (!options.externalAction || !options.persistExternalEvidence)
69
+ throw new CodebusError("PR action requires authoritative external evidence");
70
+ await options.persistExternalEvidence(prepared, await options.externalAction(prepared));
71
+ }
72
+ return rpc("commit", { commit_token: options.commitToken, ...(proof ? { release_proof: proof } : {}) });
73
+ }
74
+ const prepared = await rpc("prepare");
75
+ const factory = prepared.mutation.factory;
76
+ if (factory && typeof factory === "object") {
77
+ if (!options.factoryPrepare)
78
+ throw new CodebusError("action requires a managed Factory run but no dispatcher was provided");
79
+ const result = await options.factoryPrepare(factory);
80
+ if (result.exitCode !== 0)
81
+ throw new CodebusError(result.stderr.trim() || `factory exited with code ${result.exitCode}`, result.exitCode);
82
+ const value = result.value && typeof result.value === "object" && !Array.isArray(result.value) ? result.value : {};
83
+ const runId = typeof value.run_id === "string" ? value.run_id : typeof value.id === "string" ? value.id : undefined;
84
+ const bindingId = result.bindingId;
85
+ if (!runId || !bindingId)
86
+ throw new CodebusError("Factory prepare returned no managed run or binding id");
87
+ return { ...await rpc("prepare", { prepared_run_id: runId, prepared_binding_id: bindingId, preparation_id: prepared.preparation_id, commit_token: prepared.commit_token }), prepared_run_id: runId, prepared_binding_id: bindingId };
88
+ }
89
+ return prepared;
90
+ }
91
+ async function doAction(target, o) {
92
+ const ctx = await makeCtx(resolveConfig(o));
93
+ const ws = await workspaceId(ctx);
94
+ const snapshot = /^\d+$/.test(target) ? await readCachedDigest() : null;
95
+ const actionCtx = { supabase: { rpc: (name, args) => ctx.supabase.rpc(name, args) } };
96
+ const factoryPrepare = o.commit ? undefined : async (spec) => {
97
+ if (!spec.plan || !spec.stage || !spec.role)
98
+ throw new CodebusError("Factory action is missing plan, stage, or role");
99
+ return dispatchFactoryRunCore(ctx, makeExecutionClient(o.host), spec);
100
+ };
101
+ const externalAction = async (e) => {
102
+ const repo = e.repo;
103
+ const number = e.mutation.number ?? e.mutation.pr_number;
104
+ if (!repo || number === undefined)
105
+ throw new CodebusError("PR action is missing immutable repo and number");
106
+ const args = e.operation === "approve" ? ["pr", "review", String(number), "--repo", repo, "--approve"] : ["pr", "merge", String(number), "--repo", repo, "--merge", "--delete-branch=false"];
107
+ await execFileAsync("gh", args);
108
+ const verified = await execFileAsync("gh", ["pr", "view", String(number), "--repo", repo, "--json", "state,reviewDecision,mergeCommit"]);
109
+ const status = JSON.parse(verified.stdout);
110
+ if (e.operation === "approve" && status.reviewDecision !== "APPROVED")
111
+ throw new CodebusError("GitHub did not report an approved PR review");
112
+ if (e.operation === "merge" && (status.state !== "MERGED" || !status.mergeCommit?.oid))
113
+ throw new CodebusError("GitHub did not report a completed PR merge");
114
+ return { ref: `gh:${repo}#${number}:${e.operation}`, digest: createHash("sha256").update(verified.stdout).digest("hex") };
115
+ };
116
+ const persistExternalEvidence = async (e, evidence) => {
117
+ const { error } = await ctx.supabase.rpc("action_external_evidence", { p_workspace_id: ws, p_preparation_id: e.preparation_id, p_commit_token: o.commitToken, p_ref: evidence.ref, p_digest: evidence.digest });
118
+ if (error)
119
+ throw new CodebusError(`external PR evidence failed: ${error.message}`);
120
+ };
121
+ const result = await dispatchActionCore(actionCtx, target, o.commit ? "commit" : "prepare", { workspaceId: ws, snapshot, commitToken: o.commitToken, releaseProof: o.releaseProof, factoryPrepare, externalAction, persistExternalEvidence });
122
+ console.log(render([{ ...result }], { json: !!o.json }));
123
+ }
124
+ export function registerDo(program, g) {
125
+ g(program.command("do").argument("<display-id|snapshot-index>").option("--commit", "consume the prepared action").option("--commit-token <token>", "single-use commit token returned by prepare").option("--release-proof <proof>", "pre-issued single-use A9 proof").option("--host <host>", "execute prepare through OpenSSH").action(doAction));
126
+ }
127
+ //# sourceMappingURL=do.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do.js","sourceRoot":"","sources":["../../src/commands/do.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Console attention view over CLI (`factory-attention`) — routes a single read
3
+ * through the attention_queue_v1(p_actor_login) RPC defined in 0109_attention_queue.sql.
4
+ *
5
+ * The projection yields six categories (ADR 0005: the console reads state over
6
+ * the API; each stuck/dead/over-cap/waiting-on-human item opens its details):
7
+ * blocked-question execution reported BLOCKED, waiting on a human answer
8
+ * stalled available non-terminal execution with a stale heartbeat
9
+ * dead terminal failed execution (ERROR/CANCELLED/INCOMPLETE) not resumed
10
+ * over-cap execution past its stage max_minutes cap (0098 deadline)
11
+ * receipt-ruling proposed decision awaiting a human ruling (0003/0104)
12
+ * gate-approval human plan gate to approve or release (0104/0107)
13
+ *
14
+ * Positive fixture: attention_queue_v1_returns_user_items
15
+ * — calling attention_queue_v1(p_actor_login) for the accountable person
16
+ * returns exactly the items they own/drive/rule on, scoped by RLS.
17
+ *
18
+ * Negative fixture: attention_returns_empty_for_other_user
19
+ * — the same RPC called for a login that owns/drives/none of the items
20
+ * returns zero rows (the actor_login filter narrows to the named person,
21
+ * unknown logins yield nothing, never an error).
22
+ *
23
+ * Reusable core exported for tests and future MCP parity.
24
+ */
25
+ import { resolveConfig } from "../config.js";
26
+ import { makeCtx } from "../client.js";
27
+ import { CodebusError } from "../errors.js";
28
+ import { render } from "../output.js";
29
+ /** Resolve the current agent's accountable person slug to use as the default
30
+ * actor_login for attention_queue_v1. Falls back to null (the caller must
31
+ * supply --login) since a service agent has no person of its own. Mirrors
32
+ * whoami.ts's person-resolution shape. */
33
+ export async function resolveActorLogin(ctx) {
34
+ const { data, error } = await ctx.supabase
35
+ .from("agents")
36
+ .select("people!person_id(id,slug)")
37
+ .eq("slug", ctx.agentSlug)
38
+ .single();
39
+ if (error)
40
+ throw new CodebusError(`unable to resolve actor identity: ${error.message}`);
41
+ const me = data?.people ?? null;
42
+ return me?.slug ?? null;
43
+ }
44
+ /** Shared core — calls the attention_queue_v1 RPC (positive fixture: returns
45
+ * the named person's items; negative fixture: empty for another login). The
46
+ * RPC itself enforces RLS + the actor_login scope, so no extra client-side
47
+ * filtering is applied: the projection is authoritative. */
48
+ export async function factoryAttentionCore(ctx, options) {
49
+ const actorLogin = options.login || (await resolveActorLogin(ctx));
50
+ if (!actorLogin) {
51
+ throw new CodebusError("no actor login available — pass --login <github-login-or-slug> (your accountable person)", 2);
52
+ }
53
+ const { data, error } = await ctx.supabase.rpc("attention_queue_v1", {
54
+ p_actor_login: actorLogin,
55
+ });
56
+ if (error)
57
+ throw new CodebusError(`attention_queue_v1 RPC failed: ${error.message}`);
58
+ const rows = (Array.isArray(data) ? data : []);
59
+ return rows;
60
+ }
61
+ function attentionHumanRow(item) {
62
+ const plural = (n) => n === null ? "—" : `${n}s`;
63
+ const ageLabel = item.age_seconds !== null && item.age_seconds !== undefined
64
+ ? `${Math.floor(item.age_seconds / 60)}m ${item.age_seconds % 60}s`
65
+ : "—";
66
+ return {
67
+ category: item.category,
68
+ severity: item.severity,
69
+ id: item.item_id.slice(0, 8),
70
+ plan: item.plan_id ? item.plan_id.slice(0, 8) : "—",
71
+ stage: item.stage_id ?? "—",
72
+ owner: item.owner_login ?? "—",
73
+ reason: (item.reason_or_question ?? "—").slice(0, 60),
74
+ age: ageLabel,
75
+ deadline: item.deadline
76
+ ? new Date(item.deadline).toLocaleString("en-US", {
77
+ month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", timeZoneName: "short",
78
+ })
79
+ : "—",
80
+ };
81
+ }
82
+ const SEVERITY_ORDER = { critical: 0, high: 1, medium: 2, low: 3 };
83
+ async function attentionCmd(login, o, command) {
84
+ const ctx = await makeCtx(resolveConfig(command.optsWithGlobals()));
85
+ const items = await factoryAttentionCore(ctx, { login: login ?? "" });
86
+ if (o.json) {
87
+ console.log(JSON.stringify(items, null, 2));
88
+ return;
89
+ }
90
+ if (items.length === 0) {
91
+ console.log("No attention items.");
92
+ return;
93
+ }
94
+ const sorted = [...items].sort((a, b) => (SEVERITY_ORDER[a.severity] ?? 9) - (SEVERITY_ORDER[b.severity] ?? 9) || a.category.localeCompare(b.category));
95
+ console.log(render(sorted.map(attentionHumanRow), { json: false }));
96
+ }
97
+ export function registerFactoryAttention(program, g) {
98
+ const factory = program.commands.find((c) => c.name() === "factory") ??
99
+ program.command("factory").description("coding factory intake");
100
+ g(factory.command("attention")
101
+ .description("console attention view: items needing a human (0109 attention_queue_v1)")
102
+ .argument("[login]", "GitHub login or person slug to project attention for (default: your agent's person)"))
103
+ .option("-j, --json", "render raw JSON rows")
104
+ .action(attentionCmd);
105
+ }
106
+ //# sourceMappingURL=factory-attention.js.map