@bragi-gmbh/codebus 1.2.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.
Files changed (133) hide show
  1. package/bin/codebus.js +2 -0
  2. package/dist/binding-guard.js +97 -0
  3. package/dist/binding-guard.js.map +1 -0
  4. package/dist/client.js +94 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/ack.js +47 -0
  7. package/dist/commands/ack.js.map +1 -0
  8. package/dist/commands/archive.js +21 -0
  9. package/dist/commands/archive.js.map +1 -0
  10. package/dist/commands/as.js +299 -0
  11. package/dist/commands/as.js.map +1 -0
  12. package/dist/commands/ask.js +189 -0
  13. package/dist/commands/ask.js.map +1 -0
  14. package/dist/commands/auth.js +33 -0
  15. package/dist/commands/auth.js.map +1 -0
  16. package/dist/commands/checkin.js +235 -0
  17. package/dist/commands/checkin.js.map +1 -0
  18. package/dist/commands/decision.js +52 -0
  19. package/dist/commands/decision.js.map +1 -0
  20. package/dist/commands/digest.js +117 -0
  21. package/dist/commands/digest.js.map +1 -0
  22. package/dist/commands/doctor.js +106 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/factory.js +191 -0
  25. package/dist/commands/factory.js.map +1 -0
  26. package/dist/commands/github-login.js +205 -0
  27. package/dist/commands/github-login.js.map +1 -0
  28. package/dist/commands/graph.js +88 -0
  29. package/dist/commands/graph.js.map +1 -0
  30. package/dist/commands/health.js +34 -0
  31. package/dist/commands/health.js.map +1 -0
  32. package/dist/commands/inbox.js +83 -0
  33. package/dist/commands/inbox.js.map +1 -0
  34. package/dist/commands/ingest.js +553 -0
  35. package/dist/commands/ingest.js.map +1 -0
  36. package/dist/commands/init.js +97 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/install.js +520 -0
  39. package/dist/commands/install.js.map +1 -0
  40. package/dist/commands/invite.js +152 -0
  41. package/dist/commands/invite.js.map +1 -0
  42. package/dist/commands/jira.js +237 -0
  43. package/dist/commands/jira.js.map +1 -0
  44. package/dist/commands/join.js +96 -0
  45. package/dist/commands/join.js.map +1 -0
  46. package/dist/commands/links.js +66 -0
  47. package/dist/commands/links.js.map +1 -0
  48. package/dist/commands/login.js +84 -0
  49. package/dist/commands/login.js.map +1 -0
  50. package/dist/commands/morning.js +121 -0
  51. package/dist/commands/morning.js.map +1 -0
  52. package/dist/commands/next.js +66 -0
  53. package/dist/commands/next.js.map +1 -0
  54. package/dist/commands/onboarding.js +109 -0
  55. package/dist/commands/onboarding.js.map +1 -0
  56. package/dist/commands/pack.js +276 -0
  57. package/dist/commands/pack.js.map +1 -0
  58. package/dist/commands/plan-gh.js +425 -0
  59. package/dist/commands/plan-gh.js.map +1 -0
  60. package/dist/commands/plan.js +465 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/pr.js +88 -0
  63. package/dist/commands/pr.js.map +1 -0
  64. package/dist/commands/question.js +142 -0
  65. package/dist/commands/question.js.map +1 -0
  66. package/dist/commands/read.js +84 -0
  67. package/dist/commands/read.js.map +1 -0
  68. package/dist/commands/refs.js +357 -0
  69. package/dist/commands/refs.js.map +1 -0
  70. package/dist/commands/reply.js +38 -0
  71. package/dist/commands/reply.js.map +1 -0
  72. package/dist/commands/repo.js +1198 -0
  73. package/dist/commands/repo.js.map +1 -0
  74. package/dist/commands/report.js +41 -0
  75. package/dist/commands/report.js.map +1 -0
  76. package/dist/commands/resolve-refs.js +21 -0
  77. package/dist/commands/resolve-refs.js.map +1 -0
  78. package/dist/commands/resolve.js +93 -0
  79. package/dist/commands/resolve.js.map +1 -0
  80. package/dist/commands/send.js +168 -0
  81. package/dist/commands/send.js.map +1 -0
  82. package/dist/commands/sent.js +22 -0
  83. package/dist/commands/sent.js.map +1 -0
  84. package/dist/commands/session.js +426 -0
  85. package/dist/commands/session.js.map +1 -0
  86. package/dist/commands/statusline.js +43 -0
  87. package/dist/commands/statusline.js.map +1 -0
  88. package/dist/commands/task.js +140 -0
  89. package/dist/commands/task.js.map +1 -0
  90. package/dist/commands/tick.js +233 -0
  91. package/dist/commands/tick.js.map +1 -0
  92. package/dist/commands/upgrade.js +76 -0
  93. package/dist/commands/upgrade.js.map +1 -0
  94. package/dist/commands/watch.js +169 -0
  95. package/dist/commands/watch.js.map +1 -0
  96. package/dist/commands/whoami.js +27 -0
  97. package/dist/commands/whoami.js.map +1 -0
  98. package/dist/config.js +103 -0
  99. package/dist/config.js.map +1 -0
  100. package/dist/directives.js +102 -0
  101. package/dist/directives.js.map +1 -0
  102. package/dist/errors.js +110 -0
  103. package/dist/errors.js.map +1 -0
  104. package/dist/git-hooks.js +116 -0
  105. package/dist/git-hooks.js.map +1 -0
  106. package/dist/graph-bootstrap.js +95 -0
  107. package/dist/graph-bootstrap.js.map +1 -0
  108. package/dist/graph-remote.js +889 -0
  109. package/dist/graph-remote.js.map +1 -0
  110. package/dist/graph.js +335 -0
  111. package/dist/graph.js.map +1 -0
  112. package/dist/index.js +154 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/kit/graph-publish.mjs +400 -0
  115. package/dist/mail-latency.js +120 -0
  116. package/dist/mail-latency.js.map +1 -0
  117. package/dist/mcp-registry.js +859 -0
  118. package/dist/mcp-registry.js.map +1 -0
  119. package/dist/mcp.js +193 -0
  120. package/dist/mcp.js.map +1 -0
  121. package/dist/output.js +12 -0
  122. package/dist/output.js.map +1 -0
  123. package/dist/positioning.js +21 -0
  124. package/dist/positioning.js.map +1 -0
  125. package/dist/rolestore.js +89 -0
  126. package/dist/rolestore.js.map +1 -0
  127. package/dist/session.js +49 -0
  128. package/dist/session.js.map +1 -0
  129. package/dist/sessionstore.js +736 -0
  130. package/dist/sessionstore.js.map +1 -0
  131. package/dist/version-check.js +97 -0
  132. package/dist/version-check.js.map +1 -0
  133. package/package.json +47 -0
@@ -0,0 +1,142 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx, workspaceId, repoId } from "../client.js";
3
+ import { render } from "../output.js";
4
+ import { CodebusError } from "../errors.js";
5
+ import { resolveContact } from "./resolve.js";
6
+ /**
7
+ * Resolve a question display ID (CB-Q-…) or UUID to UUID.
8
+ */
9
+ async function resolveQuestionId(ctx, ws, idOrDisplay) {
10
+ if (/^CB-Q-/i.test(idOrDisplay)) {
11
+ // display ids are only unique per workspace — always scope the lookup
12
+ const { data, error } = await ctx.supabase.from("questions").select("id")
13
+ .eq("workspace_id", ws).eq("display_id", idOrDisplay.toUpperCase()).single();
14
+ if (error || !data)
15
+ throw new CodebusError(`question not found: ${idOrDisplay}`);
16
+ return data.id;
17
+ }
18
+ return idOrDisplay;
19
+ }
20
+ /**
21
+ * Shared core: create a question.
22
+ * Exported for reuse in MCP tool.
23
+ */
24
+ export async function createQuestionCore(ctx, opts) {
25
+ const ws = await workspaceId(ctx);
26
+ let to = opts.to;
27
+ if (opts.toMentor && !opts.to) {
28
+ // route to the inviter's default agent while the mentor window is open
29
+ const { data: meRow } = await ctx.supabase.from("agents")
30
+ .select("people!person_id(id)").eq("slug", ctx.agentSlug).single();
31
+ const myPersonId = meRow?.people?.id;
32
+ if (!myPersonId)
33
+ throw new CodebusError("no person linked to this agent — mentor routing needs a person identity");
34
+ const { data: conn } = await ctx.supabase.from("connections")
35
+ .select("expires_at, other_person_id")
36
+ .eq("workspace_id", ws).eq("kind", "mentor").eq("person_id", myPersonId);
37
+ const m = conn?.find((c) => new Date(c.expires_at) > new Date());
38
+ if (!m)
39
+ throw new CodebusError("no active mentor — your first-week mentor window may have expired; use --to <agent>");
40
+ // mentors may have any agent slug — resolve via person, prefer the default agent
41
+ const { data: mentorAgents } = await ctx.supabase.from("agents")
42
+ .select("slug").eq("person_id", m.other_person_id).is("revoked_at", null);
43
+ const slugs = (mentorAgents ?? []).map((a) => a.slug);
44
+ to = slugs.find((x) => x.endsWith("-default")) ?? slugs[0];
45
+ if (!to)
46
+ throw new CodebusError("your mentor has no active agents to receive the question");
47
+ }
48
+ let toId = null;
49
+ if (to) {
50
+ // Route the recipient reference through the shared contact resolver (A5):
51
+ // exact slugs pass through, human references resolve to an agent slug,
52
+ // unknown/ambiguous fail closed. The mentor path above already produced a
53
+ // precise slug, so it resolves to itself.
54
+ const resolved = await resolveContact(ctx, to);
55
+ to = resolved.slug;
56
+ const { data } = await ctx.supabase.from("agents").select("id").eq("slug", to).single();
57
+ if (!data)
58
+ throw new CodebusError(`unknown recipient: ${to}`);
59
+ toId = data.id;
60
+ }
61
+ let blocksTaskId = null;
62
+ if (opts.blocksTask) {
63
+ const { data } = await ctx.supabase.from("tasks").select("id")
64
+ .eq("workspace_id", ws).eq("display_id", opts.blocksTask.toUpperCase()).single();
65
+ if (!data)
66
+ throw new CodebusError(`task not found: ${opts.blocksTask}`);
67
+ blocksTaskId = data.id;
68
+ }
69
+ const { data, error } = await ctx.supabase.from("questions")
70
+ .insert({
71
+ workspace_id: ws, repo_id: await repoId(ctx, ws, opts.repo), to_agent_id: toId,
72
+ title: opts.title, body: opts.body, blocking: !!opts.blocking,
73
+ blocks_task_id: blocksTaskId, required_answer: opts.required ?? null,
74
+ }).select().single();
75
+ if (error)
76
+ throw new CodebusError(error.message);
77
+ return { display_id: data.display_id, status: data.status, to: to ?? "(broadcast)", id: data.id };
78
+ }
79
+ /**
80
+ * Shared core: answer a question.
81
+ * Exported for reuse in MCP tool.
82
+ */
83
+ export async function answerQuestionCore(ctx, idOrDisplay, body) {
84
+ const ws = await workspaceId(ctx);
85
+ const id = await resolveQuestionId(ctx, ws, idOrDisplay);
86
+ const { data, error } = await ctx.supabase.rpc("answer_question", { p_question: id, p_body: body });
87
+ if (error)
88
+ throw new CodebusError(error.message);
89
+ return { display_id: data.display_id, status: data.status, answered_at: data.answered_at, id: data.id };
90
+ }
91
+ async function askQuestion(o) {
92
+ const ctx = await makeCtx(resolveConfig(o));
93
+ const result = await createQuestionCore(ctx, {
94
+ title: o.title,
95
+ body: o.body,
96
+ to: o.to,
97
+ toMentor: o.toMentor,
98
+ repo: o.repo,
99
+ blocking: o.blocking,
100
+ blocksTask: o.blocksTask,
101
+ required: o.required,
102
+ });
103
+ console.log(render([{ display_id: result.display_id, status: result.status, to: result.to }], { json: !!o.json }));
104
+ }
105
+ async function listQuestions(o) {
106
+ const ctx = await makeCtx(resolveConfig(o));
107
+ const ws = await workspaceId(ctx);
108
+ let q = ctx.supabase.from("questions")
109
+ .select("display_id, title, status, blocking, created_at, asker:asked_by_agent_id(slug), to:to_agent_id(slug)")
110
+ .eq("workspace_id", ws).order("created_at", { ascending: false });
111
+ if (o.status)
112
+ q = q.eq("status", o.status);
113
+ if (o.repo) {
114
+ const rid = await repoId(ctx, ws, o.repo);
115
+ q = q.eq("repo_id", rid);
116
+ }
117
+ const { data, error } = await q;
118
+ if (error)
119
+ throw new CodebusError(error.message);
120
+ const rows = (data ?? []).map((r) => ({
121
+ id: r.display_id, status: r.status, blocking: r.blocking,
122
+ from: r.asker?.slug, to: r.to?.slug ?? "(broadcast)", title: r.title?.slice(0, 50),
123
+ }));
124
+ console.log(render(rows, { json: !!o.json }));
125
+ }
126
+ async function answerQuestion(idOrDisplay, o) {
127
+ const ctx = await makeCtx(resolveConfig(o));
128
+ const result = await answerQuestionCore(ctx, idOrDisplay, o.body);
129
+ console.log(render([{ display_id: result.display_id, status: result.status, answered_at: result.answered_at }], { json: !!o.json }));
130
+ }
131
+ export function registerQuestion(program, g) {
132
+ const q = program.command("question").description("first-class questions (CB-Q)");
133
+ g(q.command("ask")).requiredOption("--title <t>").requiredOption("--body <b>")
134
+ .option("--to <slug>", "recipient agent (omit = broadcast)")
135
+ .option("--to-mentor", "send to your first-week mentor (your inviter)")
136
+ .option("--repo <slug>").option("--blocking")
137
+ .option("--blocks-task <CB-TASK-id>").option("--required <text>", "what a valid answer must contain")
138
+ .action(askQuestion);
139
+ g(q.command("list")).option("--status <s>", "open|answered|resolved|dropped").option("--repo <slug>").action(listQuestions);
140
+ g(q.command("answer").argument("<id>", "CB-Q-… or uuid")).requiredOption("--body <b>").action(answerQuestion);
141
+ }
142
+ //# sourceMappingURL=question.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question.js","sourceRoot":"","sources":["../../src/commands/question.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx, workspaceId, identityIsGuessed, guessedIdentityWarning } from "../client.js";
3
+ import { render } from "../output.js";
4
+ import { CodebusError } from "../errors.js";
5
+ const MSG_COLS = "id, display_id, type, subject, body, status, created_at, headline, required_action, in_reply_to, from_agent_id, agents:from_agent_id(slug)";
6
+ // Accepts a message UUID or display_id (CB-MSG-000123).
7
+ // display ids are only unique per workspace (bus_counters, 0004) — always
8
+ // scope the lookup, or a multi-workspace agent can resolve the WRONG
9
+ // workspace's message when two workspaces happen to share a display_id.
10
+ async function resolveMessageId(ctx, ws, idOrDisplay) {
11
+ if (/^CB-MSG-/i.test(idOrDisplay)) {
12
+ const { data, error } = await ctx.supabase.from("messages").select("id")
13
+ .eq("workspace_id", ws).eq("display_id", idOrDisplay.toUpperCase()).single();
14
+ if (error || !data)
15
+ throw new CodebusError(`message not found: ${idOrDisplay}`);
16
+ return data.id;
17
+ }
18
+ return idOrDisplay;
19
+ }
20
+ async function fetchMsg(ctx, id) {
21
+ const { data, error } = await ctx.supabase.from("messages").select(MSG_COLS).eq("id", id).single();
22
+ if (error || !data)
23
+ return null;
24
+ return data;
25
+ }
26
+ // Walks the in_reply_to chain from `msg` up to the root ancestor. Bounded
27
+ // depth guards against a (should-never-happen) cycle; oldest-first order for
28
+ // display (root first, `msg` itself last — the caller prints `msg` on its own).
29
+ async function loadAncestors(ctx, msg, maxDepth = 50) {
30
+ const chain = [];
31
+ let cur = msg;
32
+ for (let i = 0; i < maxDepth && cur.in_reply_to; i++) {
33
+ const parent = await fetchMsg(ctx, cur.in_reply_to);
34
+ if (!parent)
35
+ break;
36
+ chain.unshift(parent);
37
+ cur = parent;
38
+ }
39
+ return chain;
40
+ }
41
+ export async function readCmd(idOrDisplay, o) {
42
+ const ctx = await makeCtx(resolveConfig(o));
43
+ const ws = await workspaceId(ctx);
44
+ const id = await resolveMessageId(ctx, ws, idOrDisplay);
45
+ const msg = await fetchMsg(ctx, id);
46
+ if (!msg)
47
+ throw new CodebusError(`message not found: ${idOrDisplay}`);
48
+ // read_at stays a PURE "opened" marker (delivery gap #5/#6) — this never
49
+ // sets handled_at; only a reply or an explicit `codebus ack` does that.
50
+ await ctx.supabase.from("message_recipients").update({ read_at: new Date().toISOString() }).eq("message_id", id);
51
+ // Delivery gap #4: in_reply_to is written, never read. Always show at least
52
+ // immediate context; `--thread` walks the WHOLE chain back to the root.
53
+ const ancestors = msg.in_reply_to ? await loadAncestors(ctx, msg, o.thread ? 50 : 1) : [];
54
+ if (o.json) {
55
+ // Array-of-rows, matching every other command's --json convention (render()).
56
+ console.log(JSON.stringify([{ ...msg, thread: ancestors }], null, 2));
57
+ return;
58
+ }
59
+ if (identityIsGuessed(ctx))
60
+ process.stdout.write(guessedIdentityWarning(ctx, "reads"));
61
+ if (ancestors.length) {
62
+ console.log(o.thread ? "── thread ──" : "── in reply to ──");
63
+ for (const a of ancestors) {
64
+ console.log(`[${a.display_id}] ${a.agents?.slug ?? "?"}: ${a.subject ?? a.body}`);
65
+ }
66
+ console.log("── this message ──");
67
+ }
68
+ // Delivery gap #9: headline/required_action are the structured-handover
69
+ // fields (dead since 0036) — render them FIRST, ahead of the generic table.
70
+ if (msg.headline) {
71
+ const ra = msg.required_action ? ` — REQUIRED ACTION: ${msg.required_action}` : "";
72
+ console.log(`HEADLINE: ${msg.headline}${ra}`);
73
+ }
74
+ console.log(render([{
75
+ display_id: msg.display_id,
76
+ type: msg.type,
77
+ subject: msg.subject,
78
+ body: msg.body,
79
+ status: msg.status,
80
+ created_at: msg.created_at,
81
+ in_reply_to: msg.in_reply_to,
82
+ }], { json: false }));
83
+ }
84
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,357 @@
1
+ /**
2
+ * refs.ts — S4: Typed SHA-pinned knowledge refs for tasks and messages.
3
+ *
4
+ * Provides:
5
+ * - parseRef(raw): parse a single ref string into a ParsedRef
6
+ * - writeRefs(ctx, srcKind, srcId, refs): persist refs to ref_targets + evidence_links + links
7
+ * - resolveRefsCore(ctx, id, opts): list ref_targets for a src, run per-ref drift check
8
+ */
9
+ import { execSync } from "node:child_process";
10
+ import { workspaceId } from "../client.js";
11
+ import { CodebusError } from "../errors.js";
12
+ // ── Ref parser ─────────────────────────────────────────────────────────────
13
+ // CB display-id pattern: CB-<PREFIX>-<digits>
14
+ const CB_DISPLAY_ID_RE = /^CB-[A-Z]+-\d+$/i;
15
+ // path:<repo>/<file>[:line] — no absolute paths, no ".." traversal
16
+ const PATH_RE = /^path:([^/].+?)(?::(\d+))?$/;
17
+ // commit:<sha>
18
+ const COMMIT_RE = /^commit:([0-9a-f]{7,40})$/i;
19
+ /**
20
+ * Parse one ref string from the CLI (comma-separated list handled by callers).
21
+ *
22
+ * Accepted formats:
23
+ * CB-DEC-000001[@sha] → decision
24
+ * CB-DOC-000001[@sha] → artifact
25
+ * CB-PACK-000001[@sha] → pack
26
+ * CB-PR-000001[@sha] → pr
27
+ * commit:<sha> → commit
28
+ * path:<repo>/<file>[:line] → path
29
+ *
30
+ * Rejects:
31
+ * - absolute paths (starting with /)
32
+ * - ".." traversal in any segment
33
+ *
34
+ * @throws CodebusError on unrecognised or unsafe ref
35
+ */
36
+ export function parseRef(raw) {
37
+ const input = raw.trim();
38
+ // Extract optional @sha suffix from display-id refs
39
+ const atIdx = input.indexOf("@");
40
+ let base = input;
41
+ let pinnedSha;
42
+ if (atIdx > 0) {
43
+ base = input.slice(0, atIdx);
44
+ pinnedSha = input.slice(atIdx + 1) || undefined;
45
+ }
46
+ // path: prefix — check for absolute/traversal before anything else
47
+ if (base.startsWith("path:") || input.startsWith("path:")) {
48
+ const pathPart = (base.startsWith("path:") ? base : input).slice(5);
49
+ if (pathPart.startsWith("/")) {
50
+ throw new CodebusError(`ref rejected: absolute paths not allowed (got: ${raw})`);
51
+ }
52
+ if (pathPart.split("/").some((seg) => seg === "..")) {
53
+ throw new CodebusError(`ref rejected: path traversal (..) not allowed (got: ${raw})`);
54
+ }
55
+ const m = PATH_RE.exec(base.startsWith("path:") ? base : input);
56
+ if (!m)
57
+ throw new CodebusError(`ref rejected: invalid path format (expected path:<repo>/<file>[:line]) (got: ${raw})`);
58
+ return { ref_kind: "path", locator: base.startsWith("path:") ? base : input };
59
+ }
60
+ // commit: prefix
61
+ if (input.startsWith("commit:")) {
62
+ const m = COMMIT_RE.exec(input);
63
+ if (!m)
64
+ throw new CodebusError(`ref rejected: invalid commit sha (got: ${raw})`);
65
+ return { ref_kind: "commit", locator: input, pinned_sha: m[1] };
66
+ }
67
+ // CB display-id refs
68
+ if (CB_DISPLAY_ID_RE.test(base)) {
69
+ const upper = base.toUpperCase();
70
+ let ref_kind;
71
+ if (upper.startsWith("CB-DEC-")) {
72
+ ref_kind = "decision";
73
+ }
74
+ else if (upper.startsWith("CB-DOC-")) {
75
+ ref_kind = "artifact";
76
+ }
77
+ else if (upper.startsWith("CB-PACK-")) {
78
+ ref_kind = "pack";
79
+ }
80
+ else if (upper.startsWith("CB-PR-")) {
81
+ ref_kind = "pr";
82
+ }
83
+ else {
84
+ throw new CodebusError(`ref rejected: unknown CB display-id prefix (got: ${raw}). Expected CB-DEC-, CB-DOC-, CB-PACK-, CB-PR-.`);
85
+ }
86
+ return {
87
+ ref_kind,
88
+ locator: input, // full raw input as locator (including @sha if any)
89
+ target_display_id: upper, // normalised base (no @sha)
90
+ pinned_sha: pinnedSha,
91
+ };
92
+ }
93
+ throw new CodebusError(`ref rejected: unrecognised format (got: ${raw}). ` +
94
+ `Expected CB-DEC-…[@sha], CB-DOC-…[@sha], CB-PR-…[@sha], commit:<sha>, or path:<repo>/<file>[:line].`);
95
+ }
96
+ // ── HEAD SHA probe ─────────────────────────────────────────────────────────
97
+ /**
98
+ * Get the current repo HEAD short sha (7 chars) from the cwd.
99
+ * Returns undefined on any git failure (not a git repo, detached, etc.).
100
+ */
101
+ export function getHeadSha(cwd) {
102
+ try {
103
+ return execSync("git rev-parse --short HEAD", {
104
+ cwd: cwd ?? process.cwd(),
105
+ encoding: "utf-8",
106
+ stdio: ["pipe", "pipe", "pipe"],
107
+ }).trim();
108
+ }
109
+ catch {
110
+ return undefined;
111
+ }
112
+ }
113
+ // ── Write refs ─────────────────────────────────────────────────────────────
114
+ /**
115
+ * Persist parsed refs for one src (task or message).
116
+ *
117
+ * For each ref:
118
+ * 1. Insert into ref_targets (workspace-scoped, RLS-gated).
119
+ * 2. Insert into evidence_links (ref_type derived from ref_kind).
120
+ * 3. Insert into links (rel='carries_ref').
121
+ *
122
+ * src_kind must be 'task' or 'message'.
123
+ */
124
+ export async function writeRefs(ctx, wsId, srcKind, srcId, parsed) {
125
+ if (parsed.length === 0)
126
+ return;
127
+ const headSha = getHeadSha();
128
+ for (const p of parsed) {
129
+ const pinnedSha = p.pinned_sha ?? headSha ?? null;
130
+ // 1. ref_targets
131
+ const { error: rtErr } = await ctx.supabase.from("ref_targets").insert({
132
+ workspace_id: wsId,
133
+ src_kind: srcKind,
134
+ src_id: srcId,
135
+ ref_kind: p.ref_kind,
136
+ target_display_id: p.target_display_id ?? null,
137
+ pinned_sha: pinnedSha,
138
+ locator: p.locator,
139
+ });
140
+ if (rtErr)
141
+ throw new CodebusError(`ref_targets insert failed: ${rtErr.message}`);
142
+ // 2. evidence_links — map ref_kind to ref_type vocab.
143
+ // evidence_links uses subject_type (evidence_subject enum: message|task|decision),
144
+ // no workspace_id column, no subject_kind column.
145
+ const refTypeMap = {
146
+ decision: "artifact",
147
+ artifact: "artifact",
148
+ pack: "artifact",
149
+ pr: "pr",
150
+ commit: "commit",
151
+ path: "path",
152
+ };
153
+ // evidence_subject enum only has message|task|decision; message maps to message, task maps to task
154
+ const subjectType = srcKind === "task" ? "task" : "message";
155
+ const { error: elErr } = await ctx.supabase.from("evidence_links").insert({
156
+ subject_type: subjectType,
157
+ subject_id: srcId,
158
+ ref: p.locator,
159
+ ref_type: refTypeMap[p.ref_kind],
160
+ });
161
+ if (elErr)
162
+ throw new CodebusError(`evidence_links insert failed: ${elErr.message}`);
163
+ // 3. links (rel='carries_ref') — src_kind node_kind enum only has task/message
164
+ const nodeKind = srcKind; // both 'task' and 'message' are valid node_kinds
165
+ const { error: lkErr } = await ctx.supabase.from("links").insert({
166
+ workspace_id: wsId,
167
+ src_kind: nodeKind,
168
+ src_id: srcId,
169
+ rel: "carries_ref",
170
+ dst_kind: nodeKind, // dst points back to self; ref body is in ref_targets.locator
171
+ dst_id: srcId,
172
+ dst_label: p.locator,
173
+ source: "authoritative",
174
+ });
175
+ if (lkErr)
176
+ throw new CodebusError(`links insert failed: ${lkErr.message}`);
177
+ }
178
+ }
179
+ // ── Drift check ────────────────────────────────────────────────────────────
180
+ /**
181
+ * Classify drift state for a single ref given pinned and current HEAD shas.
182
+ *
183
+ * Rules (spec §S4):
184
+ * - no pinned_sha: unknown (can't compare)
185
+ * - git-fail: unknown (never silent "fresh")
186
+ * - pinned === head: fresh
187
+ * - pinned !== head: drifted
188
+ */
189
+ export function classifyDrift(opts) {
190
+ const { pinnedSha, headSha, gitFailed } = opts;
191
+ if (gitFailed || headSha === null) {
192
+ return { state: "unknown", drift_note: "git unavailable" };
193
+ }
194
+ if (!pinnedSha) {
195
+ return { state: "unknown", drift_note: "no pinned sha" };
196
+ }
197
+ // Compare up to the shorter of the two (handles short vs full sha)
198
+ const len = Math.min(pinnedSha.length, headSha.length);
199
+ if (pinnedSha.slice(0, len) === headSha.slice(0, len)) {
200
+ return { state: "fresh" };
201
+ }
202
+ return {
203
+ state: "drifted",
204
+ drift_note: `(pinned ${pinnedSha}, HEAD ${headSha})`,
205
+ };
206
+ }
207
+ // ── Resolve refs core ──────────────────────────────────────────────────────
208
+ /**
209
+ * List ref_targets for a src (task or message identified by display_id or uuid),
210
+ * per-ref drift-checked.
211
+ *
212
+ * Cross-workspace refs (target display_id not found under current JWT) → unresolvable.
213
+ * git failure → unknown (never silently fresh).
214
+ */
215
+ export async function resolveRefsCore(ctx, srcDisplayId, opts = {}) {
216
+ const ws = await workspaceId(ctx);
217
+ // Resolve src: treat CB-TASK-… or CB-MSG-… as display_id, else uuid
218
+ const srcId = await resolveSrcId(ctx, ws, srcDisplayId);
219
+ if (!srcId)
220
+ throw new CodebusError(`not found: ${srcDisplayId}`);
221
+ const { data: rows, error } = await ctx.supabase
222
+ .from("ref_targets")
223
+ .select("id,src_kind,src_id,ref_kind,locator,target_display_id,pinned_sha,note,created_at,repo_id")
224
+ .eq("src_id", srcId)
225
+ .order("created_at", { ascending: true });
226
+ if (error)
227
+ throw new CodebusError(error.message);
228
+ if (!rows || rows.length === 0)
229
+ return [];
230
+ // Probe current HEAD once per call (not per ref)
231
+ let headSha = null;
232
+ let gitFailed = false;
233
+ try {
234
+ const raw = execSync("git rev-parse --short HEAD", {
235
+ encoding: "utf-8",
236
+ stdio: ["pipe", "pipe", "pipe"],
237
+ }).trim();
238
+ headSha = raw || null;
239
+ if (!headSha)
240
+ gitFailed = true;
241
+ }
242
+ catch {
243
+ gitFailed = true;
244
+ }
245
+ const results = [];
246
+ for (const row of rows) {
247
+ // Cross-workspace check: if target_display_id is set, try to resolve it
248
+ // under the current JWT (RLS). If not found → unresolvable.
249
+ let state;
250
+ let drift_note;
251
+ let prTarget = null;
252
+ if (row.target_display_id) {
253
+ let resolved;
254
+ if (row.ref_kind === "pr") {
255
+ const { data } = await ctx.supabase.from("pull_requests")
256
+ .select("id,number,url,head_sha")
257
+ .eq("workspace_id", ws).eq("display_id", row.target_display_id.toUpperCase()).single();
258
+ // The CLI client is intentionally schema-light, so this table query
259
+ // can infer `never` in a fresh generated schema. Keep the narrow
260
+ // fields we selected without allowing that inference to erase the
261
+ // runtime PR identity returned by Supabase.
262
+ prTarget = data;
263
+ resolved = prTarget !== null;
264
+ }
265
+ else {
266
+ resolved = await resolveTargetDisplayId(ctx, ws, row.target_display_id, row.ref_kind);
267
+ }
268
+ if (!resolved) {
269
+ state = "unresolvable";
270
+ drift_note = `${row.target_display_id} not visible (cross-workspace or deleted)`;
271
+ }
272
+ else {
273
+ const d = classifyDrift({ pinnedSha: row.pinned_sha, headSha, gitFailed });
274
+ state = d.state;
275
+ drift_note = d.drift_note;
276
+ }
277
+ }
278
+ else {
279
+ // path/commit refs — check drift via sha
280
+ const d = classifyDrift({ pinnedSha: row.pinned_sha, headSha, gitFailed });
281
+ state = d.state;
282
+ drift_note = d.drift_note;
283
+ }
284
+ results.push({
285
+ id: row.id,
286
+ src_kind: row.src_kind,
287
+ src_id: row.src_id,
288
+ ref_kind: row.ref_kind,
289
+ locator: row.locator,
290
+ target_display_id: row.target_display_id ?? null,
291
+ pinned_sha: row.pinned_sha ?? null,
292
+ note: row.note ?? null,
293
+ created_at: row.created_at,
294
+ head_sha: headSha,
295
+ state,
296
+ drift_note,
297
+ target_url: prTarget?.url ?? null,
298
+ target_number: prTarget?.number ?? null,
299
+ target_head_sha: prTarget?.head_sha ?? null,
300
+ });
301
+ }
302
+ return results;
303
+ }
304
+ // ── Internal helpers ───────────────────────────────────────────────────────
305
+ /**
306
+ * Resolve a display_id or uuid to the src row uuid.
307
+ * display ids are only unique per workspace (bus_counters, 0004) — every
308
+ * display_id lookup here is scoped to `ws`, or a multi-workspace agent could
309
+ * resolve refs against the WRONG workspace's task/message.
310
+ */
311
+ async function resolveSrcId(ctx, ws, idOrDisplay) {
312
+ // UUID passthrough
313
+ if (/^[0-9a-f-]{36}$/i.test(idOrDisplay))
314
+ return idOrDisplay;
315
+ const upper = idOrDisplay.toUpperCase();
316
+ if (upper.startsWith("CB-TASK-")) {
317
+ const { data } = await ctx.supabase.from("tasks").select("id").eq("workspace_id", ws).eq("display_id", upper).single();
318
+ return data?.id ?? null;
319
+ }
320
+ if (upper.startsWith("CB-MSG-")) {
321
+ const { data } = await ctx.supabase.from("messages").select("id").eq("workspace_id", ws).eq("display_id", upper).single();
322
+ return data?.id ?? null;
323
+ }
324
+ // Fallback: try tasks, then messages
325
+ const { data: t } = await ctx.supabase.from("tasks").select("id").eq("workspace_id", ws).eq("display_id", upper).single();
326
+ if (t)
327
+ return t.id;
328
+ const { data: m } = await ctx.supabase.from("messages").select("id").eq("workspace_id", ws).eq("display_id", upper).single();
329
+ return m?.id ?? null;
330
+ }
331
+ /**
332
+ * Try to look up a target display_id in the current workspace.
333
+ * Deliberately scoped to `ws` (not just RLS-visible-anywhere): the whole
334
+ * point of this check is "is this target visible IN THIS WORKSPACE" so a
335
+ * cross-workspace/dangling ref reports unresolvable — RLS visibility alone
336
+ * would let a same-display_id row in a DIFFERENT workspace the agent also
337
+ * belongs to be mistaken for the real target (false "fresh"/"drifted"
338
+ * instead of the correct "unresolvable").
339
+ */
340
+ async function resolveTargetDisplayId(ctx, ws, displayId, refKind) {
341
+ const upper = displayId.toUpperCase();
342
+ if (refKind === "decision") {
343
+ const { data } = await ctx.supabase.from("decisions").select("id").eq("workspace_id", ws).eq("display_id", upper).single();
344
+ return !!data;
345
+ }
346
+ if (refKind === "artifact" || refKind === "pack") {
347
+ const { data } = await ctx.supabase.from("artifacts").select("id").eq("workspace_id", ws).eq("display_id", upper).single();
348
+ return !!data;
349
+ }
350
+ if (refKind === "pr") {
351
+ const { data } = await ctx.supabase.from("pull_requests").select("id").eq("workspace_id", ws).eq("display_id", upper).single();
352
+ return !!data;
353
+ }
354
+ // Unknown kind: treat as resolvable (don't block)
355
+ return true;
356
+ }
357
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/commands/refs.ts"],"names":[],"mappings":"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"}