@entelligentsia/forgecli 0.6.6 → 0.7.6

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 (183) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +28 -1
  3. package/dist/bin/forge.js +20 -0
  4. package/dist/bin/forge.js.map +1 -1
  5. package/dist/extensions/forgecli/approve.d.ts +24 -0
  6. package/dist/extensions/forgecli/approve.js +202 -0
  7. package/dist/extensions/forgecli/approve.js.map +1 -0
  8. package/dist/extensions/forgecli/audience-gate.d.ts +4 -0
  9. package/dist/extensions/forgecli/audience-gate.js +8 -5
  10. package/dist/extensions/forgecli/audience-gate.js.map +1 -1
  11. package/dist/extensions/forgecli/collate.d.ts +24 -0
  12. package/dist/extensions/forgecli/collate.js +199 -0
  13. package/dist/extensions/forgecli/collate.js.map +1 -0
  14. package/dist/extensions/forgecli/commit.d.ts +24 -0
  15. package/dist/extensions/forgecli/commit.js +202 -0
  16. package/dist/extensions/forgecli/commit.js.map +1 -0
  17. package/dist/extensions/forgecli/fix-bug.d.ts +75 -0
  18. package/dist/extensions/forgecli/fix-bug.js +1133 -0
  19. package/dist/extensions/forgecli/fix-bug.js.map +1 -0
  20. package/dist/extensions/forgecli/forge-commands.js +7 -0
  21. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  22. package/dist/extensions/forgecli/forge-init.js +16 -8
  23. package/dist/extensions/forgecli/forge-init.js.map +1 -1
  24. package/dist/extensions/forgecli/forge-subagent.d.ts +29 -0
  25. package/dist/extensions/forgecli/forge-subagent.js +14 -1
  26. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  27. package/dist/extensions/forgecli/hook-dispatcher.d.ts +53 -1
  28. package/dist/extensions/forgecli/hook-dispatcher.js +47 -1
  29. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  30. package/dist/extensions/forgecli/hooks/post-init-hook.d.ts +15 -0
  31. package/dist/extensions/forgecli/hooks/post-init-hook.js +127 -0
  32. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -0
  33. package/dist/extensions/forgecli/hooks/post-sprint-hook.d.ts +37 -0
  34. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +166 -0
  35. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -0
  36. package/dist/extensions/forgecli/index.js +47 -0
  37. package/dist/extensions/forgecli/index.js.map +1 -1
  38. package/dist/extensions/forgecli/review-code.d.ts +24 -0
  39. package/dist/extensions/forgecli/review-code.js +202 -0
  40. package/dist/extensions/forgecli/review-code.js.map +1 -0
  41. package/dist/extensions/forgecli/review-plan.d.ts +24 -0
  42. package/dist/extensions/forgecli/review-plan.js +203 -0
  43. package/dist/extensions/forgecli/review-plan.js.map +1 -0
  44. package/dist/extensions/forgecli/run-sprint.d.ts +18 -0
  45. package/dist/extensions/forgecli/run-sprint.js +33 -1
  46. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  47. package/dist/extensions/forgecli/run-task.d.ts +21 -2
  48. package/dist/extensions/forgecli/run-task.js +33 -9
  49. package/dist/extensions/forgecli/run-task.js.map +1 -1
  50. package/dist/extensions/forgecli/session-registry.d.ts +10 -0
  51. package/dist/extensions/forgecli/session-registry.js +9 -0
  52. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  53. package/dist/extensions/forgecli/validate.d.ts +24 -0
  54. package/dist/extensions/forgecli/validate.js +202 -0
  55. package/dist/extensions/forgecli/validate.js.map +1 -0
  56. package/dist/extensions/forgecli/wf-engine/engine.d.ts +23 -0
  57. package/dist/extensions/forgecli/wf-engine/engine.js +384 -0
  58. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -0
  59. package/dist/extensions/forgecli/wf-engine/event-parser.d.ts +6 -0
  60. package/dist/extensions/forgecli/wf-engine/event-parser.js +29 -0
  61. package/dist/extensions/forgecli/wf-engine/event-parser.js.map +1 -0
  62. package/dist/extensions/forgecli/wf-engine/id-gen.d.ts +6 -0
  63. package/dist/extensions/forgecli/wf-engine/id-gen.js +17 -0
  64. package/dist/extensions/forgecli/wf-engine/id-gen.js.map +1 -0
  65. package/dist/extensions/forgecli/wf-engine/loader.d.ts +2 -0
  66. package/dist/extensions/forgecli/wf-engine/loader.js +100 -0
  67. package/dist/extensions/forgecli/wf-engine/loader.js.map +1 -0
  68. package/dist/extensions/forgecli/wf-engine/predicate.d.ts +7 -0
  69. package/dist/extensions/forgecli/wf-engine/predicate.js +36 -0
  70. package/dist/extensions/forgecli/wf-engine/predicate.js.map +1 -0
  71. package/dist/extensions/forgecli/wf-engine/prompt-compiler.d.ts +15 -0
  72. package/dist/extensions/forgecli/wf-engine/prompt-compiler.js +23 -0
  73. package/dist/extensions/forgecli/wf-engine/prompt-compiler.js.map +1 -0
  74. package/dist/extensions/forgecli/wf-engine/register.d.ts +9 -0
  75. package/dist/extensions/forgecli/wf-engine/register.js +59 -0
  76. package/dist/extensions/forgecli/wf-engine/register.js.map +1 -0
  77. package/dist/extensions/forgecli/wf-engine/remit-check.d.ts +6 -0
  78. package/dist/extensions/forgecli/wf-engine/remit-check.js +42 -0
  79. package/dist/extensions/forgecli/wf-engine/remit-check.js.map +1 -0
  80. package/dist/extensions/forgecli/wf-engine/state-store.d.ts +13 -0
  81. package/dist/extensions/forgecli/wf-engine/state-store.js +43 -0
  82. package/dist/extensions/forgecli/wf-engine/state-store.js.map +1 -0
  83. package/dist/extensions/forgecli/wf-engine/types.d.ts +66 -0
  84. package/dist/extensions/forgecli/wf-engine/types.js +2 -0
  85. package/dist/extensions/forgecli/wf-engine/types.js.map +1 -0
  86. package/dist/extensions/forgecli/wf-engine/worker.d.ts +11 -0
  87. package/dist/extensions/forgecli/wf-engine/worker.js +50 -0
  88. package/dist/extensions/forgecli/wf-engine/worker.js.map +1 -0
  89. package/dist/forge-payload/.base-pack/workflows/_fragments/context-injection.md +10 -4
  90. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +12 -0
  91. package/dist/forge-payload/.schemas/bug.schema.json +4 -2
  92. package/dist/forge-payload/.schemas/event.schema.json +22 -3
  93. package/dist/forge-payload/commands/add-pipeline.md +342 -0
  94. package/dist/forge-payload/commands/add-task.md +269 -0
  95. package/dist/forge-payload/commands/ask.md +43 -0
  96. package/dist/forge-payload/commands/calibrate.md +356 -0
  97. package/dist/forge-payload/commands/config.md +202 -0
  98. package/dist/forge-payload/commands/enhance.md +38 -0
  99. package/dist/forge-payload/commands/health.md +225 -0
  100. package/dist/forge-payload/commands/init.md +165 -0
  101. package/dist/forge-payload/commands/materialize.md +119 -0
  102. package/dist/forge-payload/commands/migrate.md +160 -0
  103. package/dist/forge-payload/commands/quiz-agent.md +38 -0
  104. package/dist/forge-payload/commands/regenerate.md +673 -0
  105. package/dist/forge-payload/commands/remove.md +174 -0
  106. package/dist/forge-payload/commands/report-bug.md +191 -0
  107. package/dist/forge-payload/commands/store-query.md +73 -0
  108. package/dist/forge-payload/commands/store-repair.md +187 -0
  109. package/dist/forge-payload/commands/update-tools.md +56 -0
  110. package/dist/forge-payload/commands/update.md +1376 -0
  111. package/dist/forge-payload/tools/preflight-gate.cjs +2 -1
  112. package/dist/forge-payload/tools/read-verdict.cjs +41 -8
  113. package/dist/forge-payload/tools/store-cli.cjs +4 -3
  114. package/node_modules/argparse/CHANGELOG.md +216 -0
  115. package/node_modules/argparse/LICENSE +254 -0
  116. package/node_modules/argparse/README.md +84 -0
  117. package/node_modules/argparse/argparse.js +3707 -0
  118. package/node_modules/argparse/lib/sub.js +67 -0
  119. package/node_modules/argparse/lib/textwrap.js +440 -0
  120. package/node_modules/argparse/package.json +31 -0
  121. package/node_modules/cliui/CHANGELOG.md +121 -0
  122. package/node_modules/color-convert/CHANGELOG.md +54 -0
  123. package/node_modules/esprima/ChangeLog +235 -0
  124. package/node_modules/js-yaml/LICENSE +21 -0
  125. package/node_modules/js-yaml/README.md +247 -0
  126. package/node_modules/js-yaml/bin/js-yaml.js +126 -0
  127. package/node_modules/js-yaml/dist/js-yaml.js +3880 -0
  128. package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
  129. package/node_modules/js-yaml/dist/js-yaml.mjs +3856 -0
  130. package/node_modules/js-yaml/index.js +47 -0
  131. package/node_modules/js-yaml/lib/common.js +59 -0
  132. package/node_modules/js-yaml/lib/dumper.js +965 -0
  133. package/node_modules/js-yaml/lib/exception.js +55 -0
  134. package/node_modules/js-yaml/lib/loader.js +1733 -0
  135. package/node_modules/js-yaml/lib/schema/core.js +11 -0
  136. package/node_modules/js-yaml/lib/schema/default.js +22 -0
  137. package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
  138. package/node_modules/js-yaml/lib/schema/json.js +19 -0
  139. package/node_modules/js-yaml/lib/schema.js +121 -0
  140. package/node_modules/js-yaml/lib/snippet.js +101 -0
  141. package/node_modules/js-yaml/lib/type/binary.js +125 -0
  142. package/node_modules/js-yaml/lib/type/bool.js +35 -0
  143. package/node_modules/js-yaml/lib/type/float.js +97 -0
  144. package/node_modules/js-yaml/lib/type/int.js +156 -0
  145. package/node_modules/js-yaml/lib/type/map.js +8 -0
  146. package/node_modules/js-yaml/lib/type/merge.js +12 -0
  147. package/node_modules/js-yaml/lib/type/null.js +35 -0
  148. package/node_modules/js-yaml/lib/type/omap.js +44 -0
  149. package/node_modules/js-yaml/lib/type/pairs.js +53 -0
  150. package/node_modules/js-yaml/lib/type/seq.js +8 -0
  151. package/node_modules/js-yaml/lib/type/set.js +29 -0
  152. package/node_modules/js-yaml/lib/type/str.js +8 -0
  153. package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
  154. package/node_modules/js-yaml/lib/type.js +66 -0
  155. package/node_modules/js-yaml/package.json +66 -0
  156. package/node_modules/mz/HISTORY.md +66 -0
  157. package/node_modules/proper-lockfile/CHANGELOG.md +108 -0
  158. package/node_modules/source-map/CHANGELOG.md +301 -0
  159. package/node_modules/thenify/History.md +11 -0
  160. package/node_modules/thenify-all/History.md +11 -0
  161. package/node_modules/y18n/CHANGELOG.md +100 -0
  162. package/node_modules/yargs/CHANGELOG.md +88 -0
  163. package/node_modules/yargs-parser/CHANGELOG.md +263 -0
  164. package/package.json +6 -2
  165. package/workflows/lead-qualifier/prompts/digest.md +44 -0
  166. package/workflows/lead-qualifier/prompts/draft-outreach.md +44 -0
  167. package/workflows/lead-qualifier/prompts/enrich.md +52 -0
  168. package/workflows/lead-qualifier/prompts/intake.md +48 -0
  169. package/workflows/lead-qualifier/prompts/mark-cold.md +38 -0
  170. package/workflows/lead-qualifier/prompts/score.md +45 -0
  171. package/workflows/lead-qualifier/workflow.yaml +95 -0
  172. package/workflows/research-brief/prompts/brief-synthesize.md +43 -0
  173. package/workflows/research-brief/prompts/intake.md +51 -0
  174. package/workflows/research-brief/prompts/source-critique.md +38 -0
  175. package/workflows/research-brief/prompts/source-score.md +38 -0
  176. package/workflows/research-brief/prompts/source-summarize.md +54 -0
  177. package/workflows/research-brief/workflow.yaml +66 -0
  178. package/dist/extensions/forgecli/session-monitor-widget.d.ts +0 -37
  179. package/dist/extensions/forgecli/session-monitor-widget.js +0 -320
  180. package/dist/extensions/forgecli/session-monitor-widget.js.map +0 -1
  181. package/dist/extensions/forgecli/session-monitor.d.ts +0 -2
  182. package/dist/extensions/forgecli/session-monitor.js +0 -135
  183. package/dist/extensions/forgecli/session-monitor.js.map +0 -1
@@ -0,0 +1,43 @@
1
+ # Role
2
+ You are the `brief-synthesize` node — produce the final research brief.
3
+
4
+ # Inputs
5
+ - Original question: state.entryPrompt
6
+ - Full state JSON:
7
+ {{state}}
8
+
9
+ # Your remit
10
+ Read every source's summary (artifacts/sources/*.summary.md), its score, and its critique.
11
+ Produce `artifacts/BRIEF.md` — a single document with:
12
+
13
+ - TL;DR (3–5 sentences)
14
+ - Findings (grouped, with inline source citations using the source ids)
15
+ - Open questions (from the critiques)
16
+ - Sources table (id, title, kind, score)
17
+
18
+ # Output protocol (MANDATORY)
19
+
20
+ ```json events
21
+ [
22
+ { "type": "started" },
23
+ {
24
+ "type": "success",
25
+ "summary": "Brief written",
26
+ "writes": {
27
+ "artifact": {
28
+ "path": "artifacts/BRIEF.md",
29
+ "content": "# Research Brief\n\n## TL;DR\n...\n\n## Findings\n...\n\n## Open Questions\n...\n\n## Sources\n| id | title | kind | score |\n|---|---|---|---|\n..."
30
+ }
31
+ }
32
+ }
33
+ ]
34
+ ```
35
+
36
+ On failure:
37
+
38
+ ```json events
39
+ [
40
+ { "type": "started" },
41
+ { "type": "failure", "reason": "cannot-synthesize", "details": "<why>" }
42
+ ]
43
+ ```
@@ -0,0 +1,51 @@
1
+ # Role
2
+ You are the `intake` node of the `research-brief` workflow.
3
+
4
+ # Inputs
5
+ - Workflow instance: {{wf.instanceId}}
6
+ - Working directory: {{wf.workingDir}}
7
+ - Your node exec id: {{node.execId}}
8
+ - Current state JSON:
9
+ {{state}}
10
+
11
+ # Your remit
12
+ Read `state.entryPrompt` (the user's research question). Identify 2 to 4 plausible
13
+ information sources that would help answer it. For each source, produce:
14
+ - `id`: a short kebab-case identifier (e.g. "rfc-9001", "nist-pqc-report")
15
+ - `url`: a real or representative URL
16
+ - `title`: human-readable title
17
+ - `kind`: one of "spec" / "paper" / "report" / "blog" / "doc"
18
+
19
+ # Output protocol (MANDATORY)
20
+ End your reply with a fenced ```json events block. The engine parses ONLY this block.
21
+ Exactly two events: `started`, then `success` (or `failure` if the prompt is unintelligible).
22
+
23
+ Example success:
24
+
25
+ ```json events
26
+ [
27
+ { "type": "started" },
28
+ {
29
+ "type": "success",
30
+ "summary": "Identified 3 sources for post-quantum crypto adoption",
31
+ "writes": {
32
+ "state": {
33
+ "sources": [
34
+ { "id": "nist-pqc", "url": "https://csrc.nist.gov/projects/post-quantum-cryptography", "title": "NIST PQC Project", "kind": "report" },
35
+ { "id": "rfc-9180", "url": "https://www.rfc-editor.org/rfc/rfc9180", "title": "RFC 9180 (HPKE)", "kind": "spec" },
36
+ { "id": "cloudflare-pq", "url": "https://blog.cloudflare.com/pq-2024/", "title": "Cloudflare PQ rollout 2024", "kind": "blog" }
37
+ ]
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ ```
43
+
44
+ Example failure:
45
+
46
+ ```json events
47
+ [
48
+ { "type": "started" },
49
+ { "type": "failure", "reason": "unintelligible-prompt", "details": "entryPrompt was empty or not parseable as a research question" }
50
+ ]
51
+ ```
@@ -0,0 +1,38 @@
1
+ # Role
2
+ You are the `source-critique` node — identify gaps, biases, or follow-up questions for one source.
3
+
4
+ # Inputs
5
+ - Source (loop item):
6
+ {{loop.item}}
7
+
8
+ # Your remit
9
+ Produce a short critique (1–3 bullets) and 1–2 follow-up questions.
10
+
11
+ # Output protocol (MANDATORY)
12
+
13
+ ```json events
14
+ [
15
+ { "type": "started" },
16
+ {
17
+ "type": "success",
18
+ "summary": "Critiqued {{loop.item.id}}",
19
+ "writes": {
20
+ "state": {
21
+ "sources.{{loop.item.id}}.critique": {
22
+ "concerns": ["..."],
23
+ "followUps": ["..."]
24
+ }
25
+ }
26
+ }
27
+ }
28
+ ]
29
+ ```
30
+
31
+ On failure:
32
+
33
+ ```json events
34
+ [
35
+ { "type": "started" },
36
+ { "type": "failure", "reason": "cannot-critique", "details": "<why>" }
37
+ ]
38
+ ```
@@ -0,0 +1,38 @@
1
+ # Role
2
+ You are the `source-score` node — assign quality scores to one source.
3
+
4
+ # Inputs
5
+ - Source (loop item):
6
+ {{loop.item}}
7
+
8
+ # Your remit
9
+ Score the source on three axes, each 1–5:
10
+ - `relevance`: how directly relevant to the research question (state.entryPrompt)
11
+ - `recency`: how recent / current the source is
12
+ - `authority`: how authoritative the source is
13
+
14
+ # Output protocol (MANDATORY)
15
+
16
+ ```json events
17
+ [
18
+ { "type": "started" },
19
+ {
20
+ "type": "success",
21
+ "summary": "Scored {{loop.item.id}}",
22
+ "writes": {
23
+ "state": {
24
+ "sources.{{loop.item.id}}.score": { "relevance": 5, "recency": 4, "authority": 5 }
25
+ }
26
+ }
27
+ }
28
+ ]
29
+ ```
30
+
31
+ On failure:
32
+
33
+ ```json events
34
+ [
35
+ { "type": "started" },
36
+ { "type": "failure", "reason": "cannot-score", "details": "<why>" }
37
+ ]
38
+ ```
@@ -0,0 +1,54 @@
1
+ # Role
2
+ You are the `source-summarize` node of the `research-brief` workflow, executing for one source.
3
+
4
+ # Inputs
5
+ - Workflow instance: {{wf.instanceId}}
6
+ - Your node exec id: {{node.execId}}
7
+ - Current source (loop item):
8
+ {{loop.item}}
9
+
10
+ # Your remit
11
+ Produce a structured summary of the source identified by `loop.item.url` / `loop.item.title`.
12
+ You do not need to actually fetch the URL — write a plausible summary based on the title
13
+ and what such a source typically contains. The summary should include:
14
+
15
+ - thesis: ≤200 chars
16
+ - key-claims: 3–7 bullet points
17
+ - methodology: 1–3 sentences
18
+ - limitations: 1–3 sentences
19
+
20
+ # Output protocol (MANDATORY)
21
+ End your reply with a fenced ```json events block. Exactly two events: `started`, then
22
+ `success` carrying both the artifact (the full markdown summary) and a state write.
23
+
24
+ The artifact path MUST be exactly `artifacts/sources/{{loop.item.id}}.summary.md`.
25
+
26
+ Example:
27
+
28
+ ```json events
29
+ [
30
+ { "type": "started" },
31
+ {
32
+ "type": "success",
33
+ "summary": "Summarized {{loop.item.id}}",
34
+ "writes": {
35
+ "artifact": {
36
+ "path": "artifacts/sources/{{loop.item.id}}.summary.md",
37
+ "content": "# Summary: <title>\n\n## Thesis\n...\n\n## Key Claims\n- ...\n\n## Methodology\n...\n\n## Limitations\n...\n"
38
+ },
39
+ "state": {
40
+ "sources.{{loop.item.id}}.summarized": true
41
+ }
42
+ }
43
+ }
44
+ ]
45
+ ```
46
+
47
+ If you cannot summarize (e.g. source kind is unknown):
48
+
49
+ ```json events
50
+ [
51
+ { "type": "started" },
52
+ { "type": "failure", "reason": "cannot-summarize", "details": "<why>" }
53
+ ]
54
+ ```
@@ -0,0 +1,66 @@
1
+ id: research-brief
2
+ version: 1
3
+ description: Multi-source research brief synthesis — 5-node PoC with 3 loop-body nodes.
4
+
5
+ nodes:
6
+ - id: intake
7
+ prompt: prompts/intake.md
8
+ expects:
9
+ success:
10
+ writes:
11
+ state: [sources]
12
+ failure: {}
13
+
14
+ - id: source-summarize
15
+ prompt: prompts/source-summarize.md
16
+ loop:
17
+ over: sources
18
+ alias: loop.item
19
+ expects:
20
+ success:
21
+ writes:
22
+ artifact: { pattern: "artifacts/sources/{loop.item.id}.summary.md" }
23
+ state: ["sources.{loop.item.id}.summarized"]
24
+ failure: {}
25
+
26
+ - id: source-score
27
+ prompt: prompts/source-score.md
28
+ loop:
29
+ over: sources
30
+ alias: loop.item
31
+ expects:
32
+ success:
33
+ writes:
34
+ state: ["sources.{loop.item.id}.score"]
35
+ failure: {}
36
+
37
+ - id: source-critique
38
+ prompt: prompts/source-critique.md
39
+ loop:
40
+ over: sources
41
+ alias: loop.item
42
+ expects:
43
+ success:
44
+ writes:
45
+ state: ["sources.{loop.item.id}.critique"]
46
+ failure: {}
47
+
48
+ - id: brief-synthesize
49
+ prompt: prompts/brief-synthesize.md
50
+ expects:
51
+ success:
52
+ writes:
53
+ artifact: { pattern: "artifacts/BRIEF.md" }
54
+ failure: {}
55
+
56
+ edges:
57
+ - { from: intake, on: success, to: source-summarize }
58
+ - { from: intake, on: failure, halt: intake-failed }
59
+ - { from: source-summarize, on: success, advance: loop-or-next, next: source-score }
60
+ - { from: source-summarize, on: failure, halt: source-summarize-failed }
61
+ - { from: source-score, on: success, advance: loop-or-next, next: source-critique }
62
+ - { from: source-score, on: failure, halt: source-score-failed }
63
+ - { from: source-critique, on: success, advance: loop-or-next, next: brief-synthesize }
64
+ - { from: source-critique, on: failure, halt: source-critique-failed }
65
+ - { from: brief-synthesize, on: success, terminal: complete }
66
+ - { from: brief-synthesize, on: failure, halt: brief-failed }
@@ -1,37 +0,0 @@
1
- import type { Component } from "@entelligentsia/pi-tui";
2
- import type { Theme } from "@entelligentsia/pi-coding-agent";
3
- interface WidgetDeps {
4
- theme: Theme;
5
- requestRender: () => void;
6
- onClose: () => void;
7
- /** Called once after the widget instance is constructed. The session-monitor
8
- * controller uses this to capture a reference for onTerminalInput routing. */
9
- onMount?: (widget: SessionMonitorWidget) => void;
10
- }
11
- /**
12
- * Build the widget factory expected by ctx.ui.setWidget.
13
- * The factory captures dependencies (theme, render hook, close hook) and
14
- * returns a fresh Component on each setWidget() call.
15
- */
16
- export declare function buildSessionMonitorWidget(deps: Omit<WidgetDeps, "theme">): (tui: unknown, theme: Theme) => Component & {
17
- dispose?(): void;
18
- };
19
- export declare class SessionMonitorWidget implements Component {
20
- private registry;
21
- private listener;
22
- private focusedPane;
23
- private selectedTaskId?;
24
- private selectedEventIndex;
25
- private sessionsList;
26
- private eventsList;
27
- private deps;
28
- private disposed;
29
- constructor(deps: WidgetDeps);
30
- dispose(): void;
31
- invalidate(): void;
32
- handleInput(data: string): void;
33
- render(width: number): string[];
34
- private refreshSessions;
35
- private rebuildEvents;
36
- }
37
- export {};
@@ -1,320 +0,0 @@
1
- // session-monitor-widget.ts — embedded TUI for live subagent sessions.
2
- //
3
- // Renders below the input swimline via ctx.ui.setWidget(..., { placement: "belowEditor" }).
4
- // Two-pane layout: sessions list (left) and events list (right), with a details
5
- // footer for the highlighted event. Arrow keys navigate within the focused pane;
6
- // Tab / →/← switch focus between panes; Esc closes.
7
- //
8
- // Subscribes to the shared SessionRegistry — every run-task subagent event causes
9
- // a re-render request.
10
- import { SelectList } from "@entelligentsia/pi-tui";
11
- import { getSessionRegistry, } from "./session-registry.js";
12
- const MAX_VISIBLE_ROWS = 10;
13
- const DETAIL_LINES = 8;
14
- /**
15
- * Build the widget factory expected by ctx.ui.setWidget.
16
- * The factory captures dependencies (theme, render hook, close hook) and
17
- * returns a fresh Component on each setWidget() call.
18
- */
19
- export function buildSessionMonitorWidget(deps) {
20
- return (_tui, theme) => {
21
- const w = new SessionMonitorWidget({
22
- theme,
23
- requestRender: deps.requestRender,
24
- onClose: deps.onClose,
25
- });
26
- deps.onMount?.(w);
27
- return w;
28
- };
29
- }
30
- export class SessionMonitorWidget {
31
- registry;
32
- listener;
33
- focusedPane = "sessions";
34
- selectedTaskId;
35
- selectedEventIndex = 0;
36
- sessionsList;
37
- eventsList;
38
- deps;
39
- disposed = false;
40
- constructor(deps) {
41
- this.deps = deps;
42
- this.registry = getSessionRegistry();
43
- const selectTheme = buildSelectListTheme(deps.theme);
44
- this.sessionsList = new SelectList([], MAX_VISIBLE_ROWS, selectTheme);
45
- this.eventsList = new SelectList([], MAX_VISIBLE_ROWS, selectTheme);
46
- this.sessionsList.onSelectionChange = (item) => {
47
- this.selectedTaskId = item.value;
48
- this.selectedEventIndex = 0;
49
- this.rebuildEvents();
50
- this.deps.requestRender();
51
- };
52
- this.eventsList.onSelectionChange = (item) => {
53
- const idx = Number.parseInt(item.value, 10);
54
- if (!Number.isNaN(idx)) {
55
- this.selectedEventIndex = idx;
56
- this.deps.requestRender();
57
- }
58
- };
59
- this.refreshSessions();
60
- this.listener = (_taskId) => {
61
- if (this.disposed)
62
- return;
63
- this.refreshSessions();
64
- if (this.focusedPane === "events" || this.selectedTaskId)
65
- this.rebuildEvents();
66
- this.deps.requestRender();
67
- };
68
- this.registry.on("change", this.listener);
69
- }
70
- dispose() {
71
- this.disposed = true;
72
- this.registry.off("change", this.listener);
73
- }
74
- invalidate() {
75
- this.sessionsList.invalidate();
76
- this.eventsList.invalidate();
77
- }
78
- handleInput(data) {
79
- // Tab or → → focus events pane; ← → focus sessions pane.
80
- // Esc closes the widget.
81
- // Anything else is delegated to the focused pane.
82
- if (data === "") {
83
- this.deps.onClose();
84
- return;
85
- }
86
- if (data === "\t" || data === "" /* right arrow */) {
87
- if (this.focusedPane === "sessions") {
88
- this.focusedPane = "events";
89
- this.deps.requestRender();
90
- return;
91
- }
92
- }
93
- if (data === "" /* left arrow */) {
94
- if (this.focusedPane === "events") {
95
- this.focusedPane = "sessions";
96
- this.deps.requestRender();
97
- return;
98
- }
99
- }
100
- if (this.focusedPane === "sessions")
101
- this.sessionsList.handleInput(data);
102
- else
103
- this.eventsList.handleInput(data);
104
- }
105
- render(width) {
106
- const theme = this.deps.theme;
107
- const sessions = this.registry.listSessions();
108
- // Layout: left pane = 40 cols (or 40% if narrow), right pane = remainder.
109
- const leftWidth = Math.max(28, Math.min(44, Math.floor(width * 0.4)));
110
- const rightWidth = Math.max(20, width - leftWidth - 3); // 3 cols for gutter "│ "
111
- const header = theme.bold(theme.fg("accent", "Forge Sessions ") +
112
- theme.fg("muted", `(${sessions.length}) `) +
113
- theme.fg("muted", "[↑↓ nav Tab/→ pane Esc close]"));
114
- const sessionLines = sessions.length === 0
115
- ? [theme.fg("muted", " (no live subagent sessions yet)")]
116
- : this.sessionsList.render(leftWidth);
117
- const focusedSession = this.selectedTaskId
118
- ? this.registry.getSession(this.selectedTaskId)
119
- : undefined;
120
- const rightHeaderText = focusedSession
121
- ? `Events: ${focusedSession.taskId} (${focusedSession.events.length})`
122
- : "Events";
123
- const rightHeader = theme.bold(theme.fg("accent", rightHeaderText));
124
- const eventLines = focusedSession
125
- ? this.eventsList.render(rightWidth)
126
- : [theme.fg("muted", " (select a session on the left)")];
127
- const sessionsPaneTitle = this.focusedPane === "sessions" ? theme.inverse(" sessions ") : theme.fg("muted", " sessions ");
128
- const eventsPaneTitle = this.focusedPane === "events" ? theme.inverse(" events ") : theme.fg("muted", " events ");
129
- const leftPane = [sessionsPaneTitle, ...sessionLines];
130
- const rightPane = [eventsPaneTitle, rightHeader, ...eventLines];
131
- const stitched = stitchPanes(leftPane, rightPane, leftWidth, rightWidth, theme);
132
- const detailLines = renderDetails(focusedSession, this.selectedEventIndex, width, theme);
133
- return [header, "", ...stitched, "", ...detailLines];
134
- }
135
- refreshSessions() {
136
- const sessions = this.registry.listSessions();
137
- const items = sessions.map((s) => ({
138
- value: s.taskId,
139
- label: formatSessionLabel(s),
140
- description: formatSessionDescription(s),
141
- }));
142
- this.sessionsList.invalidate();
143
- // SelectList has no public setItems(); rebuild via constructor isn't ideal,
144
- // but mutating its private items[] would be even uglier. Easiest: replace
145
- // the instance. Keep the selected taskId stable across rebuilds.
146
- const prior = this.selectedTaskId;
147
- const selectedIndex = prior
148
- ? Math.max(0, items.findIndex((i) => i.value === prior))
149
- : 0;
150
- this.sessionsList = new SelectList(items, MAX_VISIBLE_ROWS, buildSelectListTheme(this.deps.theme));
151
- this.sessionsList.setSelectedIndex(selectedIndex);
152
- this.sessionsList.onSelectionChange = (item) => {
153
- this.selectedTaskId = item.value;
154
- this.selectedEventIndex = 0;
155
- this.rebuildEvents();
156
- this.deps.requestRender();
157
- };
158
- if (!this.selectedTaskId && items[0]) {
159
- this.selectedTaskId = items[0].value;
160
- this.rebuildEvents();
161
- }
162
- }
163
- rebuildEvents() {
164
- const s = this.selectedTaskId ? this.registry.getSession(this.selectedTaskId) : undefined;
165
- if (!s) {
166
- this.eventsList = new SelectList([], MAX_VISIBLE_ROWS, buildSelectListTheme(this.deps.theme));
167
- return;
168
- }
169
- // Pair tool_start + tool_end into a single line; show errors with a marker.
170
- const items = [];
171
- const startsByCallId = new Map();
172
- s.events.forEach((ev, idx) => {
173
- if (ev.kind === "tool_start") {
174
- startsByCallId.set(ev.toolCallId, ev);
175
- items.push({
176
- value: String(idx),
177
- label: formatEventLabel(ev, undefined, this.deps.theme),
178
- description: shortArgHint(ev.args),
179
- });
180
- }
181
- else {
182
- const start = startsByCallId.get(ev.toolCallId);
183
- if (start) {
184
- // Update the existing item's label with completion marker.
185
- const lastIdx = items.findIndex((i) => i.value === String(idx - 1));
186
- if (lastIdx >= 0) {
187
- items[lastIdx] = {
188
- ...items[lastIdx],
189
- label: formatEventLabel(start, ev, this.deps.theme),
190
- };
191
- }
192
- }
193
- else {
194
- items.push({
195
- value: String(idx),
196
- label: formatEventLabel(ev, ev, this.deps.theme),
197
- description: ev.isError ? "errored" : "ok",
198
- });
199
- }
200
- }
201
- });
202
- this.eventsList = new SelectList(items, MAX_VISIBLE_ROWS, buildSelectListTheme(this.deps.theme));
203
- const idx = Math.min(this.selectedEventIndex, Math.max(0, items.length - 1));
204
- this.eventsList.setSelectedIndex(idx);
205
- this.eventsList.onSelectionChange = (item) => {
206
- const i = Number.parseInt(item.value, 10);
207
- if (!Number.isNaN(i)) {
208
- this.selectedEventIndex = i;
209
- this.deps.requestRender();
210
- }
211
- };
212
- }
213
- }
214
- function formatSessionLabel(s) {
215
- const phase = s.currentPhaseRole ?? s.phases[s.phases.length - 1]?.role ?? "—";
216
- const marker = s.status === "running" ? "▶" : s.status === "failed" || s.status === "escalated" ? "✗" : "✓";
217
- return `${marker} ${s.taskId} ${phase}`;
218
- }
219
- function formatSessionDescription(s) {
220
- const p = s.phases[s.phases.length - 1];
221
- if (!p)
222
- return "";
223
- const errPart = p.errCount ? ` · err ${p.errCount}` : "";
224
- const elapsed = Math.floor(((p.endedAt ?? Date.now()) - p.startedAt) / 1000);
225
- return `t${p.turn} · tools ${p.toolCount}${errPart} · ${elapsed}s`;
226
- }
227
- function formatEventLabel(start, end, theme) {
228
- const ts = new Date(start.ts).toISOString().slice(11, 19);
229
- const hint = shortArgHint(start.args);
230
- const status = end ? (end.isError ? theme.fg("error", "✗") : theme.fg("success", "✓")) : "·";
231
- return `${ts} ${status} ${start.toolName}${hint ? ` ${hint}` : ""}`;
232
- }
233
- function shortArgHint(args) {
234
- if (!args || typeof args !== "object")
235
- return "";
236
- const a = args;
237
- const fp = (a.file_path ?? a.path);
238
- if (typeof fp === "string") {
239
- const base = fp.split("/").pop() ?? fp;
240
- return base.length > 28 ? `${base.slice(0, 28)}…` : base;
241
- }
242
- if (typeof a.command === "string") {
243
- const head = a.command.split(/\s+/).slice(0, 3).join(" ");
244
- return head.length > 36 ? `${head.slice(0, 36)}…` : head;
245
- }
246
- if (typeof a.pattern === "string")
247
- return a.pattern.slice(0, 36);
248
- if (typeof a.query === "string")
249
- return a.query.slice(0, 36);
250
- return "";
251
- }
252
- function renderDetails(session, eventIndex, width, theme) {
253
- if (!session)
254
- return [];
255
- const ev = session.events[eventIndex];
256
- if (!ev)
257
- return [theme.fg("muted", " (no event selected)")];
258
- const lines = [];
259
- lines.push(theme.bold(theme.fg("accent", `Details: ${ev.toolName}`)));
260
- if (ev.args !== undefined) {
261
- lines.push(theme.fg("muted", " args:"));
262
- lines.push(...indent(jsonLines(ev.args), 4));
263
- }
264
- if (ev.kind === "tool_end") {
265
- const label = ev.isError ? theme.fg("error", " result (errored):") : theme.fg("muted", " result:");
266
- lines.push(label);
267
- lines.push(...indent(jsonLines(ev.result), 4));
268
- }
269
- // Truncate to DETAIL_LINES so the widget doesn't grow unbounded.
270
- const truncated = lines.slice(0, DETAIL_LINES + 1);
271
- if (lines.length > DETAIL_LINES + 1) {
272
- truncated.push(theme.fg("muted", ` … (${lines.length - DETAIL_LINES - 1} more lines; see .forge/cache/run-task-debug-${session.taskId}.jsonl)`));
273
- }
274
- // Hard-wrap any line that exceeds width.
275
- return truncated.map((l) => (visibleLen(l) > width ? l.slice(0, Math.max(0, width - 1)) + "…" : l));
276
- }
277
- function jsonLines(value) {
278
- try {
279
- const s = typeof value === "string" ? value : JSON.stringify(value, null, 2);
280
- return s.split("\n");
281
- }
282
- catch {
283
- return [String(value)];
284
- }
285
- }
286
- function indent(lines, spaces) {
287
- const pad = " ".repeat(spaces);
288
- return lines.map((l) => pad + l);
289
- }
290
- function visibleLen(s) {
291
- // Strip ANSI escape sequences for a rough visible-width estimate.
292
- return s.replace(/\[[0-9;]*m/g, "").length;
293
- }
294
- function stitchPanes(left, right, leftWidth, rightWidth, theme) {
295
- const rows = Math.max(left.length, right.length);
296
- const gutter = theme.fg("borderMuted", " │ ");
297
- const out = [];
298
- for (let i = 0; i < rows; i++) {
299
- const l = padVisible(left[i] ?? "", leftWidth);
300
- const r = padVisible(right[i] ?? "", rightWidth);
301
- out.push(l + gutter + r);
302
- }
303
- return out;
304
- }
305
- function padVisible(s, width) {
306
- const len = visibleLen(s);
307
- if (len >= width)
308
- return s;
309
- return s + " ".repeat(width - len);
310
- }
311
- function buildSelectListTheme(theme) {
312
- return {
313
- selectedPrefix: (t) => theme.fg("accent", "▸") + " " + t,
314
- selectedText: (t) => theme.bold(theme.fg("accent", t)),
315
- description: (t) => theme.fg("muted", t),
316
- scrollInfo: (t) => theme.fg("muted", t),
317
- noMatch: (t) => theme.fg("muted", t),
318
- };
319
- }
320
- //# sourceMappingURL=session-monitor-widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-monitor-widget.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/session-monitor-widget.ts"],"names":[],"mappings":"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"}