@aragon-agent/cli 0.6.3 → 0.6.7

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 (138) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/README.md +203 -13
  3. package/dist/agent/controller.d.ts +158 -2
  4. package/dist/agent/controller.js +400 -1
  5. package/dist/agent/reducer.d.ts +102 -19
  6. package/dist/agent/reducer.js +162 -71
  7. package/dist/agent/system-prompt.d.ts +14 -0
  8. package/dist/agent/system-prompt.js +2 -0
  9. package/dist/agent/usage.d.ts +34 -0
  10. package/dist/agent/usage.js +43 -0
  11. package/dist/cli.js +132 -23
  12. package/dist/commands/builtins.js +101 -1
  13. package/dist/compaction/child.js +5 -0
  14. package/dist/compaction/command.js +14 -1
  15. package/dist/compaction/compactor.d.ts +94 -24
  16. package/dist/compaction/compactor.js +247 -98
  17. package/dist/compaction/context-command.d.ts +33 -0
  18. package/dist/compaction/context-command.js +166 -0
  19. package/dist/compaction/meter.d.ts +251 -0
  20. package/dist/compaction/meter.js +428 -0
  21. package/dist/compaction/pressure.d.ts +6 -0
  22. package/dist/compaction/pressure.js +4 -0
  23. package/dist/compaction/types.d.ts +77 -0
  24. package/dist/compaction/wiring.d.ts +56 -0
  25. package/dist/compaction/wiring.js +107 -25
  26. package/dist/config/cli-commands.js +5 -0
  27. package/dist/config/env.d.ts +1 -1
  28. package/dist/config/env.js +63 -2
  29. package/dist/config/load.d.ts +28 -0
  30. package/dist/config/load.js +83 -1
  31. package/dist/config/schema.d.ts +129 -0
  32. package/dist/config/schema.js +69 -0
  33. package/dist/config/store.js +47 -1
  34. package/dist/exec/events.d.ts +138 -1
  35. package/dist/exec/events.js +42 -0
  36. package/dist/exec/index.js +43 -6
  37. package/dist/exec/progress-reporter.d.ts +23 -0
  38. package/dist/exec/progress-reporter.js +88 -0
  39. package/dist/exec/runner.d.ts +34 -0
  40. package/dist/exec/runner.js +137 -25
  41. package/dist/fast/reviewer.d.ts +19 -1
  42. package/dist/fast/reviewer.js +22 -0
  43. package/dist/fast/types.d.ts +15 -0
  44. package/dist/fast/wiring.d.ts +10 -1
  45. package/dist/fast/wiring.js +18 -1
  46. package/dist/input/limits.d.ts +72 -0
  47. package/dist/input/limits.js +63 -0
  48. package/dist/input/paste-parse.d.ts +71 -0
  49. package/dist/input/paste-parse.js +95 -0
  50. package/dist/input/stdin-filter.d.ts +81 -0
  51. package/dist/input/stdin-filter.js +379 -0
  52. package/dist/logging/install.d.ts +2 -0
  53. package/dist/logging/install.js +53 -1
  54. package/dist/proc/classify.d.ts +52 -0
  55. package/dist/proc/classify.js +143 -0
  56. package/dist/proc/kill-tree.d.ts +42 -0
  57. package/dist/proc/kill-tree.js +119 -0
  58. package/dist/proc/limits.d.ts +84 -0
  59. package/dist/proc/limits.js +84 -0
  60. package/dist/proc/log-ring.d.ts +68 -0
  61. package/dist/proc/log-ring.js +102 -0
  62. package/dist/proc/prompt.d.ts +24 -0
  63. package/dist/proc/prompt.js +49 -0
  64. package/dist/proc/readiness.d.ts +102 -0
  65. package/dist/proc/readiness.js +219 -0
  66. package/dist/proc/supervisor.d.ts +103 -0
  67. package/dist/proc/supervisor.js +465 -0
  68. package/dist/proc/types.d.ts +175 -0
  69. package/dist/proc/types.js +15 -0
  70. package/dist/session/persist.js +36 -1
  71. package/dist/todo/limits.d.ts +4 -17
  72. package/dist/todo/limits.js +4 -17
  73. package/dist/todo/panel-rows.d.ts +8 -6
  74. package/dist/todo/panel-rows.js +19 -6
  75. package/dist/tools/bash-tool.d.ts +51 -2
  76. package/dist/tools/bash-tool.js +321 -51
  77. package/dist/tools/fs-tools.d.ts +17 -0
  78. package/dist/tools/index.d.ts +55 -2
  79. package/dist/tools/index.js +39 -1
  80. package/dist/tools/proc-tools.d.ts +25 -0
  81. package/dist/tools/proc-tools.js +102 -0
  82. package/dist/ui/App.d.ts +15 -2
  83. package/dist/ui/App.js +330 -69
  84. package/dist/ui/AutocompletePopup.d.ts +3 -1
  85. package/dist/ui/AutocompletePopup.js +9 -11
  86. package/dist/ui/BottomStatusRow.d.ts +1 -1
  87. package/dist/ui/Composer.d.ts +56 -1
  88. package/dist/ui/Composer.js +50 -6
  89. package/dist/ui/PromptInput.d.ts +52 -3
  90. package/dist/ui/PromptInput.js +201 -55
  91. package/dist/ui/StatusBar.d.ts +40 -15
  92. package/dist/ui/StatusBar.js +51 -9
  93. package/dist/ui/TeamPanel.d.ts +3 -1
  94. package/dist/ui/TeamPanel.js +13 -9
  95. package/dist/ui/TodoPanel.d.ts +5 -5
  96. package/dist/ui/TodoPanel.js +56 -24
  97. package/dist/ui/Transcript.js +29 -1
  98. package/dist/ui/UpdateLine.d.ts +1 -1
  99. package/dist/ui/capabilities.js +5 -5
  100. package/dist/ui/composer-limits.d.ts +31 -0
  101. package/dist/ui/composer-limits.js +50 -0
  102. package/dist/ui/composer-rows.d.ts +73 -0
  103. package/dist/ui/composer-rows.js +201 -0
  104. package/dist/ui/editor-reducer.d.ts +37 -0
  105. package/dist/ui/editor-reducer.js +88 -12
  106. package/dist/ui/entries/ServiceCard.d.ts +66 -0
  107. package/dist/ui/entries/ServiceCard.js +116 -0
  108. package/dist/ui/entries/UserEntry.d.ts +17 -3
  109. package/dist/ui/entries/UserEntry.js +34 -5
  110. package/dist/ui/exit-snapshot.d.ts +9 -0
  111. package/dist/ui/layout/ScrollViewport.d.ts +1 -1
  112. package/dist/ui/layout/autocomplete.d.ts +18 -0
  113. package/dist/ui/layout/autocomplete.js +26 -0
  114. package/dist/ui/layout/budget.d.ts +34 -6
  115. package/dist/ui/layout/budget.js +32 -7
  116. package/dist/ui/layout/rail.d.ts +4 -53
  117. package/dist/ui/layout/rail.js +10 -62
  118. package/dist/ui/layout/team-panel.d.ts +18 -0
  119. package/dist/ui/layout/team-panel.js +22 -0
  120. package/dist/ui/layout/todo-layout.d.ts +24 -0
  121. package/dist/ui/layout/todo-layout.js +27 -0
  122. package/dist/ui/layout/virtual-window.js +51 -1
  123. package/dist/ui/overlays/HelpOverlay.js +3 -0
  124. package/dist/ui/overlays/PlanReviewOverlay.js +10 -2
  125. package/dist/ui/overlays/QuestionOverlay.js +5 -1
  126. package/dist/ui/overlays/SettingsScreen.js +14 -1
  127. package/dist/ui/paste-frames.d.ts +87 -0
  128. package/dist/ui/paste-frames.js +112 -0
  129. package/dist/ui/paste-tokens.d.ts +90 -0
  130. package/dist/ui/paste-tokens.js +147 -0
  131. package/dist/ui/screen.d.ts +16 -0
  132. package/dist/ui/screen.js +45 -2
  133. package/dist/ui/selection/selection-controller.d.ts +1 -1
  134. package/dist/ui/transcript-text.js +55 -2
  135. package/dist/ui/use-wheel-routing.d.ts +1 -1
  136. package/package.json +2 -2
  137. package/dist/input/stdin-mouse-filter.d.ts +0 -47
  138. package/dist/input/stdin-mouse-filter.js +0 -153
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `bash_output` and `bash_kill` — the model's two handles on a supervised
3
+ * service (background-service-supervision §5.1).
4
+ *
5
+ * REGISTERED THROUGH A FACTORY OPTION, NEVER APPENDED AFTER THE FACT
6
+ * (`tools/index.ts::procTools`). `tools.test.ts::C7` asserts `HOST_TOOL_NAMES`
7
+ * equals what `createBuiltinTools` PRODUCES, so appending these in
8
+ * `AgentController` after the factory returned would turn that test red with a
9
+ * message about two lists of names that says nothing about background services —
10
+ * the trap `teamTools` and `todoTools` each record in capitals.
11
+ *
12
+ * NEITHER JOINS `MUTATING_TOOLS` (P2-5). `bash_output` is a read. `bash_kill`
13
+ * stops something THIS SESSION STARTED and is showing on screen, and the plan
14
+ * gate already refuses it in plan mode; putting a `--confirm` modal between the
15
+ * user and stopping their own runaway server is the wrong trade. `bash` itself
16
+ * stays in `MUTATING_TOOLS` unchanged, including when `background: true` — the
17
+ * command is still arbitrary.
18
+ */
19
+ import { type AgentTool } from '@aragon-agent/core';
20
+ import type { ProcSupervisorPort } from '../proc/types.js';
21
+ export interface ProcToolDeps {
22
+ supervisor: ProcSupervisorPort;
23
+ }
24
+ export declare function makeBashOutput(deps: ProcToolDeps): AgentTool;
25
+ export declare function makeBashKill(deps: ProcToolDeps): AgentTool;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * `bash_output` and `bash_kill` — the model's two handles on a supervised
3
+ * service (background-service-supervision §5.1).
4
+ *
5
+ * REGISTERED THROUGH A FACTORY OPTION, NEVER APPENDED AFTER THE FACT
6
+ * (`tools/index.ts::procTools`). `tools.test.ts::C7` asserts `HOST_TOOL_NAMES`
7
+ * equals what `createBuiltinTools` PRODUCES, so appending these in
8
+ * `AgentController` after the factory returned would turn that test red with a
9
+ * message about two lists of names that says nothing about background services —
10
+ * the trap `teamTools` and `todoTools` each record in capitals.
11
+ *
12
+ * NEITHER JOINS `MUTATING_TOOLS` (P2-5). `bash_output` is a read. `bash_kill`
13
+ * stops something THIS SESSION STARTED and is showing on screen, and the plan
14
+ * gate already refuses it in plan mode; putting a `--confirm` modal between the
15
+ * user and stopping their own runaway server is the wrong trade. `bash` itself
16
+ * stays in `MUTATING_TOOLS` unchanged, including when `background: true` — the
17
+ * command is still arbitrary.
18
+ */
19
+ import { defineTool, errorResult, textResult } from '@aragon-agent/core';
20
+ import { PROC_LIMITS } from '../proc/limits.js';
21
+ /** One line of status, shared by both tools so the two can never disagree. */
22
+ function statusLine(service) {
23
+ const bits = [`service ${service.id} ${service.status}`];
24
+ if (service.url)
25
+ bits.push(service.url);
26
+ if (service.exitCode !== null)
27
+ bits.push(`exit code ${service.exitCode}`);
28
+ else if (service.signal)
29
+ bits.push(`signal ${service.signal}`);
30
+ if (service.killIncomplete)
31
+ bits.push('(may have left a detached child)');
32
+ return `${bits.join(' ')}\n$ ${service.command}`;
33
+ }
34
+ export function makeBashOutput(deps) {
35
+ return defineTool({
36
+ name: 'bash_output',
37
+ label: 'Service log',
38
+ description: 'Read a background service log tail and its current status. Pass the ' +
39
+ '`since` cursor returned by a previous call to read only what is new. ' +
40
+ 'Use this to verify a service actually started, and to read a build or ' +
41
+ 'test watcher as it runs.',
42
+ parameters: {
43
+ type: 'object',
44
+ properties: {
45
+ service: { type: 'string', description: 'The service id, e.g. "s1".' },
46
+ since: {
47
+ type: 'number',
48
+ description: 'Cursor from a previous call; omit to read the whole tail.',
49
+ },
50
+ },
51
+ required: ['service'],
52
+ },
53
+ async execute(_id, rawParams) {
54
+ const params = rawParams;
55
+ const service = deps.supervisor.get(params.service);
56
+ if (!service) {
57
+ return errorResult(`No service "${params.service}". Start one with bash({ command, background: true }).`);
58
+ }
59
+ const page = deps.supervisor.read(params.service, params.since);
60
+ const lines = [statusLine(service)];
61
+ if (page?.truncated) {
62
+ lines.push(`[note] older rows were dropped - the tail keeps the last ` +
63
+ `${PROC_LIMITS.serviceTailRows} rows.`);
64
+ }
65
+ if (!page || page.rows.length === 0) {
66
+ lines.push('(no new output)');
67
+ }
68
+ else {
69
+ lines.push(...page.rows);
70
+ }
71
+ lines.push(`[cursor ${page?.cursor ?? service.rowsSeen}]`);
72
+ return textResult(lines.join('\n'));
73
+ },
74
+ });
75
+ }
76
+ export function makeBashKill(deps) {
77
+ return defineTool({
78
+ name: 'bash_kill',
79
+ label: 'Stop service',
80
+ description: 'Stop a background service by id, or every service with "all". Stop the ' +
81
+ 'services you started once you are finished with them, unless the user ' +
82
+ 'asked for them to stay up.',
83
+ parameters: {
84
+ type: 'object',
85
+ properties: {
86
+ service: { type: 'string', description: 'The service id, or "all".' },
87
+ },
88
+ required: ['service'],
89
+ },
90
+ async execute(_id, rawParams) {
91
+ const params = rawParams;
92
+ if (params.service !== 'all' && !deps.supervisor.get(params.service)) {
93
+ return errorResult(`No service "${params.service}".`);
94
+ }
95
+ const stopped = await deps.supervisor.stop(params.service);
96
+ if (stopped.length === 0)
97
+ return textResult('Nothing to stop.');
98
+ const lines = stopped.map((s) => statusLine(s));
99
+ return textResult(`Stopped ${stopped.length} service${stopped.length === 1 ? '' : 's'}.\n${lines.join('\n')}`);
100
+ },
101
+ });
102
+ }
package/dist/ui/App.d.ts CHANGED
@@ -10,7 +10,8 @@ import type { ConfirmRequest } from '../tools/index.js';
10
10
  import { type Overlay, type ToastLevel } from '../agent/reducer.js';
11
11
  import type { UpdateBridge } from '../update/types.js';
12
12
  import { type RenderMode } from './layout/frame.js';
13
- import type { MouseSource } from '../input/stdin-mouse-filter.js';
13
+ import type { MouseSource } from '../input/stdin-filter.js';
14
+ import type { PasteBridge } from '../input/limits.js';
14
15
  import type { SelectionBridge } from './selection/selection-controller.js';
15
16
  import type { HumanInputBridge } from '../tools/human-input.js';
16
17
  export interface ConfirmBridge {
@@ -73,6 +74,18 @@ export interface AppProps {
73
74
  * 'off'`, on a non-TTY, in CI, and in every test that does not exercise it.
74
75
  */
75
76
  updateBridge?: UpdateBridge;
77
+ /**
78
+ * The stdin filter's channel for a refused paste (tui-paste-handling section
79
+ * 5.1.2 / I-15).
80
+ *
81
+ * A BRIDGE for the reason `updateBridge` above is one: the filter is built in
82
+ * `cli.tsx` BEFORE `render()`, so it has no `dispatch`. Its only other outlet
83
+ * is the logger, and a limit that writes only to a log file is
84
+ * indistinguishable — from the user's chair — from a paste that silently did
85
+ * nothing, which is what D-11 exists to rule out. Absent under `--no-paste`,
86
+ * on a non-TTY, and in every test that does not exercise it.
87
+ */
88
+ pasteBridge?: PasteBridge;
76
89
  /**
77
90
  * The terminal-facing services `cli.tsx` owns and this component cannot build
78
91
  * (tui-selection-and-scroll-follow §4.4).
@@ -120,4 +133,4 @@ export interface TerminalBridge {
120
133
  writeForeign?: (text: string) => void;
121
134
  selection?: SelectionBridge;
122
135
  }
123
- export declare function App({ controller, version, mode, initialOverlay, initialPrompt, confirmBridge, humanInputBridge, mouseSource, vtInputWarning, updateBridge, terminal, }: AppProps): React.ReactElement;
136
+ export declare function App({ controller, version, mode, initialOverlay, initialPrompt, confirmBridge, humanInputBridge, mouseSource, vtInputWarning, updateBridge, pasteBridge, terminal, }: AppProps): React.ReactElement;