bazilion 0.15.0 → 0.17.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 (126) hide show
  1. package/dist/cli.js +1138 -687
  2. package/dist/cli.js.map +1 -1
  3. package/dist/daemon.js +8401 -4401
  4. package/dist/daemon.js.map +1 -1
  5. package/dist/migrations/0001_init.sql +109 -0
  6. package/dist/web/client/assets/ChatPane-BI3QVX2A.js +76 -0
  7. package/dist/web/client/assets/{ConfirmDialog-CGZzom9E.js → ConfirmDialog-Qam6Ut08.js} +1 -1
  8. package/dist/web/client/assets/{FieldRow-DYNU9gWb.js → FieldRow-swJ5qn2h.js} +1 -1
  9. package/dist/web/client/assets/ProductionTeamPolicyEditor-LGw1UuF-.js +7 -0
  10. package/dist/web/client/assets/ProfileCommunicationEditor-raoau_YB.js +1 -0
  11. package/dist/web/client/assets/{ResultSourceConversation-CGhKTSTD.js → ResultSourceConversation-BEwkhFog.js} +1 -1
  12. package/dist/web/client/assets/TeamTabs-BDdTLGIf.js +1 -0
  13. package/dist/web/client/assets/TemplatesTabs-BX5hhEJ7.js +1 -0
  14. package/dist/web/client/assets/{UnsavedChangesGuard-CFQcKsrf.js → UnsavedChangesGuard-CVJtmR1D.js} +1 -1
  15. package/dist/web/client/assets/{_id-D_eKokkd.js → _id-BQPOE3gj.js} +1 -1
  16. package/dist/web/client/assets/{_id-9nCIhbVd.js → _id-BkYrUP0R.js} +1 -1
  17. package/dist/web/client/assets/_id-CriixlZD.js +1 -0
  18. package/dist/web/client/assets/_id-DHqq2W34.js +1 -0
  19. package/dist/web/client/assets/{_id-BSu3AqKA.js → _id-DmEVZIlx.js} +1 -1
  20. package/dist/web/client/assets/activity-Bzr8R18n.js +1 -0
  21. package/dist/web/client/assets/{agents-NY3VrZgB.js → agents-13oafeOA.js} +1 -1
  22. package/dist/web/client/assets/{agents-CCmiZek6.js → agents-DF4NALmJ.js} +1 -1
  23. package/dist/web/client/assets/{approvals-CPDAPgrM.js → approvals-DsG0Ijls.js} +1 -1
  24. package/dist/web/client/assets/{attention-Qra_9_OI.js → attention-DG7K25mz.js} +1 -1
  25. package/dist/web/client/assets/chevron-right-DFqFHtLy.js +1 -0
  26. package/dist/web/client/assets/config-DAaDbFhS.js +3 -0
  27. package/dist/web/client/assets/createServerFn-Dzfjt7mA.js +3 -0
  28. package/dist/web/client/assets/git-review-presentation-CzHQulDk.js +1 -0
  29. package/dist/web/client/assets/{inbox-C5W-sm1q.js → inbox-C9e7QjsX.js} +1 -1
  30. package/dist/web/client/assets/index-Dsstm2hf.js +50 -0
  31. package/dist/web/client/assets/{learning-Dr-7_7J4.js → learning-23arTd21.js} +1 -1
  32. package/dist/web/client/assets/login-BIXnBsuj.js +1 -0
  33. package/dist/web/client/assets/{mcp-BueuwQiv.js → mcp-Cdx9qAl8.js} +1 -1
  34. package/dist/web/client/assets/{members-ZikuYNcy.js → members-fotOz4rR.js} +1 -1
  35. package/dist/web/client/assets/{memory-1JUJlPrn.js → memory-C7UznVot.js} +1 -1
  36. package/dist/web/client/assets/policy-CactLW1X.js +1 -0
  37. package/dist/web/client/assets/{results-mMr8Ar2u.js → results-DqEuYnQH.js} +1 -1
  38. package/dist/web/client/assets/review-CnBSYclb.js +1 -0
  39. package/dist/web/client/assets/routes-COxMuwVz.js +1 -0
  40. package/dist/web/client/assets/{services-kfQA9cpJ.js → services-xEANwZAu.js} +1 -1
  41. package/dist/web/client/assets/{skills-C6pcgxaC.js → skills-CamV6wYM.js} +1 -1
  42. package/dist/web/client/assets/styles-C6br2xxl.css +2 -0
  43. package/dist/web/client/assets/{teams-LB0KBXY9.js → teams-B12dMSjW.js} +1 -1
  44. package/dist/web/client/assets/{teams-C6_Noz5X.js → teams-CbH43zSG.js} +1 -1
  45. package/dist/web/client/assets/{telegram-A2jaI1QM.js → telegram-muIql4u-.js} +1 -1
  46. package/dist/web/client/assets/{tokens-BGlUpJcL.js → tokens-DGFmApdF.js} +1 -1
  47. package/dist/web/client/assets/{triggers-C54_feGg.js → triggers-D8n3sCBW.js} +1 -1
  48. package/dist/web/client/assets/welcome-CMHWRZhs.js +1 -0
  49. package/dist/web/client/assets/x-BGCHwZOH.js +1 -0
  50. package/dist/web/server/assets/{ChatPane-DJ30FdFG.js → ChatPane-DybH39WK.js} +524 -15
  51. package/dist/web/server/assets/{ResultSourceConversation-zYogeOWp.js → ResultSourceConversation-BmXTcEOA.js} +1 -1
  52. package/dist/web/server/assets/{TeamTabs-TCKjCvMA.js → TeamTabs-DQXh-3ij.js} +4 -0
  53. package/dist/web/server/assets/{_id-1LwoHhJg.js → _id-BN1BPEDI.js} +1 -1
  54. package/dist/web/server/assets/{_id-DFHB9JFQ.js → _id-BYKpT2Tu.js} +1 -1
  55. package/dist/web/server/assets/{_id-B_-CDHOi2.js → _id-BqWTB8Wl.js} +1 -1
  56. package/dist/web/server/assets/{_id-BvSWsPI5.js → _id-CPfILjMa.js} +1 -1
  57. package/dist/web/server/assets/{_id-1hTvnKLN2.js → _id-C_2er0_G.js} +3 -3
  58. package/dist/web/server/assets/{_id-B2EEyStS.js → _id-DDyA9CGX.js} +1 -1
  59. package/dist/web/server/assets/{_id-DxFLSIio.js → _id-DSPFJMzf.js} +1 -1
  60. package/dist/web/server/assets/_id-DtJn-yzu.js +779 -0
  61. package/dist/web/server/assets/{_id-DDNVQx3y.js → _id-Dw3gKOGv.js} +1 -1
  62. package/dist/web/server/assets/{_id-T_8btpbB.js → _id-XkxlX036.js} +1 -1
  63. package/dist/web/server/assets/{_tanstack-start-manifest_v-DP4ZUBw3.js → _tanstack-start-manifest_v-vOXRfKJD.js} +97 -84
  64. package/dist/web/server/assets/{activity-C88qrNqv.js → activity-BX1jZBPQ.js} +1 -1
  65. package/dist/web/server/assets/{activity-5fWKPDxj.js → activity-bozPMU2v.js} +2 -2
  66. package/dist/web/server/assets/{activity-D73w4mkZ.js → activity-pYQPT3QT.js} +1 -1
  67. package/dist/web/server/assets/{agents-DRSo7lRX.js → agents-BKBfW700.js} +1 -1
  68. package/dist/web/server/assets/{agents-DB5hCSAI.js → agents-CVCfxnE2.js} +1 -1
  69. package/dist/web/server/assets/{approvals-4y9bZF4r.js → approvals-C3ya6B6U.js} +1 -1
  70. package/dist/web/server/assets/{attention-BFx8ZkmH.js → attention-l28hGCHS.js} +1 -1
  71. package/dist/web/server/assets/{auth-_eaCwhyq.js → auth-AvDFNeOv.js} +1 -1
  72. package/dist/web/server/assets/{config-B7JIfv_7.js → config-BWKn4XII.js} +1 -1
  73. package/dist/web/server/assets/{daemon-client-B06W1Qa2.js → daemon-client-Cgx-YW4l.js} +35 -0
  74. package/dist/web/server/assets/git-review-BB3M9nYg.js +26 -0
  75. package/dist/web/server/assets/git-review-f_uta4Mx.js +179 -0
  76. package/dist/web/server/assets/git-review-presentation-TJiHJhen.js +81 -0
  77. package/dist/web/server/assets/{inbox-YRpDQcvp.js → inbox-BBZiOOQs.js} +1 -1
  78. package/dist/web/server/assets/{learning-UBZb6h6M.js → learning-CheVay1i.js} +1 -1
  79. package/dist/web/server/assets/{mcp-Dv6RXMaS.js → mcp-DCBDmNtQ.js} +1 -1
  80. package/dist/web/server/assets/{members-BFTKSlOe.js → members-C2He8mrU.js} +1 -1
  81. package/dist/web/server/assets/{members-CD3GiTfF.js → members-C5FQruRZ.js} +1 -1
  82. package/dist/web/server/assets/{members-cc5SeEaW.js → members-C_2xB9pr.js} +2 -2
  83. package/dist/web/server/assets/{memory-CVqnyUaM.js → memory-4tI-UbOf.js} +1 -1
  84. package/dist/web/server/assets/{memory-C5i_GxlY.js → memory-BTcmf0sD.js} +2 -2
  85. package/dist/web/server/assets/{memory-D0PQgZAn.js → memory-rmiFNj7T.js} +1 -1
  86. package/dist/web/server/assets/{policy-Dgjb0_gK.js → policy-BGILKGHz.js} +2 -2
  87. package/dist/web/server/assets/{policy-bLKwvnja.js → policy-C3D2Q1EA.js} +1 -1
  88. package/dist/web/server/assets/{policy-C-p8HIhA.js → policy-DS7LGe--.js} +1 -1
  89. package/dist/web/server/assets/{results-Cfev4KNt.js → results-C6H42tjq.js} +1 -1
  90. package/dist/web/server/assets/{results-Cj-Dlw3C.js → results-Cgx7SrFt.js} +3 -3
  91. package/dist/web/server/assets/{results-CwEQ5EUL.js → results-_6K_zXQS.js} +1 -1
  92. package/dist/web/server/assets/review-DHhiL-JQ.js +393 -0
  93. package/dist/web/server/assets/review-DSTMCwP4.js +14 -0
  94. package/dist/web/server/assets/{router-d3sTMpMX.js → router-ElARvZzI.js} +34 -27
  95. package/dist/web/server/assets/{routes-B765DVhj.js → routes-B6x3pEW8.js} +1 -1
  96. package/dist/web/server/assets/{routes-cW4MWU18.js → routes-BgMvLvS-.js} +1 -1
  97. package/dist/web/server/assets/{routes-MIZz6uMr.js → routes-DsUzzxk4.js} +2 -2
  98. package/dist/web/server/assets/{services-BCbdn3R9.js → services-yHZroxsi.js} +1 -1
  99. package/dist/web/server/assets/{skills-Bpoa8MIp.js → skills--bIKID1Q.js} +1 -1
  100. package/dist/web/server/assets/{teams-hWGjbpUA.js → teams--a956vWL.js} +1 -1
  101. package/dist/web/server/assets/{teams-CXzwqzcE.js → teams-BbRfuVXY.js} +1 -1
  102. package/dist/web/server/assets/{telegram-DhpvtGUc.js → telegram-4kMxRtVZ.js} +1 -1
  103. package/dist/web/server/assets/{tokens-Bjp19Vkn.js → tokens-BYwTN9JZ.js} +1 -1
  104. package/dist/web/server/assets/{triggers-DJlcvXzn.js → triggers-BM6mzLuH.js} +1 -1
  105. package/dist/web/server/server.js +56 -28
  106. package/dist/worker.js +2214 -1132
  107. package/dist/worker.js.map +1 -1
  108. package/package.json +3 -3
  109. package/dist/web/client/assets/ChatPane-55j13bBj.js +0 -74
  110. package/dist/web/client/assets/ProductionTeamPolicyEditor-DT5Sl8jd.js +0 -7
  111. package/dist/web/client/assets/ProfileCommunicationEditor-TyCU5vXX.js +0 -1
  112. package/dist/web/client/assets/TeamTabs-BZHyRnbd.js +0 -1
  113. package/dist/web/client/assets/TemplatesTabs-BHzkPMRC.js +0 -1
  114. package/dist/web/client/assets/_id-CGd21j3k.js +0 -1
  115. package/dist/web/client/assets/_id-SRMFlIgP.js +0 -1
  116. package/dist/web/client/assets/activity-Cn2-9PpZ.js +0 -1
  117. package/dist/web/client/assets/chevron-right-DXE4CWf2.js +0 -1
  118. package/dist/web/client/assets/config-D8EO0LPB.js +0 -3
  119. package/dist/web/client/assets/index-BUhhk_u9.js +0 -52
  120. package/dist/web/client/assets/login-Bu5UxbJh.js +0 -1
  121. package/dist/web/client/assets/policy-DbkhsFNA.js +0 -1
  122. package/dist/web/client/assets/routes-DJYB-MS9.js +0 -1
  123. package/dist/web/client/assets/styles-CcNf8jT_.css +0 -2
  124. package/dist/web/client/assets/welcome-DyUIswRi.js +0 -1
  125. package/dist/web/client/assets/x-BY2MPLr9.js +0 -1
  126. package/dist/web/server/assets/_id-CDBtO_jL.js +0 -381
@@ -1,9 +1,395 @@
1
+ import { r as fetchSnapshotApplicability } from "./git-review-BB3M9nYg.js";
1
2
  import { t as Button } from "./Button-Dsnw22OF.js";
3
+ import { n as applicabilityWarns, t as applicabilityLabel } from "./git-review-presentation-TJiHJhen.js";
2
4
  import { t as ResultCard } from "./ResultCard-B3zD9N0t.js";
3
5
  import { forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState, useSyncExternalStore } from "react";
4
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
7
  import DOMPurify from "dompurify";
6
8
  import { marked } from "marked";
9
+ //#region src/lib/coding-presentation.ts
10
+ /** Presentation only: excerpts are never used for authorization or receipt validity. */
11
+ function codingFailureSummary(diagnostic) {
12
+ const error = diagnostic.split("\n").map((line) => line.trim()).find((line) => /^(?:[A-Za-z]*Error(?: \[[A-Z_]+\])?:|ERR_[A-Z_]+\b)/.test(line));
13
+ if (!error) return null;
14
+ return error.length > 240 ? `${error.slice(0, 237)}…` : error;
15
+ }
16
+ function inboxUpdateLabel(body) {
17
+ const header = body.split("\n").find((line) => line.startsWith("--- from "));
18
+ if (!header) return "Teammate update received";
19
+ const match = /^--- from (.+?) \(message [0-9a-f-]+(?:, reply to [0-9a-f-]+)?\) ---$/.exec(header);
20
+ if (!match) return "Teammate update received";
21
+ const name = match[1]?.replace(/ \([0-9a-f-]{36}\)$/, "").trim();
22
+ if (!name || /^[0-9a-f-]{36}$/.test(name)) return "Teammate update received";
23
+ return `Update from ${name.slice(0, 100)}`;
24
+ }
25
+ //#endregion
26
+ //#region src/lib/coding-log.ts
27
+ /** Bounded first page. Larger reads and search are a later iteration. */
28
+ var CODING_LOG_PAGE_BYTES = 65536;
29
+ /**
30
+ * Read a retained coding log through the same-origin `/api` proxy.
31
+ *
32
+ * The daemon stays the authority: it re-checks Team membership and disclosure
33
+ * state on every call, so holding an opaque reference in history grants nothing
34
+ * on its own. `fetchImpl` is injectable for tests.
35
+ */
36
+ async function fetchRetainedCodingLog(reference, fetchImpl = fetch) {
37
+ const base = `/api/teams/${encodeURIComponent(reference.teamId)}/coding-commands/${encodeURIComponent(reference.commandId)}/log`;
38
+ try {
39
+ const response = await fetchImpl(`${base}?limit=${CODING_LOG_PAGE_BYTES}`, { headers: { accept: "application/json" } });
40
+ if (response.status === 403) return { status: "not-shared" };
41
+ if (response.status === 404) return { status: "missing" };
42
+ if (!response.ok) return {
43
+ status: "unavailable",
44
+ message: `Request failed (${response.status}).`
45
+ };
46
+ const body = await response.json();
47
+ const view = readView(body);
48
+ if (!view) return {
49
+ status: "unavailable",
50
+ message: "Unexpected response from the daemon."
51
+ };
52
+ if (field(body, "page") === null) return { status: "not-shared" };
53
+ const page = readPage(field(body, "page"));
54
+ if (!page) return {
55
+ status: "unavailable",
56
+ message: "Unexpected response from the daemon."
57
+ };
58
+ return {
59
+ status: "available",
60
+ page,
61
+ view
62
+ };
63
+ } catch {
64
+ return {
65
+ status: "unavailable",
66
+ message: "The daemon could not be reached."
67
+ };
68
+ }
69
+ }
70
+ function readView(body) {
71
+ const view = field(body, "view");
72
+ if (!isRecord(view)) return null;
73
+ if (typeof view.commandId !== "string" || typeof view.availability !== "string") return null;
74
+ if (typeof view.byteLength !== "number") return null;
75
+ return view;
76
+ }
77
+ function readPage(page) {
78
+ if (!isRecord(page)) return null;
79
+ if (typeof page.text !== "string" || typeof page.availability !== "string") return null;
80
+ if (typeof page.offset !== "number" || typeof page.hasMore !== "boolean") return null;
81
+ if (typeof page.byteLength !== "number") return null;
82
+ return page;
83
+ }
84
+ function field(body, key) {
85
+ return isRecord(body) ? body[key] : void 0;
86
+ }
87
+ function isRecord(value) {
88
+ return typeof value === "object" && value !== null && !Array.isArray(value);
89
+ }
90
+ //#endregion
91
+ //#region src/components/CodingToolResult.tsx
92
+ /**
93
+ * Presents already-authorized chat text. A masked history card may additionally
94
+ * offer retained output, but that read is an explicit operator action through
95
+ * the daemon's releasing route — nothing is disclosed by rendering the card.
96
+ */
97
+ function CodingToolResult({ name, body, pending = false, log }) {
98
+ if (!pending && body === "Coding context or command evidence retained privately. Captured transport output follows its communication approval; ask the Agent for the relevant result.") return /* @__PURE__ */ jsxs("details", {
99
+ className: "py-1 text-xs font-sans",
100
+ "aria-label": "Private command details",
101
+ children: [
102
+ /* @__PURE__ */ jsx("summary", {
103
+ className: "cursor-pointer",
104
+ children: "Detailed output isn’t included in this history view"
105
+ }),
106
+ /* @__PURE__ */ jsx("p", {
107
+ className: "mt-1",
108
+ children: "The Agent’s summary is shown in the conversation. Ask the Agent to summarize its retained command result if you need more detail."
109
+ }),
110
+ log && /* @__PURE__ */ jsx(RetainedLogControl, { reference: log })
111
+ ]
112
+ });
113
+ let parsed;
114
+ try {
115
+ parsed = JSON.parse(body);
116
+ } catch {
117
+ return /* @__PURE__ */ jsx("span", { children: body });
118
+ }
119
+ if (!parsed || typeof parsed !== "object") return /* @__PURE__ */ jsx("span", { children: body });
120
+ if (pending) {
121
+ const input = parsed;
122
+ return /* @__PURE__ */ jsxs("p", {
123
+ className: "py-1 break-words",
124
+ children: [
125
+ name === "coding_command" ? "Running" : "Inspecting",
126
+ ":",
127
+ " ",
128
+ typeof input.command === "string" ? input.command : typeof input.target === "string" ? input.target : "command evidence"
129
+ ]
130
+ });
131
+ }
132
+ if (name === "repository_context") {
133
+ const report = parsed;
134
+ if (!Array.isArray(report.instructions?.files)) return /* @__PURE__ */ jsx("span", { children: body });
135
+ return /* @__PURE__ */ jsxs("details", {
136
+ className: "py-1",
137
+ children: [
138
+ /* @__PURE__ */ jsxs("summary", {
139
+ className: "cursor-pointer",
140
+ children: [
141
+ "Repository: ",
142
+ report.target,
143
+ " ·",
144
+ " ",
145
+ report.instructions.state === "complete" ? `${report.instructions.files.length} instruction files` : "instructions unavailable"
146
+ ]
147
+ }),
148
+ report.instructions.files.map((file) => /* @__PURE__ */ jsx("p", { children: file.path }, file.path)),
149
+ /* @__PURE__ */ jsxs("p", { children: [
150
+ report.commands?.candidates?.length ?? 0,
151
+ " suggested commands ·",
152
+ " ",
153
+ report.git?.state === "available" ? report.git.branch : "Git unavailable"
154
+ ] }),
155
+ /* @__PURE__ */ jsx("pre", {
156
+ className: "max-h-64 overflow-auto whitespace-pre-wrap break-words",
157
+ children: body
158
+ })
159
+ ]
160
+ });
161
+ }
162
+ if (name === "coding_log") {
163
+ const page = parsed;
164
+ if (typeof page.text !== "string" || typeof page.availability !== "string") return /* @__PURE__ */ jsx("span", { children: body });
165
+ return /* @__PURE__ */ jsxs("details", {
166
+ className: "py-1",
167
+ "aria-label": "Retained command output",
168
+ children: [
169
+ /* @__PURE__ */ jsxs("summary", {
170
+ className: "cursor-pointer",
171
+ children: [
172
+ "Retained output: ",
173
+ page.availability,
174
+ page.hasMore ? " · more available" : ""
175
+ ]
176
+ }),
177
+ /* @__PURE__ */ jsx("pre", {
178
+ className: "max-h-64 overflow-auto whitespace-pre-wrap break-words",
179
+ children: page.text
180
+ }),
181
+ /* @__PURE__ */ jsxs("p", {
182
+ className: "text-xs",
183
+ children: [
184
+ "bytes ",
185
+ typeof page.offset === "number" ? page.offset : 0,
186
+ "–",
187
+ (typeof page.offset === "number" ? page.offset : 0) + page.text.length,
188
+ " of",
189
+ " ",
190
+ typeof page.byteLength === "number" ? page.byteLength : 0
191
+ ]
192
+ })
193
+ ]
194
+ });
195
+ }
196
+ if (name === "coding_environment") {
197
+ const value = parsed;
198
+ if (typeof value.posture !== "string") return /* @__PURE__ */ jsx("span", { children: body });
199
+ return /* @__PURE__ */ jsxs("details", {
200
+ className: "py-1",
201
+ children: [
202
+ /* @__PURE__ */ jsxs("summary", {
203
+ className: "cursor-pointer",
204
+ children: [
205
+ "Environment: ",
206
+ value.posture,
207
+ " · ",
208
+ value.cwd
209
+ ]
210
+ }),
211
+ /* @__PURE__ */ jsx("p", {
212
+ className: "break-all",
213
+ children: value.imageId ?? "Host runtime"
214
+ }),
215
+ Array.isArray(value.restrictions) && value.restrictions.filter((x) => typeof x === "string").map((text) => /* @__PURE__ */ jsx("p", { children: text }, text))
216
+ ]
217
+ });
218
+ }
219
+ const view = parsed;
220
+ const receipt = name === "coding_receipt" ? view.receipt : parsed;
221
+ if (!receipt || typeof receipt.state !== "string" || typeof receipt.input?.command !== "string" || typeof receipt.input?.cwd !== "string") return /* @__PURE__ */ jsx("span", { children: body });
222
+ const failure = receipt.state === "failed" && typeof receipt.diagnostic === "string" ? codingFailureSummary(receipt.diagnostic) : null;
223
+ return /* @__PURE__ */ jsxs("div", {
224
+ className: "py-2",
225
+ "aria-label": "Coding command result",
226
+ children: [
227
+ /* @__PURE__ */ jsxs("p", {
228
+ className: "font-sans",
229
+ children: [
230
+ /* @__PURE__ */ jsx("strong", {
231
+ className: receipt.state === "succeeded" ? "text-sapphire-deep" : "text-mocha",
232
+ children: receipt.state.replaceAll("_", " ")
233
+ }),
234
+ " ",
235
+ "· ",
236
+ receipt.input.purpose,
237
+ typeof receipt.exitCode === "number" ? ` · exit ${receipt.exitCode}` : "",
238
+ name === "coding_receipt" ? ` · ${view.applicability}` : ""
239
+ ]
240
+ }),
241
+ /* @__PURE__ */ jsx("p", {
242
+ className: "whitespace-pre-wrap break-words",
243
+ children: receipt.input.command
244
+ }),
245
+ /* @__PURE__ */ jsxs("p", {
246
+ className: "text-xs",
247
+ children: [
248
+ receipt.input.cwd,
249
+ " · ",
250
+ receipt.environment?.posture,
251
+ " · result at execution time"
252
+ ]
253
+ }),
254
+ failure && /* @__PURE__ */ jsx("p", {
255
+ className: "mt-1 font-sans text-rose-baziu",
256
+ "aria-label": "Command failure summary",
257
+ children: failure
258
+ }),
259
+ typeof receipt.reason === "string" && /* @__PURE__ */ jsx("p", { children: receipt.reason }),
260
+ /* @__PURE__ */ jsxs("details", { children: [
261
+ /* @__PURE__ */ jsx("summary", {
262
+ className: "cursor-pointer",
263
+ children: "Output and evidence"
264
+ }),
265
+ /* @__PURE__ */ jsx("pre", {
266
+ className: "max-h-64 overflow-auto whitespace-pre-wrap break-words",
267
+ children: receipt.diagnostic
268
+ }),
269
+ receipt.truncated && /* @__PURE__ */ jsx("p", { children: "Output truncated." }),
270
+ /* @__PURE__ */ jsxs("p", {
271
+ className: "break-all",
272
+ children: ["coding-receipt:", receipt.id]
273
+ }),
274
+ /* @__PURE__ */ jsx(SourceApplicability, {
275
+ teamId: receipt.teamId,
276
+ after: receipt.sourceAfter ?? null,
277
+ before: receipt.sourceBefore ?? null
278
+ }),
279
+ receipt.environment?.imageId && /* @__PURE__ */ jsx("p", {
280
+ className: "break-all",
281
+ children: receipt.environment.imageId
282
+ })
283
+ ] })
284
+ ]
285
+ });
286
+ }
287
+ /**
288
+ * Whether this result's tested source still matches the current source (BAZ-042 criterion 4).
289
+ *
290
+ * Nothing is assumed from the fact that a result exists: a receipt with no captured source reads as
291
+ * **Not checked**, and the verdict is loaded only when the operator asks for it.
292
+ */
293
+ function SourceApplicability({ teamId, after, before }) {
294
+ const [state, setState] = useState(null);
295
+ const [loading, setLoading] = useState(false);
296
+ async function check() {
297
+ if (!after) return;
298
+ setLoading(true);
299
+ try {
300
+ setState(await fetchSnapshotApplicability({ data: {
301
+ teamId,
302
+ snapshotId: after.id
303
+ } }));
304
+ } finally {
305
+ setLoading(false);
306
+ }
307
+ }
308
+ const verdict = state?.status === "ok" ? state : null;
309
+ const label = applicabilityLabel(verdict);
310
+ return /* @__PURE__ */ jsxs("p", {
311
+ className: applicabilityWarns(verdict) ? "text-rose-baziu" : void 0,
312
+ children: [
313
+ label,
314
+ after ? /* @__PURE__ */ jsxs(Fragment, { children: [
315
+ " · tested version ",
316
+ /* @__PURE__ */ jsx("span", {
317
+ className: "break-all font-mono",
318
+ children: after.id.slice(0, 12)
319
+ }),
320
+ after.complete ? "" : " (incomplete)",
321
+ verdict === null && /* @__PURE__ */ jsxs(Fragment, { children: [" ", /* @__PURE__ */ jsx(Button, {
322
+ variant: "ghost",
323
+ disabled: loading,
324
+ onClick: () => void check(),
325
+ children: loading ? "Checking…" : "Check applicability"
326
+ })] }),
327
+ state?.status === "unavailable" && /* @__PURE__ */ jsxs("span", { children: [" · ", state.message] })
328
+ ] }) : " · no source snapshot was captured for this result",
329
+ before && /* @__PURE__ */ jsxs(Fragment, { children: [" · started from ", /* @__PURE__ */ jsx("span", {
330
+ className: "break-all font-mono",
331
+ children: before.id.slice(0, 12)
332
+ })] })
333
+ ]
334
+ });
335
+ }
336
+ /**
337
+ * Explicit operator read of a retained log. Loads a single bounded first page
338
+ * on demand; the daemon re-authorizes every call and reports a held log as
339
+ * `not-shared` so it can never be mistaken for an empty result.
340
+ */
341
+ function RetainedLogControl({ reference }) {
342
+ const [result, setResult] = useState(null);
343
+ const [loading, setLoading] = useState(false);
344
+ async function load() {
345
+ setLoading(true);
346
+ try {
347
+ setResult(await fetchRetainedCodingLog(reference));
348
+ } finally {
349
+ setLoading(false);
350
+ }
351
+ }
352
+ if (result === null) return /* @__PURE__ */ jsx("p", {
353
+ className: "mt-2",
354
+ children: /* @__PURE__ */ jsx(Button, {
355
+ variant: "ghost",
356
+ disabled: loading,
357
+ onClick: () => void load(),
358
+ children: loading ? "Loading…" : "Show retained output"
359
+ })
360
+ });
361
+ if (result.status === "not-shared") return /* @__PURE__ */ jsx("p", {
362
+ className: "mt-2",
363
+ children: "This command’s output hasn’t been shared with the conversation yet."
364
+ });
365
+ if (result.status === "missing") return /* @__PURE__ */ jsx("p", {
366
+ className: "mt-2",
367
+ children: "This retained output is no longer available."
368
+ });
369
+ if (result.status === "unavailable") return /* @__PURE__ */ jsx("p", {
370
+ className: "mt-2",
371
+ role: "alert",
372
+ children: result.message
373
+ });
374
+ return /* @__PURE__ */ jsxs("div", {
375
+ className: "mt-2",
376
+ children: [/* @__PURE__ */ jsx("pre", {
377
+ className: "max-h-64 overflow-auto whitespace-pre-wrap break-words rounded-sm bg-[rgba(42,31,22,0.04)] p-2",
378
+ children: result.page.text
379
+ }), /* @__PURE__ */ jsxs("p", { children: [
380
+ "Retained output: ",
381
+ result.page.availability,
382
+ result.page.hasMore ? " · earlier output omitted" : "",
383
+ " · bytes ",
384
+ result.page.offset,
385
+ "–",
386
+ result.page.offset + result.page.text.length,
387
+ " of ",
388
+ result.page.byteLength
389
+ ] })]
390
+ });
391
+ }
392
+ //#endregion
7
393
  //#region src/lib/md.ts
8
394
  var installed = false;
9
395
  function install() {
@@ -1094,7 +1480,8 @@ function projectMessages(msgs) {
1094
1480
  kind: isError ? "error" : "result",
1095
1481
  id: m.toolCallId ?? "",
1096
1482
  name: m.toolName ?? "",
1097
- body: m.content
1483
+ body: m.content,
1484
+ ...m.codingLog ? { codingLog: m.codingLog } : {}
1098
1485
  });
1099
1486
  if (m.result) {
1100
1487
  entries.push({
@@ -1117,6 +1504,7 @@ function ChatPane({ agentId, agentName, initialMessages, initialSessionHead }) {
1117
1504
  const markdownReady = useSyncExternalStore(subscribeToHydration, browserMarkdownReady, serverMarkdownReady);
1118
1505
  const [serverMessages, setServerMessages] = useState(initialMessages);
1119
1506
  const [liveEntries, setLiveEntries] = useState([]);
1507
+ const deliveredCoding = useRef(/* @__PURE__ */ new Map());
1120
1508
  const [systemBubbles, setSystemBubbles] = useState([]);
1121
1509
  const [thinking, setThinking] = useState(false);
1122
1510
  const [streaming, setStreaming] = useState(false);
@@ -1154,6 +1542,7 @@ function ChatPane({ agentId, agentName, initialMessages, initialSessionHead }) {
1154
1542
  currentAbortRef.current?.abort();
1155
1543
  currentAbortRef.current = null;
1156
1544
  commandApprovalTurnRef.current = false;
1545
+ deliveredCoding.current.clear();
1157
1546
  setServerMessages(initialMessages);
1158
1547
  setLiveEntries([]);
1159
1548
  setSystemBubbles([]);
@@ -1673,6 +2062,10 @@ function ChatPane({ agentId, agentName, initialMessages, initialSessionHead }) {
1673
2062
  setLiveEntries((entries) => upsertCommandApprovalEntry(entries, ev.approval));
1674
2063
  return;
1675
2064
  }
2065
+ if (ev.type === "coding_progress") {
2066
+ setLiveEntries((prev) => upsertCodingProgress(prev, ev));
2067
+ return;
2068
+ }
1676
2069
  if (ev.type === "tool_call" || ev.type === "tool_result" || ev.type === "tool_error") {
1677
2070
  setThinking(ev.type !== "tool_call");
1678
2071
  const item = ev.type === "tool_call" ? {
@@ -1691,9 +2084,23 @@ function ChatPane({ agentId, agentName, initialMessages, initialSessionHead }) {
1691
2084
  name: ev.name,
1692
2085
  body: ev.error
1693
2086
  };
2087
+ if (ev.type === "tool_result" && [
2088
+ "repository_context",
2089
+ "coding_environment",
2090
+ "coding_command",
2091
+ "coding_receipt",
2092
+ "coding_log",
2093
+ "source_snapshot"
2094
+ ].includes(ev.name)) {
2095
+ deliveredCoding.current.set(`${ev.name}:${ev.id}`, ev.result);
2096
+ while (deliveredCoding.current.size > 20) deliveredCoding.current.delete(deliveredCoding.current.keys().next().value);
2097
+ }
1694
2098
  const images = ev.type === "tool_result" ? ev.images : void 0;
1695
2099
  setLiveEntries((prev) => {
1696
- const next = [...prev];
2100
+ const next = [...prev.map((entry) => entry.type === "tool" ? {
2101
+ ...entry,
2102
+ items: entry.items.filter((i) => !(i.kind === "progress" && i.id === ev.id))
2103
+ } : entry)];
1697
2104
  const last = next[next.length - 1];
1698
2105
  if (last?.type === "tool") next[next.length - 1] = {
1699
2106
  type: "tool",
@@ -1802,7 +2209,14 @@ function ChatPane({ agentId, agentName, initialMessages, initialSessionHead }) {
1802
2209
  send(input);
1803
2210
  }
1804
2211
  }
1805
- const baseEntries = projectMessages(serverMessages);
2212
+ const baseEntries = projectMessages(serverMessages.map((message) => {
2213
+ if (message.role !== "tool" || !message.toolCallId || !message.toolName) return message;
2214
+ const body = deliveredCoding.current.get(`${message.toolName}:${message.toolCallId}`);
2215
+ return body === void 0 ? message : {
2216
+ ...message,
2217
+ content: body
2218
+ };
2219
+ }));
1806
2220
  visibleEntryCountRef.current = baseEntries.length + liveEntries.length;
1807
2221
  const lastUserIdx = (() => {
1808
2222
  if (liveEntries.length > 0 || turnBusy) return -1;
@@ -2108,15 +2522,23 @@ function Bubble({ entry, markdownReady, isLastUser, isWillDrop, onEdit, onComman
2108
2522
  if (entry.type === "user") {
2109
2523
  if (entry.content.startsWith(INBOX_WAKE_PREFIX)) {
2110
2524
  const body = entry.content.slice(24);
2111
- return /* @__PURE__ */ jsxs("div", {
2112
- className: `my-4 flex flex-col items-end ${dropCls}`,
2113
- children: [/* @__PURE__ */ jsx("span", {
2114
- className: "mb-1 text-[0.72em] font-semibold uppercase tracking-wider text-mocha opacity-90",
2115
- children: "inbox"
2116
- }), /* @__PURE__ */ jsx("div", {
2117
- className: "bubble-content max-w-[85%] whitespace-pre-wrap break-words rounded-[14px_14px_4px_14px] border border-fawn border-l-[3px] border-l-mocha-light bg-ivory px-3 py-2 font-mono text-[0.88em] leading-[1.5] text-mocha",
2118
- children: body
2119
- })]
2525
+ return /* @__PURE__ */ jsxs("details", {
2526
+ className: `my-3 rounded-lg border border-fawn bg-ivory px-3 py-2 text-sm text-mocha ${dropCls}`,
2527
+ "aria-label": "Teammate update",
2528
+ children: [
2529
+ /* @__PURE__ */ jsx("summary", {
2530
+ className: "cursor-pointer font-medium",
2531
+ children: inboxUpdateLabel(body)
2532
+ }),
2533
+ /* @__PURE__ */ jsx("p", {
2534
+ className: "mt-2 text-xs",
2535
+ children: "Original message and Agent instructions"
2536
+ }),
2537
+ /* @__PURE__ */ jsx("pre", {
2538
+ className: "mt-1 max-h-64 overflow-auto whitespace-pre-wrap break-words text-xs",
2539
+ children: body
2540
+ })
2541
+ ]
2120
2542
  });
2121
2543
  }
2122
2544
  return /* @__PURE__ */ jsxs("div", {
@@ -2354,7 +2776,52 @@ function commandApprovalStatusFromConflict(message) {
2354
2776
  default: return null;
2355
2777
  }
2356
2778
  }
2779
+ /** Insert or replace the live progress tail for one coding tool call. */
2780
+ function upsertCodingProgress(entries, ev) {
2781
+ const progress = {
2782
+ kind: "progress",
2783
+ id: ev.id,
2784
+ name: "coding_command",
2785
+ body: ev.output,
2786
+ elapsedMs: ev.elapsedMs,
2787
+ truncated: ev.truncated
2788
+ };
2789
+ for (let i = entries.length - 1; i >= 0; i--) {
2790
+ const entry = entries[i];
2791
+ if (entry?.type !== "tool") continue;
2792
+ const at = entry.items.findIndex((item) => item.id === ev.id);
2793
+ if (at < 0) continue;
2794
+ const items = [...entry.items];
2795
+ items[at] = progress;
2796
+ const next = [...entries];
2797
+ next[i] = {
2798
+ type: "tool",
2799
+ items
2800
+ };
2801
+ return next;
2802
+ }
2803
+ const last = entries[entries.length - 1];
2804
+ if (last?.type === "tool") return [...entries.slice(0, -1), {
2805
+ type: "tool",
2806
+ items: [...last.items, progress]
2807
+ }];
2808
+ return [...entries, {
2809
+ type: "tool",
2810
+ items: [progress]
2811
+ }];
2812
+ }
2357
2813
  function ToolGroup({ items, dropCls }) {
2814
+ const codingNames = [
2815
+ "repository_context",
2816
+ "coding_command",
2817
+ "coding_environment",
2818
+ "coding_receipt",
2819
+ "coding_log",
2820
+ "source_snapshot",
2821
+ "send_message"
2822
+ ];
2823
+ const hasCoding = items.some((item) => codingNames.includes(item.name));
2824
+ const visibleItems = items.filter((item) => !(item.kind === "call" && codingNames.includes(item.name) && items.some((other) => other.id === item.id && other.kind !== "call")));
2358
2825
  const [expanded, setExpanded] = useState(false);
2359
2826
  const contentRef = useRef(null);
2360
2827
  const [overflows, setOverflows] = useState(false);
@@ -2368,12 +2835,12 @@ function ToolGroup({ items, dropCls }) {
2368
2835
  children: [/* @__PURE__ */ jsxs("div", {
2369
2836
  ref: contentRef,
2370
2837
  className: "relative overflow-hidden",
2371
- style: { maxHeight: expanded ? "none" : `${TOOL_GROUP_MAX_HEIGHT_PX}px` },
2372
- children: [items.map((it, i) => /* @__PURE__ */ jsx(ToolLine, { item: it }, i)), overflows && !expanded && /* @__PURE__ */ jsx("div", {
2838
+ style: { maxHeight: expanded || hasCoding ? "none" : `${TOOL_GROUP_MAX_HEIGHT_PX}px` },
2839
+ children: [visibleItems.map((it, i) => /* @__PURE__ */ jsx(ToolLine, { item: it }, i)), overflows && !expanded && !hasCoding && /* @__PURE__ */ jsx("div", {
2373
2840
  className: "pointer-events-none absolute inset-x-0 bottom-0 h-10",
2374
2841
  style: { background: "linear-gradient(to bottom, rgba(247,240,229,0), var(--color-ivory))" }
2375
2842
  })]
2376
- }), overflows && /* @__PURE__ */ jsx("button", {
2843
+ }), overflows && !hasCoding && /* @__PURE__ */ jsx("button", {
2377
2844
  type: "button",
2378
2845
  onClick: () => setExpanded((v) => !v),
2379
2846
  className: "mt-2 rounded-sm border border-fawn bg-transparent px-2 py-0.5 text-[0.9em] text-mocha hover:border-sapphire hover:text-sapphire-deep",
@@ -2382,6 +2849,48 @@ function ToolGroup({ items, dropCls }) {
2382
2849
  });
2383
2850
  }
2384
2851
  function ToolLine({ item }) {
2852
+ if (item.name === "send_message" && item.kind !== "error") return /* @__PURE__ */ jsxs("details", {
2853
+ className: "py-1 font-sans text-sm",
2854
+ children: [/* @__PURE__ */ jsx("summary", {
2855
+ className: "cursor-pointer",
2856
+ children: item.kind === "call" ? "Sending teammate message…" : item.body.startsWith("sent message ") ? "Teammate message sent" : "Teammate message status"
2857
+ }), /* @__PURE__ */ jsx("pre", {
2858
+ className: "mt-1 max-h-64 overflow-auto whitespace-pre-wrap break-words text-xs",
2859
+ children: item.body
2860
+ })]
2861
+ });
2862
+ if (item.kind === "progress") return /* @__PURE__ */ jsxs("div", {
2863
+ className: "py-1",
2864
+ "aria-label": "Live coding progress",
2865
+ children: [
2866
+ /* @__PURE__ */ jsxs("p", {
2867
+ className: "font-sans",
2868
+ children: [
2869
+ "Running coding command · ",
2870
+ Math.max(0, Math.round((item.elapsedMs ?? 0) / 1e3)),
2871
+ "s"
2872
+ ]
2873
+ }),
2874
+ /* @__PURE__ */ jsx("pre", {
2875
+ className: "max-h-64 overflow-auto whitespace-pre-wrap break-words",
2876
+ children: item.body
2877
+ }),
2878
+ item.truncated && /* @__PURE__ */ jsx("p", { children: "Earlier output omitted; the retained log holds more." })
2879
+ ]
2880
+ });
2881
+ if (item.kind !== "error" && [
2882
+ "repository_context",
2883
+ "coding_command",
2884
+ "coding_environment",
2885
+ "coding_receipt",
2886
+ "coding_log",
2887
+ "source_snapshot"
2888
+ ].includes(item.name)) return /* @__PURE__ */ jsx(CodingToolResult, {
2889
+ name: item.name,
2890
+ body: item.body,
2891
+ pending: item.kind === "call",
2892
+ log: item.codingLog
2893
+ });
2385
2894
  if (item.kind === "call") {
2386
2895
  const args = prettyArgs(item.body);
2387
2896
  const multiLine = args.includes("\n");
@@ -1,5 +1,5 @@
1
1
  import { t as Button } from "./Button-Dsnw22OF.js";
2
- import { n as ResultTranscript } from "./ChatPane-DJ30FdFG.js";
2
+ import { n as ResultTranscript } from "./ChatPane-DybH39WK.js";
3
3
  import { useEffect, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/ResultSourceConversation.tsx
@@ -20,6 +20,10 @@ var TABS = [
20
20
  suffix: "/memory",
21
21
  label: "Memory"
22
22
  },
23
+ {
24
+ suffix: "/review",
25
+ label: "Review"
26
+ },
23
27
  {
24
28
  suffix: "/results",
25
29
  label: "Results"
@@ -2,7 +2,7 @@ import { n as createServerFn } from "../server.js";
2
2
  import { t as createSsrRpc } from "./createSsrRpc-6LHNEsSK.js";
3
3
  import { createFileRoute, lazyRouteComponent, redirect } from "@tanstack/react-router";
4
4
  //#region src/routes/agents/$id/index.tsx
5
- var $$splitComponentImporter = () => import("./_id-1hTvnKLN2.js");
5
+ var $$splitComponentImporter = () => import("./_id-C_2er0_G.js");
6
6
  var fetchAgent = createServerFn({ method: "POST" }).validator((d) => d).handler(createSsrRpc("846c9081aed17057351730985f133b0aab67a5dabfca9562552829a90ff30849"));
7
7
  var Route = createFileRoute("/agents/$id/")({
8
8
  validateSearch: (search) => ({
@@ -2,7 +2,7 @@ import { n as createServerFn } from "../server.js";
2
2
  import { t as createSsrRpc } from "./createSsrRpc-6LHNEsSK.js";
3
3
  import { createFileRoute, lazyRouteComponent, redirect } from "@tanstack/react-router";
4
4
  //#region src/routes/templates/agents/$id/index.tsx
5
- var $$splitComponentImporter = () => import("./_id-B_-CDHOi2.js");
5
+ var $$splitComponentImporter = () => import("./_id-BqWTB8Wl.js");
6
6
  var fetchProfile = createServerFn({ method: "POST" }).validator((d) => d).handler(createSsrRpc("032d74b7d41c718191dbdde6b06ba44993340ce1154af1fa6723a6d4f7a7236e"));
7
7
  var Route = createFileRoute("/templates/agents/$id/")({
8
8
  loader: async ({ params }) => {
@@ -1,4 +1,4 @@
1
- import { t as Route } from "./_id-DFHB9JFQ.js";
1
+ import { t as Route } from "./_id-BYKpT2Tu.js";
2
2
  import { r as PageShell } from "./Page-Bz-ydB8j.js";
3
3
  import { t as UnsavedChangesGuard } from "./UnsavedChangesGuard-CiStXyBI.js";
4
4
  import { t as DEFAULT_PROFILE_COMMUNICATION } from "./team-policy-vPG01onj.js";
@@ -1,6 +1,6 @@
1
1
  import { n as createServerFn } from "../server.js";
2
2
  import { t as createServerRpc } from "./createServerRpc-B7Yr1K8i.js";
3
- import { n as daemonClient, r as ApiClientError } from "./daemon-client-B06W1Qa2.js";
3
+ import { n as daemonClient, r as ApiClientError } from "./daemon-client-Cgx-YW4l.js";
4
4
  //#region src/routes/agents/$id/index.tsx?tss-serverfn-split
5
5
  var fetchAgent_createServerFn_handler = createServerRpc({
6
6
  id: "846c9081aed17057351730985f133b0aab67a5dabfca9562552829a90ff30849",