@tacuchi/agent-workflow-cli 21.3.1 → 21.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/application/capability/wrapper.js +8 -7
  2. package/dist/application/capability/wrapper.js.map +1 -1
  3. package/dist/application/dev-only-services.js +63 -15
  4. package/dist/application/dev-only-services.js.map +1 -1
  5. package/dist/application/self/host-states.js +11 -0
  6. package/dist/application/self/host-states.js.map +1 -1
  7. package/dist/application/self/install-skill.js +15 -3
  8. package/dist/application/self/install-skill.js.map +1 -1
  9. package/dist/application/source-launch-service.js +38 -3
  10. package/dist/application/source-launch-service.js.map +1 -1
  11. package/dist/cli/commands/capability.js +8 -4
  12. package/dist/cli/commands/capability.js.map +1 -1
  13. package/dist/cli/commands/dev-only.js +7 -3
  14. package/dist/cli/commands/dev-only.js.map +1 -1
  15. package/dist/cli/commands/flow.js +5 -0
  16. package/dist/cli/commands/flow.js.map +1 -1
  17. package/dist/cli/commands/skills.js +14 -3
  18. package/dist/cli/commands/skills.js.map +1 -1
  19. package/dist/cli/tui/tabs/project-tab.js +92 -68
  20. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  21. package/dist/cli/tui/tabs/skills-tab.js +57 -19
  22. package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
  23. package/dist/domain/design/maturity.js +8 -6
  24. package/dist/domain/design/maturity.js.map +1 -1
  25. package/dist/domain/design/visual-evidence.js +11 -27
  26. package/dist/domain/design/visual-evidence.js.map +1 -1
  27. package/dist/domain/harnesses.js +9 -1
  28. package/dist/domain/harnesses.js.map +1 -1
  29. package/dist/domain/resource-policy.js +111 -0
  30. package/dist/domain/resource-policy.js.map +1 -0
  31. package/package.json +1 -1
  32. package/skills/w/harness/HARNESS.md +25 -2
  33. package/skills/w/loops/CHASSIS.md +2 -2
  34. package/skills/w/loops/plan-new-loop/LOOP.md +4 -3
  35. package/skills/w/loops/spec-refine-loop/LOOP.md +2 -2
  36. package/skills/w/modules/DESIGN-REFERENCES.md +14 -12
  37. package/skills/w/roles/design/ROLE.md +9 -5
@@ -1 +1 @@
1
- {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { runHarness, runLogs, runNextNumber, runProfiles, } from "../../application/dev-only-services.js";
1
+ import { isHarnessId, runHarness, runLogs, runNextNumber, runProfiles, } from "../../application/dev-only-services.js";
2
2
  import { HARNESSES } from "../../domain/harnesses.js";
3
3
  import { fail } from "../render.js";
4
4
  // Derived from the catalog: the describe used to name two hosts out of seven.
@@ -6,8 +6,12 @@ const HARNESS_IDS = HARNESSES.map((h) => h.id).join(" | ");
6
6
  export const harnessCommand = {
7
7
  name: "harness",
8
8
  describe: `Identify the host harness from its env markers (${HARNESS_IDS} | unknown). 'unknown' is a legitimate answer — some hosts export no marker to their subprocesses; use 'self detect-hosts' for what is actually installed on the machine.`,
9
- async execute(_args, ctx) {
10
- const data = runHarness((k) => ctx.env.get(k));
9
+ async execute(args, ctx) {
10
+ const requested = args.values.get("host");
11
+ if (requested !== undefined && !isHarnessId(requested)) {
12
+ return fail("INVALID_INPUT", `--host inválido: '${requested}'. Valores válidos: ${HARNESS_IDS}`);
13
+ }
14
+ const data = runHarness((k) => ctx.env.get(k), requested);
11
15
  return { ok: true, data, exitCode: 0 };
12
16
  },
13
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"dev-only.js","sourceRoot":"","sources":["../../../src/cli/commands/dev-only.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev-only.js","sourceRoot":"","sources":["../../../src/cli/commands/dev-only.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { WORKLINE_FLOWS } from "../../application/capability/compose.js";
2
+ import { isHarnessId } from "../../application/dev-only-services.js";
2
3
  import { advanceFlow } from "../../application/flow/flow-service.js";
3
4
  import { submitFlow } from "../../application/flow/submit.js";
4
5
  import { renderDirectiveHuman } from "../../domain/flow/directive.js";
@@ -23,6 +24,10 @@ export const flowCommand = {
23
24
  name: "flow",
24
25
  describe: `Avanza un recorrido de Workline hasta su primera frontera no determinista y devuelve su directiva. Verbos: ${VERBS.join(" | ")}. La respuesta de submit entra por stdin como JSON y la aprobación de efecto viaja aparte en --approval. Usage: aw flow advance --session <código> [--flow <flow> --adopt].`,
25
26
  async execute(args, ctx) {
27
+ const requestedHost = args.values.get("host");
28
+ if (requestedHost !== undefined && !isHarnessId(requestedHost)) {
29
+ return fail("ARGS_INVALID", `--host no reconoce '${requestedHost}'; elegí un host del catálogo instalado.`);
30
+ }
26
31
  const verb = args.rest[0];
27
32
  if (verb === undefined || !VERBS.includes(verb)) {
28
33
  return fail("ARGS_INVALID", `uso: aw flow ${VERBS.join(" | ")} --session <código> [--flow <flow> --adopt] [--approval <digest>]`);
@@ -1 +1 @@
1
- {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/commands/flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/commands/flow.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,24 @@
1
1
  import "../../application/capability/design-handler.js";
2
2
  import { capabilityReadiness, } from "../../application/capability/readiness.js";
3
- import { runHarness } from "../../application/dev-only-services.js";
3
+ import { isHarnessId, runHarness } from "../../application/dev-only-services.js";
4
4
  import { checkInstalledBindings, resolveSkills, } from "../../application/skills-resolver-service.js";
5
5
  export const skillsCommand = {
6
6
  name: "skills",
7
7
  describe: "Show resolved capability→skill bindings (skills.toml cascade). Usage: aw skills [--detail] — " +
8
8
  "con --detail agrega readiness por capacidad, exposición y operación, la instancia exacta o el " +
9
9
  "floor, y la forma de invocación que el host soporta de verdad.",
10
- async execute(_args, ctx) {
10
+ async execute(args, ctx) {
11
+ const requested = args.values.get("host");
12
+ if (requested !== undefined && !isHarnessId(requested)) {
13
+ return {
14
+ ok: false,
15
+ error: {
16
+ code: "INVALID_INPUT",
17
+ message: `--host inválido: '${requested}'. Usá un host del catálogo.`,
18
+ },
19
+ exitCode: 1,
20
+ };
21
+ }
11
22
  const resolution = await resolveSkills(ctx.fs, ctx.paths);
12
23
  const validation = await checkInstalledBindings(ctx.fs, ctx.env, resolution);
13
24
  const data = {
@@ -19,7 +30,7 @@ export const skillsCommand = {
19
30
  fs: ctx.fs,
20
31
  env: ctx.env,
21
32
  paths: ctx.paths,
22
- host: runHarness((k) => ctx.env.get(k)).harness,
33
+ host: runHarness((k) => ctx.env.get(k), requested).agent_host,
23
34
  }),
24
35
  };
25
36
  return { ok: true, data, exitCode: 0 };
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,gDAAgD,CAAC;AACxD,OAAO,EAEL,mBAAmB,GACpB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EACL,sBAAsB,EACtB,aAAa,GACd,MAAM,8CAA8C,CAAC;AAwBtD,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,IAAI,EAAE,QAAQ;IACd,QAAQ,EACN,+FAA+F;QAC/F,gGAAgG;QAChG,gEAAgE;IAElE,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,qBAAqB,SAAS,8BAA8B;iBACtE;gBACD,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAe;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,aAAa,EAAE,UAAU,CAAC,MAAM;YAChC,QAAQ,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC;YAC1D,YAAY,EAAE,MAAM,mBAAmB,CAAC;gBACtC,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,UAAU;aAC9D,CAAC;SACH,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,MAAiC,EAAE,OAA2B;QACxE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACpF,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC,CAAC;CACF,CAAC;AAEF,SAAS,YAAY,CAAC,MAAiC;IACrD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,gBAAgB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACrF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CACR,iBAAiB,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,eAAe,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CACrH,CAAC;IACF,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,KAAK,CAAC,OAAO;QAClB,CAAC,CAAC,mCAAmC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG;QACzD,CAAC,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,EAAE,CACrF,CAAC;IACF,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,KAAK,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,CACvF,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACR,OAAO,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,SAAS,eAAe,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3G,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CACR,YAAY,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,WAAW,CAAC,GAAG,EAAE,EAAE,CACzG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -5,14 +5,13 @@ import { useCallback, useEffect, useMemo, useState } from "react";
5
5
  import { runGitFlow, } from "../../../application/git-flow-service.js";
6
6
  import { formatTuiEvent } from "../../../application/logging/log-events.js";
7
7
  import { buildProjectTabData, } from "../../../application/project-tab-data.js";
8
- import { ensureDescriptor, findCollision, launchSource, relaunchProcess, stopProcess, tailLog, } from "../../../application/source-launch-service.js";
8
+ import { ensureDescriptor, findCollision, launchSource, relaunchProcess, stopFailed, stopProcess, tailLog, } from "../../../application/source-launch-service.js";
9
9
  import { removeSource } from "../../../application/source-remove-service.js";
10
10
  import { DetailPanel, } from "../components/detail-panel.js";
11
11
  import { FlowResultView } from "../components/git-flow-actions.js";
12
12
  import { ListRow } from "../components/list-row.js";
13
13
  import { notificationStackRows } from "../components/notification-stack.js";
14
14
  import { PageHead } from "../components/page-head.js";
15
- import { ProcessList } from "../components/process-list.js";
16
15
  import { QuickActions } from "../components/quick-actions.js";
17
16
  import { SectionHead } from "../components/section-head.js";
18
17
  import { SourceLaunchForm } from "../components/source-launch-form.js";
@@ -164,6 +163,17 @@ const FLOW_ACTIONS = [
164
163
  ];
165
164
  /** First per-source detail action: launch the app locally. */
166
165
  const LAUNCH_ACTION = { id: "launch", name: "Lanzar en local" };
166
+ /**
167
+ * The three operations offered per `running` process of the selected source —
168
+ * the same ones the removed process region carried on x/r/o. No description:
169
+ * the row spells the profile and the PID, and the panel's remaining width
170
+ * would truncate one to a single cell.
171
+ */
172
+ const PROCESS_OPS = {
173
+ stop: "Detener",
174
+ relaunch: "Re-lanzar",
175
+ log: "Ver log",
176
+ };
167
177
  /**
168
178
  * Indentation (marginLeft) of the SOURCES rows container. Passed as `indent`
169
179
  * to {@link rowWidth} so the row width subtracts that marginLeft — otherwise
@@ -182,16 +192,15 @@ const SOURCES_ROWS_INDENT = 2;
182
192
  // - this tab, fixed: PageHead (1 + 1 margin) + StatTile row (3 + 1 margin)
183
193
  // + Sources SectionHead (1) + QuickActions (2 + 1 marginTop) = 10
184
194
  // - 1 slack: better one row short than a clipped active row.
185
- // The data-driven rows (description, warnings, the branch/process sections
186
- // below the list) and the NotificationStack height (0 unless a banner is
187
- // visible) are added per render see `reservedRows` in Initialized.
195
+ // The data-driven rows (description, warnings) and the NotificationStack height
196
+ // (0 unless a banner is visible) are added per render see `reservedRows` in
197
+ // Initialized. Nothing renders below the list anymore (SPEC 019).
188
198
  const SOURCES_LIST_RESERVED_ROWS = 27;
189
199
  function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
190
200
  const dirty = data.git?.dirty ?? 0;
191
201
  const totalSources = data.sources.length;
192
202
  const dirtySources = data.sources.filter((s) => s.dirty).length;
193
203
  const workingEntries = Object.entries(data.workingBranches);
194
- const qaEntries = Object.entries(data.qaBranches);
195
204
  const home = ctx.env.homeDir();
196
205
  const shortName = deriveShortName(data.workspaceName, basename(data.workspacePath));
197
206
  const description = deriveDescription(data.workspaceName);
@@ -202,30 +211,32 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
202
211
  const hasSources = totalSources > 0;
203
212
  const [cursor, setCursor] = useState(0);
204
213
  const [actionCursor, setActionCursor] = useState(0);
205
- const [processCursor, setProcessCursor] = useState(0);
206
214
  const [mode, setMode] = useState({ kind: "list" });
207
215
  const processes = data.processes;
208
- const runningCount = useMemo(() => processes.filter((p) => p.state === "running").length, [processes]);
216
+ // Active processes per source alias: the source row's chip and the global
217
+ // tile both read from here, so "active" has one definition. `stopped` and
218
+ // `exited` records are history and never counted (SPEC 019).
219
+ const runningBySource = useMemo(() => {
220
+ const byAlias = new Map();
221
+ for (const p of processes) {
222
+ if (p.state === "running")
223
+ byAlias.set(p.sourceAlias, (byAlias.get(p.sourceAlias) ?? 0) + 1);
224
+ }
225
+ return byAlias;
226
+ }, [processes]);
227
+ const runningCount = useMemo(() => [...runningBySource.values()].reduce((total, n) => total + n, 0), [runningBySource]);
209
228
  // Window over the SOURCES list: the shell clips overflow, so only the slice
210
229
  // around the cursor renders — the active row can never walk off-screen.
211
230
  // `reservedRows` adds the data-driven chrome to the static count: the
212
- // description and warnings blocks above the list; the branch/process
213
- // sections below it (head + marginTop + one row per entry, or one
214
- // empty-hint row when the section renders empty); plus the NotificationStack
231
+ // description and warnings blocks above the list, plus the NotificationStack
215
232
  // height while a banner is visible (0 otherwise). rows=0 (non-TTY) → the
216
233
  // hook returns the whole list and nothing changes.
217
234
  const notifItems = useNotificationItems();
218
235
  const warningsRows = data.warnings.length > 0 ? Math.min(data.warnings.length, 3) + 2 : 0;
219
- const workingRows = 2 + Math.max(workingEntries.length, 1);
220
- const qaRows = qaEntries.length > 0 ? 2 + qaEntries.length : 0;
221
- const processRows = 2 + Math.max(processes.length, 1);
222
236
  const reservedRows = SOURCES_LIST_RESERVED_ROWS +
223
237
  notificationStackRows(notifItems) +
224
238
  (description ? 2 : 0) +
225
- warningsRows +
226
- workingRows +
227
- qaRows +
228
- processRows;
239
+ warningsRows;
229
240
  const win = useListWindow(targets.length, cursor, reservedRows);
230
241
  const winEnd = win.start + win.visible;
231
242
  // Overflow indicator for the SectionHead hint slot (no extra terminal row).
@@ -293,9 +304,25 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
293
304
  }, [ctx, doLaunch, launchDeps]);
294
305
  const doStop = useCallback(async (record) => {
295
306
  setMode({ kind: "busy", label: `Deteniendo ${record.sourceAlias}…` });
296
- await stopProcess(launchDeps, record);
297
- void ctx.logger?.info(formatTuiEvent(`stop ${record.sourceAlias} (PID ${record.pid})`, "ok"));
298
- setMode({ kind: "list" });
307
+ const res = await stopProcess(launchDeps, record);
308
+ const event = `stop ${record.sourceAlias} (PID ${record.pid})`;
309
+ // A stop that did not kill anything is a warning, not an "ok": the daily
310
+ // log is the only trace once the notice is dismissed.
311
+ void ctx.logger?.log(res.stopped ? "info" : "warn", formatTuiEvent(event, res.stopped ? "ok" : "sigue vivo"));
312
+ setMode(res.stopped
313
+ ? {
314
+ kind: "notice",
315
+ tone: "ok",
316
+ lines: [`Detenido ${record.sourceAlias} (PID ${record.pid}).`],
317
+ }
318
+ : {
319
+ kind: "notice",
320
+ tone: "err",
321
+ lines: [
322
+ `${record.sourceAlias} (PID ${record.pid}) sigue vivo tras la señal.`,
323
+ "Sigue contando como activo; detenelo desde el sistema y refrescá.",
324
+ ],
325
+ });
299
326
  await onReload?.();
300
327
  }, [launchDeps, onReload, ctx]);
301
328
  // Shared tail of doRelaunch/confirmRelaunch: daily-log entry + notice + reload.
@@ -322,8 +349,7 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
322
349
  });
323
350
  }, [ctx.fs]);
324
351
  // Global keys are locked for every mode except the plain list and the detail
325
- // panel (its ↑↓ ⏎ esc don't collide with the globals); process mode keeps
326
- // the lock — its r/x/o would hit the global `r` refresh. MCP/Skills policy.
352
+ // panel (its ↑↓ ⏎ esc don't collide with the globals). MCP/Skills policy.
327
353
  useLockWhile(mode.kind !== "list" && mode.kind !== "detail");
328
354
  const detailOpen = mode.kind === "detail";
329
355
  const currentTarget = targets[cursor] ?? ALL_SOURCES;
@@ -331,14 +357,25 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
331
357
  const currentSource = isAllTarget
332
358
  ? null
333
359
  : (data.sources.find((s) => s.alias === currentTarget) ?? null);
360
+ // The selected source's own active processes — what its detail panel can
361
+ // operate now that no process list exists.
362
+ const sourceProcesses = useMemo(() => currentSource
363
+ ? processes.filter((p) => p.state === "running" && p.sourceAlias === currentSource.alias)
364
+ : [], [processes, currentSource]);
334
365
  // Detail-panel actions for the current target: a per-source "Lanzar en local"
335
- // (only for real sources), the git-flow actions, and a destructive "Quitar del
336
- // workspace" last (only for real sources, never for "all sources").
366
+ // (only for real sources), the git-flow actions, one triplet per active
367
+ // process, and a destructive "Quitar del workspace" last (only for real
368
+ // sources, never for "all sources").
337
369
  const detailItems = useMemo(() => [
338
370
  ...(currentSource ? [{ kind: "launch" }] : []),
339
371
  ...FLOW_ACTIONS.map((a) => ({ kind: "flow", action: a.id })),
372
+ ...sourceProcesses.flatMap((record) => [
373
+ { kind: "proc", op: "stop", record },
374
+ { kind: "proc", op: "relaunch", record },
375
+ { kind: "proc", op: "log", record },
376
+ ]),
340
377
  ...(currentSource ? [{ kind: "remove" }] : []),
341
- ], [currentSource]);
378
+ ], [currentSource, sourceProcesses]);
342
379
  const runFlow = useCallback(async (action) => {
343
380
  const target = targets[cursor] ?? ALL_SOURCES;
344
381
  const isAll = target === ALL_SOURCES;
@@ -388,14 +425,10 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
388
425
  });
389
426
  await onReload?.();
390
427
  }, [ctx, onReload]);
391
- // Sources list shortcuts (↑↓ navigate · ⏎ open panel · p processes · g git status).
428
+ // Sources list shortcuts (↑↓ navigate · ⏎ open panel · g git status).
392
429
  const handleListKey = useCallback((input, key) => {
393
430
  if (input === "g")
394
431
  return void onRunAction?.("git:status");
395
- if (input === "p" && processes.length > 0) {
396
- setProcessCursor(0);
397
- return setMode({ kind: "process" });
398
- }
399
432
  if (!hasSources)
400
433
  return;
401
434
  if (key.upArrow)
@@ -406,7 +439,7 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
406
439
  setActionCursor(0);
407
440
  setMode({ kind: "detail" });
408
441
  }
409
- }, [hasSources, onRunAction, targets.length, processes.length]);
442
+ }, [hasSources, onRunAction, targets.length]);
410
443
  // Side panel actions (↑↓ navigate · ⏎ run · esc close).
411
444
  const handleDetailKey = useCallback((key) => {
412
445
  if (key.upArrow)
@@ -427,6 +460,13 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
427
460
  return void beginLaunch(currentSource.alias);
428
461
  return;
429
462
  }
463
+ if (item.kind === "proc") {
464
+ if (item.op === "stop")
465
+ return void doStop(item.record);
466
+ if (item.op === "relaunch")
467
+ return void doRelaunch(item.record);
468
+ return void doViewLog(item.record);
469
+ }
430
470
  if (item.kind === "remove") {
431
471
  if (currentSource)
432
472
  return setMode({ kind: "confirm-remove", alias: currentSource.alias });
@@ -434,30 +474,13 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
434
474
  }
435
475
  void runFlow(item.action);
436
476
  }
437
- }, [actionCursor, detailItems, currentSource, runFlow, beginLaunch]);
438
- // "process" mode: navigates the launched-processes section (x stop · r relaunch · o log).
439
- const handleProcessKey = useCallback((input, key) => {
440
- if (key.escape)
441
- return setMode({ kind: "list" });
442
- if (key.upArrow)
443
- return setProcessCursor((c) => Math.max(0, c - 1));
444
- if (key.downArrow)
445
- return setProcessCursor((c) => Math.min(processes.length - 1, c + 1));
446
- const record = processes[processCursor];
447
- if (!record)
448
- return;
449
- if (input === "x")
450
- return void doStop(record);
451
- if (input === "r")
452
- return void doRelaunch(record);
453
- if (input === "o")
454
- return void doViewLog(record);
455
- }, [processes, processCursor, doStop, doRelaunch, doViewLog]);
477
+ }, [actionCursor, detailItems, currentSource, runFlow, beginLaunch, doStop, doRelaunch, doViewLog]);
456
478
  // Collision: stops the existing process and launches the requested one (with its values).
457
479
  const confirmRelaunch = useCallback(async (req, existing) => {
458
480
  setMode({ kind: "busy", label: `Re-lanzando ${req.alias}…` });
459
- await stopProcess(launchDeps, existing);
460
- const res = await launchSource(launchDeps, req);
481
+ const stop = await stopProcess(launchDeps, existing);
482
+ // Same rule as relaunchProcess: never launch over a survivor.
483
+ const res = stop.stopped ? await launchSource(launchDeps, req) : stopFailed(existing.pid);
461
484
  await finishRelaunch(req.alias, res);
462
485
  }, [launchDeps, finishRelaunch]);
463
486
  // input — delegates to the handler of the active mode.
@@ -468,8 +491,6 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
468
491
  return handleListKey(input, key);
469
492
  if (mode.kind === "detail")
470
493
  return handleDetailKey(key);
471
- if (mode.kind === "process")
472
- return handleProcessKey(input, key);
473
494
  if (mode.kind === "collision") {
474
495
  if (key.escape)
475
496
  setMode({ kind: "list" });
@@ -531,6 +552,11 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
531
552
  ? { name: LAUNCH_ACTION.name, description: "abre una terminal" }
532
553
  : { name: LAUNCH_ACTION.name, description: "no lanzable — sin comando detectado" };
533
554
  }
555
+ if (it.kind === "proc") {
556
+ return {
557
+ name: `${PROCESS_OPS[it.op]} · ${it.record.profile ?? "default"} (PID ${it.record.pid})`,
558
+ };
559
+ }
534
560
  if (it.kind === "remove") {
535
561
  return { name: "Quitar del workspace", description: "detach + poda bloque + scripts" };
536
562
  }
@@ -539,18 +565,17 @@ function Initialized({ ctx, data, isActive, onRunAction, onReload }) {
539
565
  });
540
566
  return (_jsxs(Box, { flexDirection: "column", children: [_jsx(PageHead, { title: `Workspace · ${shortName}`, action: _jsx(Text, { color: colors.faint, children: wsPath }) }), description ? (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.dim, wrap: "truncate-end", children: description }) })) : null, data.warnings.length > 0 ? (_jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsxs(Text, { color: colors.warn, wrap: "truncate-end", children: [icons.alertDot, " ", data.warnings.length, " advertencia", data.warnings.length > 1 ? "s" : "", " al cargar el workspace (datos parciales)"] }), data.warnings.slice(0, 3).map((w, i) => (_jsxs(Text, { color: colors.faint, wrap: "truncate-end", children: [" ", w] }, `${i}-${w.slice(0, 16)}`)))] })) : null, _jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsx(StatTile, { label: "git", value: data.git?.branch ?? "—", sub: statGitSub(data), accent: true }), _jsx(StatTile, { label: "working tree", value: `${dirty} dirty`, sub: `${data.git?.staged ?? 0} staged · ${data.git?.untracked ?? 0} untracked`, tone: dirty > 0 ? "warn" : "dim" }), _jsx(StatTile, { label: "sources", value: `${totalSources}`, sub: `${dirtySources} dirty`, tone: totalSources > 0 ? "accent" : "dim" }), _jsx(StatTile, { label: "working branches", value: `${workingEntries.length}`, sub: workingEntries.length > 0 ? "declared" : "none", tone: workingEntries.length > 0 ? "accent" : "dim" }), _jsx(StatTile, { label: "procesos", value: `${runningCount}`, sub: processes.length > runningCount
541
567
  ? `${processes.length - runningCount} inactivos`
542
- : "running", tone: runningCount > 0 ? "accent" : "dim" })] }), _jsxs(Box, { flexDirection: "row", children: [_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingRight: 2, children: [hasSources ? (_jsxs(_Fragment, { children: [_jsx(SectionHead, { label: "Sources", count: totalSources, marginTop: 0, ...(rangeHint ? { hint: rangeHint } : {}), rightAction: detailOpen ? "esc to close detail" : "↑↓ select · ⏎ actions" }), _jsx(Box, { marginLeft: SOURCES_ROWS_INDENT, flexDirection: "column", children: targets.slice(win.start, winEnd).map((target, offset) => {
543
- const i = win.start + offset;
544
- // The last target is the "all sources" sentinel, not a source.
545
- const source = target === ALL_SOURCES ? undefined : data.sources[i];
546
- return source ? (_jsx(SourceRow, { source: source, active: i === cursor, widthHint: rowWidth(stdout?.columns, detailOpen, SOURCES_ROWS_INDENT) }, source.alias)) : (_jsx(ListRow, { icon: icons.diamond, title: "all sources", subtitle: `aplica a las ${totalSources} fuentes`, chevron: true, active: i === cursor, widthHint: rowWidth(stdout?.columns, detailOpen, SOURCES_ROWS_INDENT) }, ALL_SOURCES));
547
- }) })] })) : null, _jsx(BranchList, { label: "Ramas de trabajo actuales", entries: workingEntries, emptyHint: "(no working branches declared)" }), qaEntries.length > 0 ? (_jsx(BranchList, { label: "Ramas QA actuales", entries: qaEntries })) : null, _jsx(ProcessList, { processes: processes, cursor: processCursor, focused: mode.kind === "process", widthHint: rowWidth(stdout?.columns, detailOpen, SOURCES_ROWS_INDENT) })] }), detailOpen ? (_jsx(SourceActionsPanel, { isAll: isAllTarget, name: isAllTarget ? "all sources" : currentTarget, source: currentSource, totalSources: totalSources, actions: detailActions, focusedAction: actionCursor })) : null] }), _jsx(Box, { marginTop: 1, children: _jsx(QuickActions, { actions: [
568
+ : "running", tone: runningCount > 0 ? "accent" : "dim" })] }), _jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, paddingRight: 2, children: hasSources ? (_jsxs(_Fragment, { children: [_jsx(SectionHead, { label: "Sources", count: totalSources, marginTop: 0, ...(rangeHint ? { hint: rangeHint } : {}), rightAction: detailOpen ? "esc to close detail" : "↑↓ select · ⏎ actions" }), _jsx(Box, { marginLeft: SOURCES_ROWS_INDENT, flexDirection: "column", children: targets.slice(win.start, winEnd).map((target, offset) => {
569
+ const i = win.start + offset;
570
+ // The last target is the "all sources" sentinel, not a source.
571
+ const source = target === ALL_SOURCES ? undefined : data.sources[i];
572
+ return source ? (_jsx(SourceRow, { source: source, running: runningBySource.get(source.alias) ?? 0, active: i === cursor, widthHint: rowWidth(stdout?.columns, detailOpen, SOURCES_ROWS_INDENT) }, source.alias)) : (_jsx(ListRow, { icon: icons.diamond, title: "all sources", subtitle: `aplica a las ${totalSources} fuentes`, chevron: true, active: i === cursor, widthHint: rowWidth(stdout?.columns, detailOpen, SOURCES_ROWS_INDENT) }, ALL_SOURCES));
573
+ }) })] })) : null }), detailOpen ? (_jsx(SourceActionsPanel, { isAll: isAllTarget, name: isAllTarget ? "all sources" : currentTarget, source: currentSource, totalSources: totalSources, actions: detailActions, focusedAction: actionCursor })) : null] }), _jsx(Box, { marginTop: 1, children: _jsx(QuickActions, { actions: [
548
574
  { key: "⏎", label: "source actions" },
549
- ...(processes.length > 0 ? [{ key: "p", label: "manage processes" }] : []),
550
575
  { key: "g", label: "git status" },
551
576
  ] }) })] }));
552
577
  }
553
- function SourceRow({ source, active, widthHint, }) {
578
+ function SourceRow({ source, running, active, widthHint, }) {
554
579
  const status = source.dirty ? `${source.changedFiles} dirty` : "in sync";
555
580
  const branch = source.branch ?? source.mainBranch;
556
581
  // Commits carried by the branch itself; "—" when it cannot be measured (on
@@ -559,11 +584,10 @@ function SourceRow({ source, active, widthHint, }) {
559
584
  const commits = source.commitCount === null
560
585
  ? { label: "—", tone: "dim" }
561
586
  : { label: `+${source.commitCount}`, tone: "accent" };
562
- return (_jsx(ListRow, { icon: icons.diamond, iconActive: true, title: source.alias, subtitle: `main ${source.mainBranch}`, meta: [commits, { label: status, tone: source.dirty ? "warn" : "ok" }], state: { label: `${icons.branch} ${branch}`, tone: "dim" }, chevron: true, active: active, widthHint: widthHint }));
563
- }
564
- /** "Ramas …" section one `◆ alias ↳ branch` row per WORKSPACE block entry. */
565
- function BranchList({ label, entries, emptyHint, }) {
566
- return (_jsxs(_Fragment, { children: [_jsx(SectionHead, { label: label, count: entries.length, marginTop: 1 }), _jsx(Box, { marginLeft: 2, flexDirection: "column", children: entries.length > 0 ? (entries.map(([alias, branch]) => (_jsxs(Box, { children: [_jsxs(Text, { color: colors.accent, children: [icons.diamond, " "] }), _jsx(Text, { color: colors.bright, bold: true, children: alias }), _jsx(Box, { flexGrow: 1 }), _jsxs(Text, { color: colors.dim, children: [icons.branch, " ", branch] })] }, alias)))) : emptyHint ? (_jsx(Text, { color: colors.faint, children: emptyHint })) : null })] }));
587
+ // Live activity, after the git chips: the dot is textual (never color alone)
588
+ // and the count is the source's own `running` total (SPEC 019).
589
+ const activity = running > 0 ? [{ label: `● ${running} running`, tone: "ok" }] : [];
590
+ return (_jsx(ListRow, { icon: icons.diamond, iconActive: true, title: source.alias, subtitle: `main ${source.mainBranch}`, meta: [commits, { label: status, tone: source.dirty ? "warn" : "ok" }, ...activity], state: { label: `${icons.branch} ${branch}`, tone: "dim" }, chevron: true, active: active, widthHint: widthHint }));
567
591
  }
568
592
  /** Side panel of git-flow actions for the selected source (or "all sources"). */
569
593
  function SourceActionsPanel({ isAll, name, source, totalSources, actions, focusedAction, }) {