perchai-cli 2.4.40 → 2.4.42
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.
- package/dist/perch.mjs +264 -13
- package/package.json +1 -1
package/dist/perch.mjs
CHANGED
|
@@ -75566,6 +75566,7 @@ var init_payroll = __esm({
|
|
|
75566
75566
|
// lib/perchBusinessTools/index.ts
|
|
75567
75567
|
var init_perchBusinessTools = __esm({
|
|
75568
75568
|
"lib/perchBusinessTools/index.ts"() {
|
|
75569
|
+
"use strict";
|
|
75569
75570
|
init_generateAPAuditPacket();
|
|
75570
75571
|
init_inventoryFolder();
|
|
75571
75572
|
init_loadBusinessTables();
|
|
@@ -76217,6 +76218,7 @@ function getToolDisplayName(toolName) {
|
|
|
76217
76218
|
var NON_MODULE_TOOL_OWNERS, TOOL_RISK, TOOL_DISPLAY_NAMES;
|
|
76218
76219
|
var init_catalog = __esm({
|
|
76219
76220
|
"features/perchTerminal/runtime/toolSystem/catalog.ts"() {
|
|
76221
|
+
"use strict";
|
|
76220
76222
|
init_toolNames();
|
|
76221
76223
|
NON_MODULE_TOOL_OWNERS = {
|
|
76222
76224
|
[TOOL_NAMES.listSources]: "lane",
|
|
@@ -92807,6 +92809,40 @@ var init_agentSkillRegistry = __esm({
|
|
|
92807
92809
|
"visionInspect"
|
|
92808
92810
|
]
|
|
92809
92811
|
},
|
|
92812
|
+
{
|
|
92813
|
+
"id": "github",
|
|
92814
|
+
"name": "github",
|
|
92815
|
+
"description": "Inspect GitHub and git repository state, review commits and pull requests, debug checks, and publish local changes with clear permission boundaries.",
|
|
92816
|
+
"path": "features/perchTerminal/agentPlatform/skills/github/SKILL.md",
|
|
92817
|
+
"body": "\n# github\n\nUse this skill when the user asks Perch to inspect git state, review commits, prepare a commit, push a branch, understand GitHub checks, triage a pull request, or coordinate repo release work.\n\n## Operating Rules\n\n- Start with repository state before changing anything: current branch, status, recent commits, and relevant diff.\n- Protect unrelated work. Do not stage, discard, rewrite, or overwrite changes that are not part of the requested task.\n- For reviews, lead with concrete risks tied to file paths, diffs, commits, checks, or PR comments.\n- For commits, stage intentionally and write a concise message that matches the actual diff. Commit and push only when the user explicitly asks or has already authorized that action.\n- For CI or deployment checks, pair this with `wait-operator`: poll bounded status, read failing logs when available, and report final state rather than guessing.\n- For PR work, prefer existing authenticated GitHub routes or local `gh` when available; otherwise use git history, diff, and visible URLs as evidence.\n- Keep product language clean. Say GitHub, git, branch, commit, push, PR, checks, and deploy; avoid internal runtime labels unless debugging requires them.\n\n## Verification\n\nBefore finishing, report the branch, files changed, commit SHA when created, push target when pushed, PR/check/deploy URL when available, and any uncommitted files intentionally left alone.",
|
|
92818
|
+
"surface": {
|
|
92819
|
+
"gui": "supported",
|
|
92820
|
+
"cli": "supported"
|
|
92821
|
+
},
|
|
92822
|
+
"triggerHints": [
|
|
92823
|
+
"github",
|
|
92824
|
+
"git status",
|
|
92825
|
+
"git diff",
|
|
92826
|
+
"commit changes",
|
|
92827
|
+
"push branch",
|
|
92828
|
+
"pull request",
|
|
92829
|
+
"review commits",
|
|
92830
|
+
"github checks",
|
|
92831
|
+
"ci failure",
|
|
92832
|
+
"release branch"
|
|
92833
|
+
],
|
|
92834
|
+
"companionSkills": [
|
|
92835
|
+
"workspace",
|
|
92836
|
+
"wait-operator"
|
|
92837
|
+
],
|
|
92838
|
+
"preferredTools": [
|
|
92839
|
+
"bash",
|
|
92840
|
+
"runBashTerminalCommand",
|
|
92841
|
+
"grep",
|
|
92842
|
+
"readLocalFile",
|
|
92843
|
+
"writeLocalFile"
|
|
92844
|
+
]
|
|
92845
|
+
},
|
|
92810
92846
|
{
|
|
92811
92847
|
"id": "pdf",
|
|
92812
92848
|
"name": "pdf",
|
|
@@ -92883,6 +92919,39 @@ var init_agentSkillRegistry = __esm({
|
|
|
92883
92919
|
"readLocalFile"
|
|
92884
92920
|
]
|
|
92885
92921
|
},
|
|
92922
|
+
{
|
|
92923
|
+
"id": "release",
|
|
92924
|
+
"name": "release",
|
|
92925
|
+
"description": "Prepare and ship a Perch release \u2014 bump, build, pack, commit, tag, and push the CLI up to the publish handoff, or trigger the desktop release workflow, with strict permission gates.",
|
|
92926
|
+
"path": "features/perchTerminal/agentPlatform/skills/release/SKILL.md",
|
|
92927
|
+
"body": "\n# release\n\nUse this skill when the user asks Perch to cut a release: ship a new `perchai-cli` version, repackage the CLI, bump the version, or trigger a desktop build. This runs on any surface with a local shell (the field CLI and the desktop app); a hosted-only surface cannot release.\n\n## CLI release\n\nThe CLI release is a single audited command \u2014 do not improvise raw `git`/`npm` sequences. Use `npm run cli:release`.\n\n1. Always start with a dry run: `npm run cli:release` (or `npm run cli:release -- --minor` / `-- --set X.Y.Z`). It prints the ordered plan and runs read-only preflight (clean tree, unused tag, test gate) without changing anything.\n2. Show the user the planned version, tag, and steps. Get an explicit yes before mutating.\n3. Execute with `npm run cli:release -- --execute`. It bumps `packages/cli/package.json`, rebuilds the bundle, packs the tarball, commits, tags `cli-vX.Y.Z`, and pushes \u2014 then STOPS.\n4. It never publishes. Hand the publish back to the user verbatim: `cd packages/cli && npm publish`, run with their own npm token. State the prepared version, the commit, the tag, and the tarball path.\n\nUse `-- --no-push` to keep the commit and tag local; `-- --skip-tests` only when the user explicitly accepts skipping the gate.\n\n## Desktop release\n\nThe desktop installers build in CI, not locally. Use `npm run desktop:release` (optionally with a version and channel). It triggers the desktop release workflow through the GitHub CLI, which builds the macOS and Windows installers and publishes them to the configured download bucket. This requires the GitHub CLI to be installed and authenticated; if it is missing, say so and stop rather than guessing.\n\nPair this with `wait-operator` when the user wants to watch the workflow to completion: poll bounded status, read the failing job logs when available, and report the final result with the run URL.\n\n## Permission and verification\n\n- Protect unrelated work. The CLI release refuses to run with a dirty tree on purpose, so only the bump, bundle, and tarball land in the release commit. Never stage or sweep unrelated changes to satisfy it \u2014 commit or stash those first.\n- Treat push and publish as irreversible. Confirm before push; never publish on the user's behalf.\n- Before finishing, report the resolved version, commit SHA, tag, push target, tarball path, the exact publish command left for the user, and any workflow or run URL when a desktop release was triggered.",
|
|
92928
|
+
"surface": {
|
|
92929
|
+
"gui": "supported",
|
|
92930
|
+
"cli": "supported"
|
|
92931
|
+
},
|
|
92932
|
+
"triggerHints": [
|
|
92933
|
+
"release the cli",
|
|
92934
|
+
"ship the cli",
|
|
92935
|
+
"publish the cli",
|
|
92936
|
+
"cut a release",
|
|
92937
|
+
"bump version",
|
|
92938
|
+
"package the cli",
|
|
92939
|
+
"desktop release",
|
|
92940
|
+
"tag and push"
|
|
92941
|
+
],
|
|
92942
|
+
"companionSkills": [
|
|
92943
|
+
"github",
|
|
92944
|
+
"wait-operator",
|
|
92945
|
+
"workspace"
|
|
92946
|
+
],
|
|
92947
|
+
"preferredTools": [
|
|
92948
|
+
"bash",
|
|
92949
|
+
"runBashTerminalCommand",
|
|
92950
|
+
"grep",
|
|
92951
|
+
"readLocalFile",
|
|
92952
|
+
"writeLocalFile"
|
|
92953
|
+
]
|
|
92954
|
+
},
|
|
92886
92955
|
{
|
|
92887
92956
|
"id": "research",
|
|
92888
92957
|
"name": "research",
|
|
@@ -92996,6 +93065,41 @@ var init_agentSkillRegistry = __esm({
|
|
|
92996
93065
|
"readLocalFile"
|
|
92997
93066
|
]
|
|
92998
93067
|
},
|
|
93068
|
+
{
|
|
93069
|
+
"id": "wait-operator",
|
|
93070
|
+
"name": "wait-operator",
|
|
93071
|
+
"description": "Watch bounded external or local conditions, poll deployment and job status, wait through short-running tasks, and resume with verified state instead of guessing.",
|
|
93072
|
+
"path": "features/perchTerminal/agentPlatform/skills/wait-operator/SKILL.md",
|
|
93073
|
+
"body": "\n# wait-operator\n\nUse this skill when the user asks Perch to wait, watch, poll, monitor, check back, or keep an eye on a deployment, CI run, background job, file creation, local server, browser page, or other condition.\n\n## Operating Rules\n\n- Treat waiting as an active bounded loop: define the condition, timeout, interval, and failure states before polling.\n- Never sleep indefinitely. Use short intervals and a clear maximum wait unless the user explicitly asks for a longer watch.\n- Prefer read-only checks: status commands, existing logs, HTTP status endpoints, browser observe/wait, or file existence checks.\n- For deployments and CI, distinguish pending, ready/success, failed, canceled, timed out, and unknown. Do not call a run ready from elapsed time alone.\n- Report the last observed state if the wait times out or credentials/session state blocks verification.\n- Avoid noisy transcript spam. Group repeated polling into a short progress summary unless the user asks to see every check.\n- If the user asks for a real follow-up after this turn rather than an in-turn wait, create or suggest the appropriate automation instead of pretending the current turn can run forever.\n\n## Verification\n\nFinish only after the watched condition is directly verified or a blocker is named. Include the evidence source: command status, page state, URL, log line, file path, or timestamped last check.",
|
|
93074
|
+
"surface": {
|
|
93075
|
+
"gui": "supported",
|
|
93076
|
+
"cli": "supported"
|
|
93077
|
+
},
|
|
93078
|
+
"triggerHints": [
|
|
93079
|
+
"wait for deploy",
|
|
93080
|
+
"watch deployment",
|
|
93081
|
+
"poll status",
|
|
93082
|
+
"check until ready",
|
|
93083
|
+
"wait until done",
|
|
93084
|
+
"keep checking",
|
|
93085
|
+
"monitor progress",
|
|
93086
|
+
"long running task",
|
|
93087
|
+
"deployment status",
|
|
93088
|
+
"wake when done"
|
|
93089
|
+
],
|
|
93090
|
+
"companionSkills": [
|
|
93091
|
+
"github",
|
|
93092
|
+
"workspace",
|
|
93093
|
+
"browser-operator"
|
|
93094
|
+
],
|
|
93095
|
+
"preferredTools": [
|
|
93096
|
+
"bash",
|
|
93097
|
+
"runBashTerminalCommand",
|
|
93098
|
+
"webFetch",
|
|
93099
|
+
"browser_observe",
|
|
93100
|
+
"browser_wait"
|
|
93101
|
+
]
|
|
93102
|
+
},
|
|
92999
93103
|
{
|
|
93000
93104
|
"id": "workspace",
|
|
93001
93105
|
"name": "workspace",
|
|
@@ -93129,6 +93233,14 @@ function selectAgentSkills(input) {
|
|
|
93129
93233
|
if (/\b(ap|accounts?\s+payable)\b/i.test(text)) {
|
|
93130
93234
|
explicit.add("data-quality");
|
|
93131
93235
|
}
|
|
93236
|
+
if (/\b(vercel|deploy(?:ment)?|github\s+actions?|ci|checks?)\b/i.test(text)) {
|
|
93237
|
+
if (/\b(wait|watch|poll|monitor|keep\s+checking|check\s+until|status)\b/i.test(text)) {
|
|
93238
|
+
explicit.add("wait-operator");
|
|
93239
|
+
}
|
|
93240
|
+
}
|
|
93241
|
+
if (/\b(github|git\b|pull\s+request|pr\b|commit|push|branch|ci|checks?)\b/i.test(text)) {
|
|
93242
|
+
explicit.add("github");
|
|
93243
|
+
}
|
|
93132
93244
|
if (isMarketDeskSignalTask(text, availableToolNames)) {
|
|
93133
93245
|
explicit.delete("research");
|
|
93134
93246
|
omitted.push({
|
|
@@ -93183,6 +93295,9 @@ var init_skillSelector = __esm({
|
|
|
93183
93295
|
"browser_navigate"
|
|
93184
93296
|
]);
|
|
93185
93297
|
CORE_PRIORITY = [
|
|
93298
|
+
"wait-operator",
|
|
93299
|
+
"release",
|
|
93300
|
+
"github",
|
|
93186
93301
|
"data-quality",
|
|
93187
93302
|
"presentations",
|
|
93188
93303
|
"spreadsheets",
|
|
@@ -93218,6 +93333,18 @@ var init_skillSelector = __esm({
|
|
|
93218
93333
|
/\b(research|credible\s+sources?|current\s+source|citations?|source\s+comparison|scholarly|public\s+web|fact[-\s]?check|latest|recent|filing)\b/i,
|
|
93219
93334
|
/\b(find|gather|compare|verify)\b.{0,48}\b(sources?|evidence|filings?)\b/i
|
|
93220
93335
|
],
|
|
93336
|
+
github: [
|
|
93337
|
+
/\b(github|git\s+(?:status|diff|log|show|commit|push|pull|branch)|commit\s+(?:these|changes|and\s+push)|push\s+(?:this|the|branch)|pull\s+request|pr\s+#?\d*|review\s+commits?|github\s+checks?|ci\s+(?:failure|checks?|run)|release\s+branch)\b/i,
|
|
93338
|
+
/\b(stage|commit|push)\b.{0,56}\b(changes?|branch|repo|github)\b/i
|
|
93339
|
+
],
|
|
93340
|
+
release: [
|
|
93341
|
+
/\b(release|ship|publish|repackage)\b.{0,32}\b(cli|perch|desktop|app|version|build|package|installer)\b/i,
|
|
93342
|
+
/\b(cut\s+a\s+release|bump\s+(?:the\s+)?version|tag\s+and\s+push|new\s+(?:cli\s+)?version)\b/i
|
|
93343
|
+
],
|
|
93344
|
+
"wait-operator": [
|
|
93345
|
+
/\b(wait\s+(?:for|until)|watch\s+(?:the|this)?|poll\s+(?:status|until|for)|keep\s+checking|check\s+(?:until|back|again)|monitor\s+(?:progress|status|deploy)|long[-\s]?running\s+task|deployment\s+status|wake\s+when\s+done)\b/i,
|
|
93346
|
+
/\b(vercel|deploy(?:ment)?|github\s+actions?|ci|checks?|background\s+job|server|localhost)\b.{0,64}\b(ready|done|finish(?:ed)?|complete|succeed(?:ed)?|fail(?:ed)?|status)\b/i
|
|
93347
|
+
],
|
|
93221
93348
|
diagrams: [
|
|
93222
93349
|
/\b(diagram|mermaid|drawio|workflow\s+graph|org\s+chart|entity\s+network|control\s+graph|architecture\s+map|vendor[-\s]?risk\s+graph|nodes?\s+and\s+edges?)\b/i,
|
|
93223
93350
|
/\b(graph|map)\b.{0,32}\b(risk|workflow|architecture|network|relationship)\b/i
|
|
@@ -216988,6 +217115,53 @@ var init_toolExecutor = __esm({
|
|
|
216988
217115
|
}
|
|
216989
217116
|
});
|
|
216990
217117
|
|
|
217118
|
+
// features/perchTerminal/runtime/transcript/fileDiff.ts
|
|
217119
|
+
function lineDiff(oldText, newText) {
|
|
217120
|
+
const a = oldText.length ? oldText.split("\n") : [];
|
|
217121
|
+
const b2 = newText.length ? newText.split("\n") : [];
|
|
217122
|
+
const m = a.length;
|
|
217123
|
+
const n = b2.length;
|
|
217124
|
+
const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
|
|
217125
|
+
for (let i2 = m - 1; i2 >= 0; i2--) {
|
|
217126
|
+
for (let j2 = n - 1; j2 >= 0; j2--) {
|
|
217127
|
+
dp[i2][j2] = a[i2] === b2[j2] ? dp[i2 + 1][j2 + 1] + 1 : Math.max(dp[i2 + 1][j2], dp[i2][j2 + 1]);
|
|
217128
|
+
}
|
|
217129
|
+
}
|
|
217130
|
+
const rows = [];
|
|
217131
|
+
let i = 0;
|
|
217132
|
+
let j = 0;
|
|
217133
|
+
while (i < m && j < n) {
|
|
217134
|
+
if (a[i] === b2[j]) {
|
|
217135
|
+
rows.push({ t: "ctx", text: a[i] });
|
|
217136
|
+
i++;
|
|
217137
|
+
j++;
|
|
217138
|
+
} else if (dp[i + 1][j] >= dp[i][j + 1]) {
|
|
217139
|
+
rows.push({ t: "del", text: a[i] });
|
|
217140
|
+
i++;
|
|
217141
|
+
} else {
|
|
217142
|
+
rows.push({ t: "add", text: b2[j] });
|
|
217143
|
+
j++;
|
|
217144
|
+
}
|
|
217145
|
+
}
|
|
217146
|
+
while (i < m) rows.push({ t: "del", text: a[i++] });
|
|
217147
|
+
while (j < n) rows.push({ t: "add", text: b2[j++] });
|
|
217148
|
+
return rows;
|
|
217149
|
+
}
|
|
217150
|
+
function lineDiffCounts(oldText, newText) {
|
|
217151
|
+
let added = 0;
|
|
217152
|
+
let removed = 0;
|
|
217153
|
+
for (const row of lineDiff(oldText, newText)) {
|
|
217154
|
+
if (row.t === "add") added++;
|
|
217155
|
+
else if (row.t === "del") removed++;
|
|
217156
|
+
}
|
|
217157
|
+
return { added, removed };
|
|
217158
|
+
}
|
|
217159
|
+
var init_fileDiff = __esm({
|
|
217160
|
+
"features/perchTerminal/runtime/transcript/fileDiff.ts"() {
|
|
217161
|
+
"use strict";
|
|
217162
|
+
}
|
|
217163
|
+
});
|
|
217164
|
+
|
|
216991
217165
|
// features/perchTerminal/runtime/toolLoop/autoRouterTurnPolicy.ts
|
|
216992
217166
|
function addAutoRouterAvoidFromProviderError(error, lane, avoid) {
|
|
216993
217167
|
const match = error.match(/^([a-z0-9_]+)\s+returned\b/i);
|
|
@@ -217905,13 +218079,18 @@ async function executeToolBatch(toolCalls, ctx) {
|
|
|
217905
218079
|
const filePath = typeof out?.relativePath === "string" ? out.relativePath : null;
|
|
217906
218080
|
if (filePath) {
|
|
217907
218081
|
const isWrite = toolCall.name === "writeLocalFile";
|
|
217908
|
-
const
|
|
218082
|
+
const args = toolCall.arguments ?? {};
|
|
218083
|
+
const overwrite = args.overwrite === true;
|
|
218084
|
+
const { added, removed } = isWrite ? lineDiffCounts("", typeof args.content === "string" ? args.content : "") : lineDiffCounts(
|
|
218085
|
+
typeof args.oldText === "string" ? args.oldText : "",
|
|
218086
|
+
typeof args.newText === "string" ? args.newText : ""
|
|
218087
|
+
);
|
|
217909
218088
|
ctx.onEvent({
|
|
217910
218089
|
type: "file_change_summary",
|
|
217911
218090
|
filePath,
|
|
217912
218091
|
changeKind: isWrite && !overwrite ? "created" : "modified",
|
|
217913
|
-
linesAdded:
|
|
217914
|
-
linesRemoved:
|
|
218092
|
+
linesAdded: added,
|
|
218093
|
+
linesRemoved: removed,
|
|
217915
218094
|
toolCallId: toolCall.id,
|
|
217916
218095
|
ts: now6()
|
|
217917
218096
|
});
|
|
@@ -218164,6 +218343,7 @@ var init_toolBatchExecutor = __esm({
|
|
|
218164
218343
|
"use strict";
|
|
218165
218344
|
init_modelRegistry();
|
|
218166
218345
|
init_toolExecutor();
|
|
218346
|
+
init_fileDiff();
|
|
218167
218347
|
init_toolNames();
|
|
218168
218348
|
init_localCommandPolicy();
|
|
218169
218349
|
init_toolArgHardening();
|
|
@@ -287199,6 +287379,8 @@ __export(perch_cli_exports, {
|
|
|
287199
287379
|
HELP_TEXT: () => HELP_TEXT,
|
|
287200
287380
|
INTERACTIVE_HELP_TEXT: () => INTERACTIVE_HELP_TEXT,
|
|
287201
287381
|
PERCH_SPLASH_COMMANDS: () => PERCH_SPLASH_COMMANDS,
|
|
287382
|
+
cliWorkerActivityVerb: () => cliWorkerActivityVerb,
|
|
287383
|
+
composeWorkerActivityRowText: () => composeWorkerActivityRowText,
|
|
287202
287384
|
flockEventToCliRow: () => flockEventToCliRow,
|
|
287203
287385
|
flockNicknameAccentColor: () => flockNicknameAccentColor,
|
|
287204
287386
|
parseInteractiveSlashCommand: () => parseInteractiveSlashCommand,
|
|
@@ -287257,6 +287439,19 @@ function workerEventToCliRow(event) {
|
|
|
287257
287439
|
return null;
|
|
287258
287440
|
}
|
|
287259
287441
|
}
|
|
287442
|
+
function composeWorkerActivityRowText(base, activity) {
|
|
287443
|
+
const parts = [base.displayName];
|
|
287444
|
+
if (base.nickname) parts.push(base.nickname);
|
|
287445
|
+
const callCount = activity && activity.calls > 0 ? `${activity.calls} ${activity.calls === 1 ? "call" : "calls"}` : null;
|
|
287446
|
+
if (!base.done && activity && activity.calls > 0) {
|
|
287447
|
+
parts.push(cliWorkerActivityVerb(activity.lastTool));
|
|
287448
|
+
if (callCount) parts.push(callCount);
|
|
287449
|
+
} else {
|
|
287450
|
+
parts.push(FLOCK_STATUS_LABELS[base.status] ?? base.status);
|
|
287451
|
+
if (base.done && callCount) parts.push(callCount);
|
|
287452
|
+
}
|
|
287453
|
+
return parts.join(" \xB7 ");
|
|
287454
|
+
}
|
|
287260
287455
|
async function runPerchCli(argv, writer = defaultWriter(), deps = {}) {
|
|
287261
287456
|
const parsed = parsePerchCli(argv);
|
|
287262
287457
|
if (!parsed.ok) {
|
|
@@ -287859,6 +288054,14 @@ async function runInkInteractivePerchCli(writer, deps, options) {
|
|
|
287859
288054
|
const toolNamesById = /* @__PURE__ */ new Map();
|
|
287860
288055
|
const flockWorkerNames = /* @__PURE__ */ new Map();
|
|
287861
288056
|
const workerTitles = /* @__PURE__ */ new Map();
|
|
288057
|
+
const workerRowState = /* @__PURE__ */ new Map();
|
|
288058
|
+
const workerActivity = /* @__PURE__ */ new Map();
|
|
288059
|
+
const renderWorkerActivityRow = (workerId) => {
|
|
288060
|
+
const base = workerRowState.get(workerId);
|
|
288061
|
+
if (!base) return;
|
|
288062
|
+
const text = composeWorkerActivityRowText(base, workerActivity.get(workerId));
|
|
288063
|
+
updateToolItem(base.rowId, { label: base.label, text, tone: base.tone });
|
|
288064
|
+
};
|
|
287862
288065
|
const flockLimitMeta = /* @__PURE__ */ new Map();
|
|
287863
288066
|
const aggregateToolIds = /* @__PURE__ */ new Map();
|
|
287864
288067
|
const aggregateToolMeta = /* @__PURE__ */ new Map();
|
|
@@ -287924,7 +288127,15 @@ async function runInkInteractivePerchCli(writer, deps, options) {
|
|
|
287924
288127
|
setWorkingText("recovering route");
|
|
287925
288128
|
break;
|
|
287926
288129
|
case "tool_call_started": {
|
|
287927
|
-
if (event.workerId)
|
|
288130
|
+
if (event.workerId) {
|
|
288131
|
+
const act = workerActivity.get(event.workerId) ?? { calls: 0, lastTool: event.toolName };
|
|
288132
|
+
act.calls += 1;
|
|
288133
|
+
act.lastTool = event.toolName;
|
|
288134
|
+
workerActivity.set(event.workerId, act);
|
|
288135
|
+
renderWorkerActivityRow(event.workerId);
|
|
288136
|
+
setWorkingText(cliWorkerActivityVerb(event.toolName));
|
|
288137
|
+
break;
|
|
288138
|
+
}
|
|
287928
288139
|
if (event.toolName === "spawn_worker") break;
|
|
287929
288140
|
const toolId = event.toolCallId ?? `${event.toolName}-${Date.now()}`;
|
|
287930
288141
|
const name = humanizeCliToolName(event.toolName);
|
|
@@ -288240,7 +288451,17 @@ async function runInkInteractivePerchCli(writer, deps, options) {
|
|
|
288240
288451
|
const row = workerEventToCliRow(event);
|
|
288241
288452
|
if (!row) break;
|
|
288242
288453
|
if (row.id) {
|
|
288243
|
-
|
|
288454
|
+
const done = event.type === "worker_run_completed";
|
|
288455
|
+
const status = done ? event.ok ? event.usabilityStatus === "needs_user_input" ? "blocked" : "done" : "failed" : "running";
|
|
288456
|
+
workerRowState.set(event.workerId, {
|
|
288457
|
+
rowId: row.id,
|
|
288458
|
+
label: "worker",
|
|
288459
|
+
displayName: event.title,
|
|
288460
|
+
status,
|
|
288461
|
+
tone: row.tone,
|
|
288462
|
+
done
|
|
288463
|
+
});
|
|
288464
|
+
renderWorkerActivityRow(event.workerId);
|
|
288244
288465
|
} else {
|
|
288245
288466
|
addItem({ label: "worker", text: row.text, tone: row.tone });
|
|
288246
288467
|
}
|
|
@@ -288264,7 +288485,19 @@ async function runInkInteractivePerchCli(writer, deps, options) {
|
|
|
288264
288485
|
}
|
|
288265
288486
|
const row = flockEventToCliRow(event);
|
|
288266
288487
|
if (!row) break;
|
|
288267
|
-
if (row.id) {
|
|
288488
|
+
if (event.type === "flock_worker_update" && row.id) {
|
|
288489
|
+
const done = !(event.status === "queued" || event.status === "waiting" || event.status === "running");
|
|
288490
|
+
workerRowState.set(event.workerId, {
|
|
288491
|
+
rowId: row.id,
|
|
288492
|
+
label: "flock",
|
|
288493
|
+
displayName: event.displayName,
|
|
288494
|
+
nickname: event.nickname,
|
|
288495
|
+
status: event.status,
|
|
288496
|
+
tone: row.tone,
|
|
288497
|
+
done
|
|
288498
|
+
});
|
|
288499
|
+
renderWorkerActivityRow(event.workerId);
|
|
288500
|
+
} else if (row.id) {
|
|
288268
288501
|
updateToolItem(row.id, { label: "flock", text: row.text, tone: row.tone });
|
|
288269
288502
|
} else {
|
|
288270
288503
|
addItem({ label: "flock", text: row.text, tone: row.tone });
|
|
@@ -289325,7 +289558,7 @@ function colorForInkDetailTone(tone) {
|
|
|
289325
289558
|
case "add":
|
|
289326
289559
|
return CLI_BRAND.patinaActive;
|
|
289327
289560
|
case "remove":
|
|
289328
|
-
return CLI_BRAND.
|
|
289561
|
+
return CLI_BRAND.brick;
|
|
289329
289562
|
case "stderr":
|
|
289330
289563
|
return "#d06b55";
|
|
289331
289564
|
case "command":
|
|
@@ -289342,18 +289575,18 @@ function colorForCliSyntaxTone(tone, lineTone) {
|
|
|
289342
289575
|
if (lineTone === "remove") {
|
|
289343
289576
|
switch (tone) {
|
|
289344
289577
|
case "comment":
|
|
289345
|
-
return "#
|
|
289578
|
+
return "#9e6a5e";
|
|
289346
289579
|
case "string":
|
|
289347
|
-
return "#
|
|
289580
|
+
return "#d98a72";
|
|
289348
289581
|
case "keyword":
|
|
289349
289582
|
case "flag":
|
|
289350
|
-
return CLI_BRAND.
|
|
289583
|
+
return CLI_BRAND.brickGlint;
|
|
289351
289584
|
case "number":
|
|
289352
|
-
return "#
|
|
289585
|
+
return "#d2705a";
|
|
289353
289586
|
case "operator":
|
|
289354
|
-
return CLI_BRAND.
|
|
289587
|
+
return CLI_BRAND.brickDeep;
|
|
289355
289588
|
default:
|
|
289356
|
-
return CLI_BRAND.
|
|
289589
|
+
return CLI_BRAND.brick;
|
|
289357
289590
|
}
|
|
289358
289591
|
}
|
|
289359
289592
|
if (lineTone === "add") {
|
|
@@ -289560,6 +289793,19 @@ function cliToolAggregateKind(toolName) {
|
|
|
289560
289793
|
if (normalized === "glob" || normalized === "grep" || normalized === "listlocalsources" || normalized === "statpath" || normalized === "validateworkspaceroot") return "search";
|
|
289561
289794
|
return null;
|
|
289562
289795
|
}
|
|
289796
|
+
function cliWorkerActivityVerb(toolName) {
|
|
289797
|
+
const aggregate = cliToolAggregateKind(toolName);
|
|
289798
|
+
if (aggregate === "read") return "reading";
|
|
289799
|
+
if (aggregate === "search") return "searching";
|
|
289800
|
+
const n = toolName.toLowerCase();
|
|
289801
|
+
if (n.includes("write") && n.includes("file")) return "writing";
|
|
289802
|
+
if (n.includes("edit") && n.includes("file")) return "editing";
|
|
289803
|
+
if (n.includes("patch")) return "patching";
|
|
289804
|
+
if (n === "run_sandbox_code") return "running code";
|
|
289805
|
+
if (n.includes("bash") || n.includes("terminal") || n.includes("shell")) return "running";
|
|
289806
|
+
if (n === "spawn_worker" || n === "dispatch_agent") return "delegating";
|
|
289807
|
+
return "working";
|
|
289808
|
+
}
|
|
289563
289809
|
function getCliToolAggregateMeta(store, kind) {
|
|
289564
289810
|
const existing = store.get(kind);
|
|
289565
289811
|
if (existing) return existing;
|
|
@@ -290036,6 +290282,11 @@ var init_perch_cli = __esm({
|
|
|
290036
290282
|
bronze: "#9A5228",
|
|
290037
290283
|
bronzeGlint: "#B5632F",
|
|
290038
290284
|
bronzeDeep: "#6F351D",
|
|
290285
|
+
// Diff "removed" family — warm muted brick red, brand-tuned (not git red),
|
|
290286
|
+
// kept distinct from bronze so deletions don't share the accent/interactive hue.
|
|
290287
|
+
brick: "#CF6A52",
|
|
290288
|
+
brickGlint: "#DC7A60",
|
|
290289
|
+
brickDeep: "#9E4634",
|
|
290039
290290
|
graphite: "#0F0D0B",
|
|
290040
290291
|
divider: "#32251E",
|
|
290041
290292
|
cream: "#FFF8F0",
|