@inhuman.tools/harness-sdk 0.0.0-stage → 0.1.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 (123) hide show
  1. package/LICENSE.md +7 -0
  2. package/dist/client-agents-tree.d.ts +123 -0
  3. package/dist/client-agents-tree.d.ts.map +1 -0
  4. package/dist/client-agents-tree.js +504 -0
  5. package/dist/client-agents-tree.js.map +1 -0
  6. package/dist/client-agents.d.ts +50 -0
  7. package/dist/client-agents.d.ts.map +1 -0
  8. package/dist/client-agents.js +299 -0
  9. package/dist/client-agents.js.map +1 -0
  10. package/dist/client.d.ts +89 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +589 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/index.d.ts +10 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +10 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/launch/continue-pick.d.ts +17 -0
  19. package/dist/launch/continue-pick.d.ts.map +1 -0
  20. package/dist/launch/continue-pick.js +20 -0
  21. package/dist/launch/continue-pick.js.map +1 -0
  22. package/dist/launch/index.d.ts +6 -0
  23. package/dist/launch/index.d.ts.map +1 -0
  24. package/dist/launch/index.js +6 -0
  25. package/dist/launch/index.js.map +1 -0
  26. package/dist/launch/model-flags.d.ts +44 -0
  27. package/dist/launch/model-flags.d.ts.map +1 -0
  28. package/dist/launch/model-flags.js +216 -0
  29. package/dist/launch/model-flags.js.map +1 -0
  30. package/dist/launch/streams.d.ts +15 -0
  31. package/dist/launch/streams.d.ts.map +1 -0
  32. package/dist/launch/streams.js +2 -0
  33. package/dist/launch/streams.js.map +1 -0
  34. package/dist/launch/term-continue.d.ts +13 -0
  35. package/dist/launch/term-continue.d.ts.map +1 -0
  36. package/dist/launch/term-continue.js +17 -0
  37. package/dist/launch/term-continue.js.map +1 -0
  38. package/dist/launch/term-session-key.d.ts +8 -0
  39. package/dist/launch/term-session-key.d.ts.map +1 -0
  40. package/dist/launch/term-session-key.js +76 -0
  41. package/dist/launch/term-session-key.js.map +1 -0
  42. package/dist/observable-abort-signal.d.ts +7 -0
  43. package/dist/observable-abort-signal.d.ts.map +1 -0
  44. package/dist/observable-abort-signal.js +56 -0
  45. package/dist/observable-abort-signal.js.map +1 -0
  46. package/dist/open-external.d.ts +2 -0
  47. package/dist/open-external.d.ts.map +1 -0
  48. package/dist/open-external.js +24 -0
  49. package/dist/open-external.js.map +1 -0
  50. package/dist/paths.d.ts +7 -0
  51. package/dist/paths.d.ts.map +1 -0
  52. package/dist/paths.js +16 -0
  53. package/dist/paths.js.map +1 -0
  54. package/dist/text/agent-cover.d.ts +43 -0
  55. package/dist/text/agent-cover.d.ts.map +1 -0
  56. package/dist/text/agent-cover.js +123 -0
  57. package/dist/text/agent-cover.js.map +1 -0
  58. package/dist/text/format-shell.d.ts +5 -0
  59. package/dist/text/format-shell.d.ts.map +1 -0
  60. package/dist/text/format-shell.js +53 -0
  61. package/dist/text/format-shell.js.map +1 -0
  62. package/dist/text/identity.d.ts +67 -0
  63. package/dist/text/identity.d.ts.map +1 -0
  64. package/dist/text/identity.js +433 -0
  65. package/dist/text/identity.js.map +1 -0
  66. package/dist/text/index.d.ts +14 -0
  67. package/dist/text/index.d.ts.map +1 -0
  68. package/dist/text/index.js +15 -0
  69. package/dist/text/index.js.map +1 -0
  70. package/dist/text/liveness.d.ts +62 -0
  71. package/dist/text/liveness.d.ts.map +1 -0
  72. package/dist/text/liveness.js +270 -0
  73. package/dist/text/liveness.js.map +1 -0
  74. package/dist/text/mcp-identity.d.ts +25 -0
  75. package/dist/text/mcp-identity.d.ts.map +1 -0
  76. package/dist/text/mcp-identity.js +133 -0
  77. package/dist/text/mcp-identity.js.map +1 -0
  78. package/dist/text/pretty-identity.d.ts +15 -0
  79. package/dist/text/pretty-identity.d.ts.map +1 -0
  80. package/dist/text/pretty-identity.js +112 -0
  81. package/dist/text/pretty-identity.js.map +1 -0
  82. package/dist/text/sugarcoat.d.ts +29 -0
  83. package/dist/text/sugarcoat.d.ts.map +1 -0
  84. package/dist/text/sugarcoat.js +148 -0
  85. package/dist/text/sugarcoat.js.map +1 -0
  86. package/dist/text/unwrap-program.d.ts +2 -0
  87. package/dist/text/unwrap-program.d.ts.map +1 -0
  88. package/dist/text/unwrap-program.js +137 -0
  89. package/dist/text/unwrap-program.js.map +1 -0
  90. package/dist/text/work-text.d.ts +72 -0
  91. package/dist/text/work-text.d.ts.map +1 -0
  92. package/dist/text/work-text.js +337 -0
  93. package/dist/text/work-text.js.map +1 -0
  94. package/dist/transport/unix.d.ts +19 -0
  95. package/dist/transport/unix.d.ts.map +1 -0
  96. package/dist/transport/unix.js +68 -0
  97. package/dist/transport/unix.js.map +1 -0
  98. package/package.json +79 -3
  99. package/src/client-agents-tree.ts +642 -0
  100. package/src/client-agents.ts +230 -0
  101. package/src/client.ts +686 -0
  102. package/src/index.ts +27 -0
  103. package/src/launch/continue-pick.ts +28 -0
  104. package/src/launch/index.ts +5 -0
  105. package/src/launch/model-flags.ts +273 -0
  106. package/src/launch/streams.ts +13 -0
  107. package/src/launch/term-continue.ts +31 -0
  108. package/src/launch/term-session-key.ts +70 -0
  109. package/src/observable-abort-signal.ts +66 -0
  110. package/src/open-external.ts +22 -0
  111. package/src/paths.ts +20 -0
  112. package/src/text/agent-cover.ts +136 -0
  113. package/src/text/format-shell.ts +52 -0
  114. package/src/text/identity.ts +473 -0
  115. package/src/text/index.ts +29 -0
  116. package/src/text/liveness.ts +322 -0
  117. package/src/text/mcp-identity.ts +148 -0
  118. package/src/text/pretty-identity.ts +120 -0
  119. package/src/text/sugarcoat.ts +165 -0
  120. package/src/text/unwrap-program.ts +133 -0
  121. package/src/text/work-text.ts +388 -0
  122. package/src/transport/unix.ts +84 -0
  123. package/README.md +0 -3
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Tape liveness from PEW fields + the cover predicate.
3
+ * Walk reactChunks + toolCalls, never walkWork (honor bag is not tape).
4
+ * The pin stays up while `SessionTurn.inLoop`. The phrase still walks the tape.
5
+ * Tape work stops before `askPaintHead` — that job is the pin, not a row.
6
+ * Cover chrome still follows `approvalHead` (`needsHuman`).
7
+ */
8
+ import { trace } from "@inhuman.tools/harness-diagnostics";
9
+ import { CallJob, ProgrammaticJob, reactChunks, tapeCompletion, ToolCallJob, } from "@inhuman.tools/harness-model";
10
+ import { agentSpecKey, formatWaitingForAgents } from "./agent-cover.js";
11
+ import { mutateArgsHaveDiff } from "./identity.js";
12
+ let lastWaitNote = "";
13
+ function noteWait(line) {
14
+ if (line === lastWaitNote)
15
+ return;
16
+ lastWaitNote = line;
17
+ trace("harness:paint", line);
18
+ }
19
+ export function outcomeSnapOf(work) {
20
+ return work.outcomeSnap ?? null;
21
+ }
22
+ export function tapeTools(turn) {
23
+ const out = [];
24
+ for (const chunk of [...turn.doneWork, ...turn.queue]) {
25
+ if (chunk instanceof ToolCallJob)
26
+ out.push(chunk);
27
+ if (chunk instanceof ProgrammaticJob)
28
+ out.push(...chunk.toolCalls);
29
+ }
30
+ return out;
31
+ }
32
+ export function toolCellState(work) {
33
+ if (work.needsHuman)
34
+ return "ask";
35
+ if (judgeEvaluating(work))
36
+ return "judging";
37
+ if (!work.completed && work.receiptJson == null)
38
+ return "live";
39
+ const snap = outcomeSnapOf(work);
40
+ if (snap?.ok === false)
41
+ return "fail";
42
+ return "ok";
43
+ }
44
+ /**
45
+ * Remainder classifier is mid-vote on a leaf the floor already routed to it.
46
+ * Excludes the cover: `needsHuman` wins first, and a fail message means the
47
+ * classifier is retrying in the background, not deciding this leaf now.
48
+ */
49
+ function judgeEvaluating(work) {
50
+ if (work.completed || work.cancelled || work.humanApprove !== null)
51
+ return false;
52
+ if (work.classifierResult !== null || work.classifierAbstain !== null)
53
+ return false;
54
+ return work.autoClassifierPending;
55
+ }
56
+ /**
57
+ * Isolated remainder-classifier PEWs hang on the leaf, not the ReACT tape.
58
+ * Occupancy and thought paint walk these; `walkWork` would pull the honor bag.
59
+ */
60
+ export function leftoverJudgeCompletions(turn) {
61
+ const out = [];
62
+ for (const tool of tapeTools(turn)) {
63
+ for (const child of tool.children) {
64
+ const pew = tapeCompletion(child);
65
+ if (pew != null)
66
+ out.push(pew);
67
+ }
68
+ }
69
+ return out;
70
+ }
71
+ /**
72
+ * Paint owner of the ask pin / tape cutoff. Cover chrome is still
73
+ * `approvalHead`. A mutate Diff the human already answered stays the
74
+ * pin until BODY writes a result — dropping it on `approved` remounts the
75
+ * same Diff as a tape row (gap, or both for a frame).
76
+ */
77
+ export function askPaintHead(turn) {
78
+ const head = turn.approvalHead;
79
+ if (head instanceof ToolCallJob)
80
+ return head;
81
+ for (const tool of tapeTools(turn)) {
82
+ if (heldMutateDiff(tool))
83
+ return tool;
84
+ }
85
+ return null;
86
+ }
87
+ function heldMutateDiff(work) {
88
+ if (work.humanApprove === null)
89
+ return false;
90
+ if (work.completed || work.receiptJson != null)
91
+ return false;
92
+ return mutateArgsHaveDiff(work);
93
+ }
94
+ /**
95
+ * Stateful cutoff at `askPaintHead`. Walk tape order: skip the head
96
+ * (pin owns it) and every tool after it. A scheme after the cut is omitted
97
+ * whole; a scheme that contains the head still paints the bag.
98
+ */
99
+ export function createAskTapeCut(turn) {
100
+ const head = askPaintHead(turn);
101
+ let cut = false;
102
+ return {
103
+ skipTool(work) {
104
+ if (cut || work === head) {
105
+ if (work === head)
106
+ cut = true;
107
+ return true;
108
+ }
109
+ return false;
110
+ },
111
+ skipScheme() {
112
+ return cut;
113
+ },
114
+ };
115
+ }
116
+ export function schemeCellState(chunk) {
117
+ if (!chunk.completed && chunk.receiptJson == null)
118
+ return "live";
119
+ const snap = outcomeSnapOf(chunk);
120
+ if (snap?.ok === false)
121
+ return "fail";
122
+ return "ok";
123
+ }
124
+ export function emptyWaitChrome(turn) {
125
+ if (turn == null || turn.cutOff) {
126
+ noteWait(`wait skip ${turn == null ? "no-turn" : "cutoff"}`);
127
+ return null;
128
+ }
129
+ const glance = turnLiveness(turn);
130
+ if (glance === "waiting-for-you" || glance !== "running") {
131
+ noteWait(`wait skip ${glance} turn=${idOf(turn)}`);
132
+ return null;
133
+ }
134
+ const activity = activityCensus(turn);
135
+ const phrase = occupancyPhrase(activity);
136
+ noteWait(`wait show turn=${idOf(turn)} kind=${phrase.kind} startedAt=${activity.startedAt ?? "none"}`);
137
+ return {
138
+ ...phrase,
139
+ startedAt: activity.startedAt,
140
+ retryUntilMs: activity.retryUntilMs,
141
+ };
142
+ }
143
+ /** Reads only when the caller will show it — a turn outside a plexus has no uuid. */
144
+ function idOf(turn) {
145
+ try {
146
+ return turn.uuid;
147
+ }
148
+ catch {
149
+ return "unmaterialized";
150
+ }
151
+ }
152
+ /**
153
+ * Compact column drops this leaf. Comm-first (agent) always.
154
+ * Floor-allow only when `hideFloorTools`. Nested scheme inners never drop.
155
+ */
156
+ export function compactOmitsTool(work, hideFloorTools, nested = false) {
157
+ if (nested || !work.tapeFuse)
158
+ return false;
159
+ if (work.commFirst)
160
+ return true;
161
+ return hideFloorTools;
162
+ }
163
+ function activityCensus(turn) {
164
+ const askCut = createAskTapeCut(turn);
165
+ const agentSpecs = [];
166
+ let tools = false;
167
+ let speech = false;
168
+ let seated = false;
169
+ let startedAt = null;
170
+ let retryUntilMs = null;
171
+ const notePew = (pew) => {
172
+ const copy = completionLiveCopy(pew, false);
173
+ if (copy.startedAt != null)
174
+ startedAt = copy.startedAt;
175
+ if (!copy.live)
176
+ return;
177
+ retryUntilMs = copy.retryUntilMs;
178
+ if (copy.workerPresent)
179
+ seated = true;
180
+ if (copy.text.trim() !== "")
181
+ speech = true;
182
+ };
183
+ const noteTool = (work) => {
184
+ if (work instanceof CallJob) {
185
+ if (!work.completed)
186
+ agentSpecs.push(agentSpecKey(work) || "agent");
187
+ return;
188
+ }
189
+ if (work.tapeHidden || askCut.skipTool(work))
190
+ return;
191
+ const state = toolCellState(work);
192
+ if (state === "live" || state === "judging")
193
+ tools = true;
194
+ };
195
+ for (const chunk of reactChunks(turn)) {
196
+ const pew = tapeCompletion(chunk);
197
+ if (pew != null) {
198
+ notePew(pew);
199
+ continue;
200
+ }
201
+ if (chunk instanceof ToolCallJob) {
202
+ noteTool(chunk);
203
+ continue;
204
+ }
205
+ if (chunk instanceof ProgrammaticJob) {
206
+ if (askCut.skipScheme())
207
+ continue;
208
+ if (schemeCellState(chunk) === "live")
209
+ tools = true;
210
+ for (const inner of chunk.toolCalls)
211
+ noteTool(inner);
212
+ }
213
+ }
214
+ for (const pew of leftoverJudgeCompletions(turn))
215
+ notePew(pew);
216
+ return { tools, agentSpecs, speech, seated, startedAt, retryUntilMs };
217
+ }
218
+ export const CONNECTING = "connecting...";
219
+ export const USING_TOOLS = "using tools...";
220
+ export const RESPONDING = "responding...";
221
+ function occupancyPhrase(activity) {
222
+ const retry = activity.retryUntilMs != null;
223
+ if (activity.tools || activity.agentSpecs.length > 0) {
224
+ const waiting = formatWaitingForAgents(activity.agentSpecs);
225
+ const label = waiting === "" ? USING_TOOLS : activity.tools ? `${USING_TOOLS.slice(0, -3)} and ${waiting}` : waiting;
226
+ return { kind: "using-tools", label, elapsed: retry };
227
+ }
228
+ if (activity.speech)
229
+ return { kind: "responding", label: RESPONDING, elapsed: retry };
230
+ if (activity.seated)
231
+ return { kind: "waiting", label: "waiting for response...", elapsed: true };
232
+ return { kind: "connecting", label: CONNECTING, elapsed: retry };
233
+ }
234
+ function completionLiveCopy(chunk, cutOff) {
235
+ const live = chunk.outcome == null && !cutOff;
236
+ const report = live && chunk.plexus != null ? chunk.report : null;
237
+ const text = live ? (typeof report?.text === "string" ? report.text : "") || chunk.responseText : chunk.responseText;
238
+ const thought = live
239
+ ? (typeof report?.thought === "string" ? report.thought : "") || chunk.responseThought
240
+ : chunk.responseThought;
241
+ const startedAt = chunk.startedAtMs != null && Number.isFinite(chunk.startedAtMs)
242
+ ? chunk.startedAtMs
243
+ : live && typeof report?.startedAt === "number" && Number.isFinite(report.startedAt)
244
+ ? report.startedAt
245
+ : null;
246
+ const retryUntilMs = live && typeof report?.retryUntilMs === "number" && Number.isFinite(report.retryUntilMs)
247
+ ? report.retryUntilMs
248
+ : null;
249
+ return {
250
+ live,
251
+ text,
252
+ thought,
253
+ workerPresent: live ? chunk.workerPresent : false,
254
+ startedAt,
255
+ retryUntilMs,
256
+ };
257
+ }
258
+ export function turnLiveness(turn) {
259
+ if (turn == null)
260
+ return "idle";
261
+ if (turn.approvalHead != null && !hasPendingAutoResidual(turn))
262
+ return "waiting-for-you";
263
+ if (turn.inLoop)
264
+ return "running";
265
+ return "idle";
266
+ }
267
+ function hasPendingAutoResidual(turn) {
268
+ return tapeTools(turn).some((work) => work.autoClassifierPending && work.classifierAbstain == null && !work.completed);
269
+ }
270
+ //# sourceMappingURL=liveness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveness.js","sourceRoot":"","sources":["../../src/text/liveness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAC;AAC3D,OAAO,EACL,OAAO,EAEP,eAAe,EACf,WAAW,EACX,cAAc,EAEd,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,IAAI,YAAY,GAAG,EAAE,CAAC;AAEtB,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO;IAClC,YAAY,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAMD,MAAM,UAAU,aAAa,CAAC,IAA2D;IACvF,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAiB;IACzC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,YAAY,WAAW;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,KAAK,YAAY,eAAe;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,EAAE,EAAE,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAiB;IACxC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpF,OAAO,IAAI,CAAC,qBAAqB,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAiB;IACxD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,GAAG,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;IAC/B,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,cAAc,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,IAAiB;IACvC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAIhD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,OAAO;QACL,QAAQ,CAAC,IAAiB;YACxB,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,IAAI,KAAK,IAAI;oBAAE,GAAG,GAAG,IAAI,CAAC;gBAC9B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,UAAU;YACR,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IACjE,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,IAAI,EAAE,EAAE,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAuBD,MAAM,UAAU,eAAe,CAAC,IAAwB;IACtD,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,QAAQ,CAAC,aAAa,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,iBAAiB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzD,QAAQ,CAAC,aAAa,MAAM,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,cAAc,QAAQ,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;IACvG,OAAO;QACL,GAAG,MAAM;QACT,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,YAAY,EAAE,QAAQ,CAAC,YAAY;KACpC,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,SAAS,IAAI,CAAC,IAAiB;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB,EAAE,cAAuB,EAAE,MAAM,GAAG,KAAK;IACzF,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,cAAc,CAAC;AACxB,CAAC;AAWD,SAAS,cAAc,CAAC,IAAiB;IACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,YAAY,GAAkB,IAAI,CAAC;IAEvC,MAAM,OAAO,GAAG,CAAC,GAA0B,EAAQ,EAAE;QACnD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAAE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QACvB,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,IAAI,IAAI,CAAC,aAAa;YAAE,MAAM,GAAG,IAAI,CAAC;QACtC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,IAAiB,EAAQ,EAAE;QAC3C,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO;QACrD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,GAAG,IAAI,CAAC;IAC5D,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,UAAU,EAAE;gBAAE,SAAS;YAClC,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,MAAM;gBAAE,KAAK,GAAG,IAAI,CAAC;YACpD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,SAAS;gBAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAE1C,SAAS,eAAe,CAAC,QAAwB;IAK/C,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC;IAC5C,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,KAAK,GACT,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACzG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACtF,IAAI,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACjG,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,kBAAkB,CACzB,KAA4B,EAC5B,MAAe;IASf,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;IACrH,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,eAAe;QACtF,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;IAC1B,MAAM,SAAS,GACb,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;QAC7D,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,IAAI,IAAI,OAAO,MAAM,EAAE,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;YAClF,CAAC,CAAC,MAAM,CAAC,SAAS;YAClB,CAAC,CAAC,IAAI,CAAC;IACb,MAAM,YAAY,GAChB,IAAI,IAAI,OAAO,MAAM,EAAE,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;QACtF,CAAC,CAAC,MAAM,CAAC,YAAY;QACrB,CAAC,CAAC,IAAI,CAAC;IACX,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK;QACjD,SAAS;QACT,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAwB;IACnD,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACzF,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAiB;IAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CACzB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAC1F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * MCP tape identity: dim server, bright split action. Options dump is the
3
+ * composer stack (same T-join as slash), not the ask pin. pretty-mcp
4
+ * identity wins when the catalog covers this server+tool.
5
+ *
6
+ * Split matches the catalog name-floor (`score-names.mjs`): camel + `_`/`-`/`.`
7
+ * and `graph`+`ql` → `graphql`. Display is a preserve map, not title-case's
8
+ * small-word list (that list un-capitalizes; we keep ID / URL / GraphQL).
9
+ */
10
+ import { MCPToolJob } from "@inhuman.tools/harness-model";
11
+ export type McpIdentity = {
12
+ readonly server: string;
13
+ readonly action: string;
14
+ };
15
+ export declare function splitName(name: string): string[];
16
+ export declare function parseMcpWireName(name: string): {
17
+ server: string;
18
+ tool: string;
19
+ };
20
+ export declare function mcpIdentity(work: MCPToolJob): McpIdentity;
21
+ /** Visible rows in the MCP confirm stack. Same chrome as slash; clip is 70vh − 3. */
22
+ export declare function mcpConfirmViewport(rows: number): number;
23
+ /** Key/value dump for the confirm stack. Empty object is empty — no `{}`. */
24
+ export declare function formatMcpArgs(args: Record<string, unknown> | null): string;
25
+ //# sourceMappingURL=mcp-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-identity.d.ts","sourceRoot":"","sources":["../../src/text/mcp-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAqC1D,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAM/E;AAyBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAWzD;AAoBD,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,MAAM,CAU1E"}
@@ -0,0 +1,133 @@
1
+ const PRESERVE = {
2
+ id: "ID",
3
+ url: "URL",
4
+ uri: "URI",
5
+ api: "API",
6
+ http: "HTTP",
7
+ https: "HTTPS",
8
+ json: "JSON",
9
+ html: "HTML",
10
+ css: "CSS",
11
+ xml: "XML",
12
+ sql: "SQL",
13
+ csv: "CSV",
14
+ pdf: "PDF",
15
+ uuid: "UUID",
16
+ oauth: "OAuth",
17
+ graphql: "GraphQL",
18
+ github: "GitHub",
19
+ gitlab: "GitLab",
20
+ mcp: "MCP",
21
+ aws: "AWS",
22
+ gcp: "GCP",
23
+ ssh: "SSH",
24
+ jwt: "JWT",
25
+ dns: "DNS",
26
+ ip: "IP",
27
+ pr: "PR",
28
+ ui: "UI",
29
+ sdk: "SDK",
30
+ cli: "CLI",
31
+ tui: "TUI",
32
+ rpc: "RPC",
33
+ sse: "SSE",
34
+ };
35
+ export function splitName(name) {
36
+ const marked = name.replaceAll(/([a-z0-9])([A-Z])/g, "$1\0$2").replaceAll(/([A-Z]+)([A-Z][a-z])/g, "$1\0$2");
37
+ const raw = marked
38
+ .split(/[\0_\-./]+/)
39
+ .filter(Boolean)
40
+ .map((part) => part.toLowerCase());
41
+ const out = [];
42
+ for (let i = 0; i < raw.length; i++) {
43
+ if (raw[i] === "graph" && raw[i + 1] === "ql") {
44
+ out.push("graphql");
45
+ i++;
46
+ }
47
+ else {
48
+ out.push(raw[i]);
49
+ }
50
+ }
51
+ return out;
52
+ }
53
+ export function parseMcpWireName(name) {
54
+ if (!name.startsWith("mcp__"))
55
+ return { server: "", tool: name };
56
+ const rest = name.slice("mcp__".length);
57
+ const split = rest.indexOf("__");
58
+ if (split === -1)
59
+ return { server: rest, tool: "" };
60
+ return { server: rest.slice(0, split), tool: rest.slice(split + 2) };
61
+ }
62
+ function displayToken(token, voice) {
63
+ const preserved = PRESERVE[token];
64
+ if (preserved !== undefined)
65
+ return preserved;
66
+ if (voice === "action")
67
+ return token;
68
+ if (token.length === 0)
69
+ return token;
70
+ return token.charAt(0).toUpperCase() + token.slice(1);
71
+ }
72
+ function displayWords(tokens, voice) {
73
+ return tokens.map((token) => displayToken(token, voice)).join(" ");
74
+ }
75
+ function stripServerPrefix(toolTokens, serverTokens) {
76
+ if (serverTokens.length > 0 &&
77
+ serverTokens.length <= toolTokens.length &&
78
+ serverTokens.every((token, i) => token === toolTokens[i])) {
79
+ return toolTokens.slice(serverTokens.length);
80
+ }
81
+ return toolTokens;
82
+ }
83
+ export function mcpIdentity(work) {
84
+ const wired = parseMcpWireName(work.name);
85
+ const serverKey = work.connectionKey.trim() || wired.server;
86
+ const toolName = work.serverToolName.trim() || wired.tool || work.name;
87
+ const serverTokens = splitName(serverKey);
88
+ const toolTokens = splitName(toolName);
89
+ const actionTokens = stripServerPrefix(toolTokens, serverTokens);
90
+ return {
91
+ server: displayWords(serverTokens.length > 0 ? serverTokens : ["mcp"], "server"),
92
+ action: displayWords(actionTokens.length > 0 ? actionTokens : toolTokens, "action") || toolName,
93
+ };
94
+ }
95
+ function isPrimitive(value) {
96
+ return value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean";
97
+ }
98
+ function formatArgValue(value) {
99
+ if (typeof value === "string")
100
+ return value;
101
+ if (typeof value === "number" || typeof value === "boolean")
102
+ return String(value);
103
+ if (value === null)
104
+ return "null";
105
+ if (Array.isArray(value) && value.every(isPrimitive)) {
106
+ return value.map((item) => (item === null ? "null" : String(item))).join(", ");
107
+ }
108
+ try {
109
+ return JSON.stringify(value, null, 2) ?? "";
110
+ }
111
+ catch {
112
+ return String(value);
113
+ }
114
+ }
115
+ /** Visible rows in the MCP confirm stack. Same chrome as slash; clip is 70vh − 3. */
116
+ export function mcpConfirmViewport(rows) {
117
+ return Math.max(1, Math.floor(rows * 0.7) - 3);
118
+ }
119
+ /** Key/value dump for the confirm stack. Empty object is empty — no `{}`. */
120
+ export function formatMcpArgs(args) {
121
+ if (args === null)
122
+ return "";
123
+ const lines = [];
124
+ for (const key of Object.keys(args)) {
125
+ const value = args[key];
126
+ if (value === undefined)
127
+ continue;
128
+ const rendered = formatArgValue(value);
129
+ lines.push(rendered.includes("\n") ? `${key}\n${rendered}` : `${key} ${rendered}`);
130
+ }
131
+ return lines.join("\n");
132
+ }
133
+ //# sourceMappingURL=mcp-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-identity.js","sourceRoot":"","sources":["../../src/text/mcp-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * pretty-mcp tape paint. Compact is the identity line; expand adds the
3
+ * block. Question while live/ask; effect when sealed. Uncovered tools
4
+ * stay on the hand identity. Gutter chrome is not this file.
5
+ */
6
+ import { ProgrammaticJob, ToolCallJob } from "@inhuman.tools/harness-model";
7
+ export type PrettyPaint = {
8
+ readonly line: string;
9
+ readonly block: string;
10
+ };
11
+ export declare function prettyIdentity(work: ToolCallJob | ProgrammaticJob, kind: "question" | "effect"): PrettyPaint | null;
12
+ export declare function prettyResult(work: ToolCallJob | ProgrammaticJob, result: unknown): string | null;
13
+ /** Question templates end in `?`. The gutter owns that mark, not the sentence. */
14
+ export declare function stripQuestion(line: string): string;
15
+ //# sourceMappingURL=pretty-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretty-identity.d.ts","sourceRoot":"","sources":["../../src/text/pretty-identity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAc,eAAe,EAAqB,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAM3G,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAgEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,IAAI,CAgBnH;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkBhG;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * pretty-mcp tape paint. Compact is the identity line; expand adds the
3
+ * block. Question while live/ask; effect when sealed. Uncovered tools
4
+ * stay on the hand identity. Gutter chrome is not this file.
5
+ */
6
+ import { MCPToolJob, ProgrammaticJob, FileMutateToolJob } from "@inhuman.tools/harness-model";
7
+ import { catalogIndex, renderTool, splitIdentity } from "@inhuman.tools/pretty-mcp";
8
+ import { parseMcpWireName } from "./mcp-identity.js";
9
+ import { sugarcoatProgram } from "./sugarcoat.js";
10
+ const TOOLKIT = "harness-toolkit";
11
+ /** Tape paint: toolkit + playwright. Other Smithery catalogs stay lookup-later. */
12
+ const TAPE_SERVERS = new Set(["harness-toolkit", "playwright"]);
13
+ function paintArgs(work, args) {
14
+ const name = work.name;
15
+ let next = args;
16
+ if ((name === "glob" || name === "fff_search") && args.cwd === undefined && typeof args.path === "string") {
17
+ next = { ...args, cwd: args.path };
18
+ }
19
+ if (name === "write_file") {
20
+ const existed = writeFileExisted(work);
21
+ if (existed !== undefined)
22
+ next = { ...next, existed };
23
+ }
24
+ return next;
25
+ }
26
+ /** Host-only. dist-tools.ts seals `created ` / `replaced `. Not a model argument. */
27
+ function writeFileExisted(work) {
28
+ if (work.completed) {
29
+ const text = work.outcomeSnap?.ok === true ? work.outcomeSnap?.text : undefined;
30
+ if (typeof text === "string") {
31
+ if (text.startsWith("created "))
32
+ return false;
33
+ if (text.startsWith("replaced "))
34
+ return true;
35
+ }
36
+ }
37
+ if (work instanceof FileMutateToolJob) {
38
+ if (work.existed === true)
39
+ return true;
40
+ if (work.existed === false)
41
+ return false;
42
+ }
43
+ return undefined;
44
+ }
45
+ function argsOf(work) {
46
+ return { ...(work.args ?? {}) };
47
+ }
48
+ function catalogTool(server, tool) {
49
+ const needle = server.toLowerCase();
50
+ for (const file of catalogIndex().byId.values()) {
51
+ if (!TAPE_SERVERS.has(file.id))
52
+ continue;
53
+ if (file.id === server || file.id.toLowerCase() === needle || file.displayName.toLowerCase() === needle) {
54
+ return file.tools[tool];
55
+ }
56
+ }
57
+ return undefined;
58
+ }
59
+ function paint(server, tool, kind, args, result) {
60
+ const row = catalogTool(server, tool);
61
+ if (row === undefined)
62
+ return null;
63
+ const rendered = renderTool(row, kind, args, result);
64
+ if (!rendered.ok || rendered.markdown.trim() === "")
65
+ return null;
66
+ return splitIdentity(rendered.markdown);
67
+ }
68
+ export function prettyIdentity(work, kind) {
69
+ if (work instanceof ProgrammaticJob) {
70
+ return paint(TOOLKIT, "scheme_repl", kind, { expr: sugarcoatProgram(work.expr) });
71
+ }
72
+ const args = paintArgs(work, argsOf(work));
73
+ if (work instanceof MCPToolJob) {
74
+ const wired = parseMcpWireName(work.name);
75
+ const tool = work.serverToolName.trim() || wired.tool;
76
+ for (const server of [work.connectionKey.trim(), wired.server]) {
77
+ if (server === "")
78
+ continue;
79
+ const hit = paint(server, tool, kind, args);
80
+ if (hit !== null)
81
+ return hit;
82
+ }
83
+ return null;
84
+ }
85
+ return paint(TOOLKIT, work.name, kind, args);
86
+ }
87
+ export function prettyResult(work, result) {
88
+ if (work instanceof ProgrammaticJob) {
89
+ const hit = paint(TOOLKIT, "scheme_repl", "result", { expr: sugarcoatProgram(work.expr) }, result);
90
+ return hit === null ? null : [hit.line, hit.block].filter((part) => part !== "").join("\n");
91
+ }
92
+ const args = paintArgs(work, argsOf(work));
93
+ if (work instanceof MCPToolJob) {
94
+ const wired = parseMcpWireName(work.name);
95
+ const tool = work.serverToolName.trim() || wired.tool;
96
+ for (const server of [work.connectionKey.trim(), wired.server]) {
97
+ if (server === "")
98
+ continue;
99
+ const hit = paint(server, tool, "result", args, result);
100
+ if (hit !== null)
101
+ return [hit.line, hit.block].filter((part) => part !== "").join("\n");
102
+ }
103
+ return null;
104
+ }
105
+ const hit = paint(TOOLKIT, work.name, "result", args, result);
106
+ return hit === null ? null : [hit.line, hit.block].filter((part) => part !== "").join("\n");
107
+ }
108
+ /** Question templates end in `?`. The gutter owns that mark, not the sentence. */
109
+ export function stripQuestion(line) {
110
+ return line.endsWith("?") ? line.slice(0, -1).trimEnd() : line;
111
+ }
112
+ //# sourceMappingURL=pretty-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pretty-identity.js","sourceRoot":"","sources":["../../src/text/pretty-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ToolOutcomeSnap } from "@inhuman.tools/harness-model/schemas";
2
+ export declare function sugarcoatSource(src: string): string;
3
+ /** Tape/object paint for a scheme_repl program. Splices wrapping begin/list/`[]` first. */
4
+ export declare function sugarcoatProgram(src: string): string;
5
+ /** JSON-quoted payloads (`"a\\nb"`) become the string with real newlines. Bare `C:\\new` stays. */
6
+ export declare function decodeDisplayString(text: string): string;
7
+ export type SchemePaintKind = "text" | "markdown" | "number" | "boolean" | "syntax";
8
+ export type SchemePaintPart = {
9
+ readonly kind: SchemePaintKind;
10
+ readonly text: string;
11
+ };
12
+ export type SchemePaintReceipt = {
13
+ readonly kind: "none";
14
+ } | SchemePaintPart | {
15
+ readonly kind: "parts";
16
+ readonly parts: readonly SchemePaintPart[];
17
+ };
18
+ /** Scheme boolean spellings. The highlighter colours the same atoms. */
19
+ export declare const BOOLEAN_ATOMS: ReadonlySet<string>;
20
+ export declare function formatSchemeResult(snap: ToolOutcomeSnap | null | undefined): string;
21
+ export type FilePaintHint = {
22
+ readonly path: string;
23
+ readonly text: string;
24
+ };
25
+ /** One receipt per printed value. A display string stays plain. Serializer text is syntax. */
26
+ export declare function schemePaintReceipt(snap: ToolOutcomeSnap | null | undefined, hints?: readonly FilePaintHint[]): SchemePaintReceipt;
27
+ export declare function isMarkdownPath(path: string): boolean;
28
+ export declare function fileSchemePart(path: string, text: string): SchemePaintPart | undefined;
29
+ //# sourceMappingURL=sugarcoat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sugarcoat.d.ts","sourceRoot":"","sources":["../../src/text/sugarcoat.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAI5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASxD;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB,eAAe,GACf;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;CAC5C,CAAC;AAEN,wEAAwE;AACxE,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,CAA4C,CAAC;AAoB3F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKnF;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACxC,KAAK,GAAE,SAAS,aAAa,EAAO,GACnC,kBAAkB,CAoBpB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAItF"}