ikarmic-forge 0.0.0-stage → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +62 -2
- package/dist/acp/server.d.ts +55 -0
- package/dist/acp/server.d.ts.map +1 -0
- package/dist/acp/server.js +276 -0
- package/dist/acp/server.js.map +1 -0
- package/dist/app.d.ts +22 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +159 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/forge.d.ts +3 -0
- package/dist/bin/forge.d.ts.map +1 -0
- package/dist/bin/forge.js +786 -0
- package/dist/bin/forge.js.map +1 -0
- package/dist/chat-files.d.ts +45 -0
- package/dist/chat-files.d.ts.map +1 -0
- package/dist/chat-files.js +189 -0
- package/dist/chat-files.js.map +1 -0
- package/dist/clipboard.d.ts +38 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +63 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/commands/acp.d.ts +4 -0
- package/dist/commands/acp.d.ts.map +1 -0
- package/dist/commands/acp.js +36 -0
- package/dist/commands/acp.js.map +1 -0
- package/dist/commands/ai-comments.d.ts +9 -0
- package/dist/commands/ai-comments.d.ts.map +1 -0
- package/dist/commands/ai-comments.js +43 -0
- package/dist/commands/ai-comments.js.map +1 -0
- package/dist/commands/architect.d.ts +9 -0
- package/dist/commands/architect.d.ts.map +1 -0
- package/dist/commands/architect.js +27 -0
- package/dist/commands/architect.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +10 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +168 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +180 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/diff.d.ts +29 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +90 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/hook.d.ts +10 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +121 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/mcp.d.ts +10 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +110 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/memory.d.ts +10 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +77 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/orchestrator.d.ts +22 -0
- package/dist/commands/orchestrator.d.ts.map +1 -0
- package/dist/commands/orchestrator.js +113 -0
- package/dist/commands/orchestrator.js.map +1 -0
- package/dist/commands/plugin.d.ts +3 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +62 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/policy.d.ts +2 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +21 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/skill.d.ts +13 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +194 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/spec.d.ts +23 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +147 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/watch.d.ts +15 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +83 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/worktree.d.ts +22 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +187 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/components/Approval.d.ts +9 -0
- package/dist/components/Approval.d.ts.map +1 -0
- package/dist/components/Approval.js +39 -0
- package/dist/components/Approval.js.map +1 -0
- package/dist/components/Footer.d.ts +22 -0
- package/dist/components/Footer.d.ts.map +1 -0
- package/dist/components/Footer.js +59 -0
- package/dist/components/Footer.js.map +1 -0
- package/dist/components/Header.d.ts +11 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +23 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/Spinner.d.ts +3 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +8 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/Stream.d.ts +10 -0
- package/dist/components/Stream.d.ts.map +1 -0
- package/dist/components/Stream.js +13 -0
- package/dist/components/Stream.js.map +1 -0
- package/dist/components/ToolEvent.d.ts +13 -0
- package/dist/components/ToolEvent.d.ts.map +1 -0
- package/dist/components/ToolEvent.js +54 -0
- package/dist/components/ToolEvent.js.map +1 -0
- package/dist/credential-store.d.ts +8 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +37 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/git-workflow.d.ts +16 -0
- package/dist/git-workflow.d.ts.map +1 -0
- package/dist/git-workflow.js +38 -0
- package/dist/git-workflow.js.map +1 -0
- package/dist/mcp-loader.d.ts +25 -0
- package/dist/mcp-loader.d.ts.map +1 -0
- package/dist/mcp-loader.js +99 -0
- package/dist/mcp-loader.js.map +1 -0
- package/dist/notify.d.ts +12 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +47 -0
- package/dist/notify.js.map +1 -0
- package/dist/options.d.ts +449 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +871 -0
- package/dist/options.js.map +1 -0
- package/dist/repl-commands.d.ts +92 -0
- package/dist/repl-commands.d.ts.map +1 -0
- package/dist/repl-commands.js +228 -0
- package/dist/repl-commands.js.map +1 -0
- package/dist/repl-extras.d.ts +39 -0
- package/dist/repl-extras.d.ts.map +1 -0
- package/dist/repl-extras.js +120 -0
- package/dist/repl-extras.js.map +1 -0
- package/dist/repl.d.ts +76 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +1507 -0
- package/dist/repl.js.map +1 -0
- package/dist/runner.d.ts +64 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +61 -0
- package/dist/runner.js.map +1 -0
- package/dist/session-checkpoints.d.ts +6 -0
- package/dist/session-checkpoints.d.ts.map +1 -0
- package/dist/session-checkpoints.js +25 -0
- package/dist/session-checkpoints.js.map +1 -0
- package/dist/specialists-loader.d.ts +22 -0
- package/dist/specialists-loader.d.ts.map +1 -0
- package/dist/specialists-loader.js +38 -0
- package/dist/specialists-loader.js.map +1 -0
- package/dist/tool-display.d.ts +19 -0
- package/dist/tool-display.d.ts.map +1 -0
- package/dist/tool-display.js +57 -0
- package/dist/tool-display.js.map +1 -0
- package/package.json +70 -3
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge worktree …` CLI subcommand. v2.11 + v2.14.
|
|
3
|
+
*
|
|
4
|
+
* forge worktree list: show active worktrees
|
|
5
|
+
* forge worktree cleanup [--with-branches|--no-branches] [-f]
|
|
6
|
+
*: remove all (confirms)
|
|
7
|
+
* forge worktree cleanup --force: remove without confirm
|
|
8
|
+
* forge worktree prune: orphan worktrees only
|
|
9
|
+
* forge worktree sweep [--force]: remove orphans + delete
|
|
10
|
+
* their auto-branches
|
|
11
|
+
*
|
|
12
|
+
* v2.14: cleanup now also deletes the auto-created branches by
|
|
13
|
+
* default (pass `--no-branches` to keep them). The new `sweep`
|
|
14
|
+
* subcommand is the one-shot "I'm done with this repo" cleanup:
|
|
15
|
+
* orphans get their branches deleted too.
|
|
16
|
+
*
|
|
17
|
+
* Mirrors the soft-prefix pattern of the other CLI subcommands:
|
|
18
|
+
* doesn't need an AI provider.
|
|
19
|
+
*/
|
|
20
|
+
import { WorktreeManager } from '@ikarmic/forge-core';
|
|
21
|
+
import { createInterface } from 'node:readline/promises';
|
|
22
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
23
|
+
export async function handleWorktreeCommand(cmd, cwd) {
|
|
24
|
+
const repoRoot = await WorktreeManager.resolveRepoRoot(cwd);
|
|
25
|
+
if (!repoRoot) {
|
|
26
|
+
process.stderr.write(`forge worktree: ${cwd} is not inside a git repository. Nothing to manage.\n`);
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
const manager = new WorktreeManager(repoRoot);
|
|
30
|
+
if (cmd.list) {
|
|
31
|
+
return printWorktreeList(manager, repoRoot);
|
|
32
|
+
}
|
|
33
|
+
if (cmd.cleanup) {
|
|
34
|
+
return cleanupWorktrees(manager, repoRoot, cmd.cleanup.force, cmd.cleanup.withBranches);
|
|
35
|
+
}
|
|
36
|
+
if (cmd.sweep) {
|
|
37
|
+
return sweepWorktrees(manager, repoRoot, cmd.sweep.force);
|
|
38
|
+
}
|
|
39
|
+
if (cmd.prune) {
|
|
40
|
+
const pruned = await manager.pruneStale();
|
|
41
|
+
process.stdout.write(`Pruned ${pruned} orphan worktree${pruned === 1 ? '' : 's'}.\n`);
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
// Soft-prefix matched but no recognized subcommand.
|
|
45
|
+
process.stderr.write('forge worktree: expected one of list | cleanup | prune | sweep. Try `forge worktree --help`.\n');
|
|
46
|
+
return 2;
|
|
47
|
+
}
|
|
48
|
+
async function printWorktreeList(manager, repoRoot) {
|
|
49
|
+
const worktrees = await manager.list();
|
|
50
|
+
if (worktrees.length === 0) {
|
|
51
|
+
process.stdout.write(`No active worktrees under ${manager.worktreesDirectory}\n`);
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
process.stdout.write(`Worktrees under ${manager.worktreesDirectory} (repo: ${repoRoot}):\n`);
|
|
55
|
+
// Pad to a sensible width.
|
|
56
|
+
const labelWidth = Math.max(8, ...worktrees.map((w) => w.label.length));
|
|
57
|
+
const branchWidth = Math.max(6, ...worktrees.map((w) => w.branch.length));
|
|
58
|
+
for (const w of worktrees) {
|
|
59
|
+
process.stdout.write(` ${w.label.padEnd(labelWidth)} ${w.branch.padEnd(branchWidth)} ${w.commit.slice(0, 7)} ${w.path}\n`);
|
|
60
|
+
}
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
async function cleanupWorktrees(manager, repoRoot, force, withBranches) {
|
|
64
|
+
const worktrees = await manager.list();
|
|
65
|
+
if (worktrees.length === 0) {
|
|
66
|
+
process.stdout.write(`No active worktrees under ${manager.worktreesDirectory}\n`);
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
// Confirm before destructive action (unless --force).
|
|
70
|
+
if (!force && output.isTTY) {
|
|
71
|
+
const branchNote = withBranches
|
|
72
|
+
? ' and their auto-created branches'
|
|
73
|
+
: ' (keeping their auto-created branches; pass --with-branches to delete them too)';
|
|
74
|
+
process.stdout.write(`About to remove ${worktrees.length} worktree${worktrees.length === 1 ? '' : 's'} under ${manager.worktreesDirectory} (repo: ${repoRoot})${branchNote}:\n`);
|
|
75
|
+
for (const w of worktrees) {
|
|
76
|
+
process.stdout.write(` - ${w.label} (${w.branch}) ${w.path}\n`);
|
|
77
|
+
}
|
|
78
|
+
const rl = createInterface({ input, output });
|
|
79
|
+
try {
|
|
80
|
+
const answer = (await rl.question('Proceed? [y/N] ')).trim().toLowerCase();
|
|
81
|
+
if (answer !== 'y' && answer !== 'yes') {
|
|
82
|
+
process.stdout.write('Aborted.\n');
|
|
83
|
+
return 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
rl.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (!force) {
|
|
91
|
+
// No TTY and no --force: refuse to bulk-delete without confirmation.
|
|
92
|
+
process.stderr.write('forge worktree cleanup: refusing to remove without confirmation (no TTY). Pass --force to override.\n');
|
|
93
|
+
return 2;
|
|
94
|
+
}
|
|
95
|
+
let removed = 0;
|
|
96
|
+
let branchesDeleted = 0;
|
|
97
|
+
let failed = 0;
|
|
98
|
+
for (const w of worktrees) {
|
|
99
|
+
try {
|
|
100
|
+
// For cleanup we use the public list() output: we don't have
|
|
101
|
+
// the path stored in `owned` from this process. That's fine:
|
|
102
|
+
// any `forge/...` branch on disk IS ours by convention, so we
|
|
103
|
+
// ask the manager to check for other users via
|
|
104
|
+
// deleteBranchIfOrphan and only delete when safe.
|
|
105
|
+
await manager.remove(w.path, { force: true });
|
|
106
|
+
removed++;
|
|
107
|
+
if (withBranches && w.branch && w.branch !== '(detached)') {
|
|
108
|
+
const ok = await manager.deleteBranchIfOrphan(w.branch);
|
|
109
|
+
if (ok)
|
|
110
|
+
branchesDeleted++;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
failed++;
|
|
115
|
+
process.stderr.write(`forge worktree: failed to remove ${w.path}: ${err.message}\n`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const branchSummary = withBranches
|
|
119
|
+
? `, ${branchesDeleted} branch${branchesDeleted === 1 ? '' : 'es'} deleted`
|
|
120
|
+
: '';
|
|
121
|
+
process.stdout.write(`Removed ${removed} worktree${removed === 1 ? '' : 's'}${branchSummary}${failed > 0 ? `, ${failed} failed` : ''}.\n`);
|
|
122
|
+
return failed > 0 ? 1 : 0;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* v2.14: "I'm done" cleanup. Removes worktrees, deletes their
|
|
126
|
+
* auto-created branches, AND sweeps up any `forge/*` branch left
|
|
127
|
+
* over with no worktree at all (a manually-deleted worktree folder,
|
|
128
|
+
* or leftovers from an older Forge version): `cleanup` only handles
|
|
129
|
+
* the first two.
|
|
130
|
+
*
|
|
131
|
+
* Prompts for confirmation the same way `cleanup` does unless
|
|
132
|
+
* `--force` is passed: this deletes branches, which is a step
|
|
133
|
+
* further than `cleanup`'s default, so it gets no less scrutiny.
|
|
134
|
+
* `deleteBranchIfOrphan` (used throughout) refuses to delete anything
|
|
135
|
+
* with commits not already reachable from HEAD, so this can't destroy
|
|
136
|
+
* unmerged work even with `--force`.
|
|
137
|
+
*/
|
|
138
|
+
async function sweepWorktrees(manager, repoRoot, force) {
|
|
139
|
+
const worktrees = await manager.list();
|
|
140
|
+
if (worktrees.length > 0) {
|
|
141
|
+
if (!force && output.isTTY) {
|
|
142
|
+
process.stdout.write(`About to remove ${worktrees.length} worktree${worktrees.length === 1 ? '' : 's'} under ${manager.worktreesDirectory} (repo: ${repoRoot}) and their auto-created branches (anything with unmerged commits is left alone):\n`);
|
|
143
|
+
for (const w of worktrees) {
|
|
144
|
+
process.stdout.write(` - ${w.label} (${w.branch}) ${w.path}\n`);
|
|
145
|
+
}
|
|
146
|
+
const rl = createInterface({ input, output });
|
|
147
|
+
try {
|
|
148
|
+
const answer = (await rl.question('Proceed? [y/N] ')).trim().toLowerCase();
|
|
149
|
+
if (answer !== 'y' && answer !== 'yes') {
|
|
150
|
+
process.stdout.write('Aborted.\n');
|
|
151
|
+
return 1;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
rl.close();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (!force) {
|
|
159
|
+
process.stderr.write('forge worktree sweep: refusing to run without --force on a non-TTY input.\n');
|
|
160
|
+
return 2;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
let removed = 0;
|
|
164
|
+
let branchesDeleted = 0;
|
|
165
|
+
let failed = 0;
|
|
166
|
+
for (const w of worktrees) {
|
|
167
|
+
try {
|
|
168
|
+
await manager.remove(w.path, { force: true });
|
|
169
|
+
removed++;
|
|
170
|
+
if (w.branch && w.branch !== '(detached)') {
|
|
171
|
+
const ok = await manager.deleteBranchIfOrphan(w.branch);
|
|
172
|
+
if (ok)
|
|
173
|
+
branchesDeleted++;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
failed++;
|
|
178
|
+
process.stderr.write(`forge worktree sweep: failed to remove ${w.path}: ${err.message}\n`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Branches with no worktree left at all (cleanup/removal above only
|
|
182
|
+
// handles branches still attached to a worktree entry).
|
|
183
|
+
branchesDeleted += await manager.pruneOrphanBranches();
|
|
184
|
+
process.stdout.write(`Swept ${removed} worktree${removed === 1 ? '' : 's'}, ${branchesDeleted} branch${branchesDeleted === 1 ? '' : 'es'} deleted${failed > 0 ? `, ${failed} failed` : ''}.\n`);
|
|
185
|
+
return failed > 0 ? 1 : 0;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ApprovalRequest } from '@ikarmic/forge-core';
|
|
3
|
+
export interface ApprovalProps {
|
|
4
|
+
request: ApprovalRequest;
|
|
5
|
+
/** Resolves the promise. After resolution, the parent will unmount this. */
|
|
6
|
+
onResolve: (approved: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function Approval({ request, onResolve }: ApprovalProps): React.ReactElement;
|
|
9
|
+
//# sourceMappingURL=Approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Approval.d.ts","sourceRoot":"","sources":["../../src/components/Approval.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,4EAA4E;IAC5E,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CA8DlF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Box, Text, useInput } from 'ink';
|
|
3
|
+
export function Approval({ request, onResolve }) {
|
|
4
|
+
const [answered, setAnswered] = useState(null);
|
|
5
|
+
useInput((input, key) => {
|
|
6
|
+
if (answered)
|
|
7
|
+
return;
|
|
8
|
+
const i = input.toLowerCase();
|
|
9
|
+
if (i === 'y' || i === 'yes') {
|
|
10
|
+
setAnswered('y');
|
|
11
|
+
onResolve(true);
|
|
12
|
+
}
|
|
13
|
+
else if (i === 'n' || i === 'no' || key.escape || (key.ctrl && input === 'c')) {
|
|
14
|
+
setAnswered('n');
|
|
15
|
+
onResolve(false);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const argPreview = JSON.stringify(request.args);
|
|
19
|
+
const argSummary = argPreview.length > 200 ? argPreview.slice(0, 197) + '...' : argPreview;
|
|
20
|
+
const previewLines = request.preview ? request.preview.split(/\r?\n/).slice(0, 14) : [];
|
|
21
|
+
return (React.createElement(Box, { flexDirection: "column", marginTop: 1, borderStyle: "round", borderColor: "yellow", paddingX: 1 },
|
|
22
|
+
React.createElement(Box, null,
|
|
23
|
+
React.createElement(Text, { color: request.destructive ? 'red' : 'yellow', bold: true }, "\u26A0 approval required"),
|
|
24
|
+
React.createElement(Text, null, " \u00B7 "),
|
|
25
|
+
React.createElement(Text, { bold: true }, request.name),
|
|
26
|
+
request.destructive && (React.createElement(React.Fragment, null,
|
|
27
|
+
React.createElement(Text, null, " \u00B7 "),
|
|
28
|
+
React.createElement(Text, { color: "red", bold: true }, "destructive")))),
|
|
29
|
+
React.createElement(Box, { marginLeft: 2, marginTop: 1 },
|
|
30
|
+
React.createElement(Text, { color: "gray" }, argSummary)),
|
|
31
|
+
previewLines.length > 0 && (React.createElement(Box, { marginLeft: 2, marginTop: 1, flexDirection: "column" }, previewLines.map((line, i) => (React.createElement(Text, { key: i, color: line.startsWith('+') ? 'green' : line.startsWith('-') ? 'red' : 'gray' }, line))))),
|
|
32
|
+
React.createElement(Box, { marginTop: 1 }, answered === null ? (React.createElement(Text, null,
|
|
33
|
+
"Allow? ",
|
|
34
|
+
React.createElement(Text, { color: "green", bold: true }, "Y"),
|
|
35
|
+
React.createElement(Text, null, "es / "),
|
|
36
|
+
React.createElement(Text, { color: "red", bold: true }, "N"),
|
|
37
|
+
React.createElement(Text, null, "o (esc)"))) : (React.createElement(Text, { color: answered === 'y' ? 'green' : 'red' }, answered === 'y' ? '✓ approved' : '✗ denied')))));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=Approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Approval.js","sourceRoot":"","sources":["../../src/components/Approval.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface FooterProps {
|
|
3
|
+
inputTokens: number;
|
|
4
|
+
outputTokens: number;
|
|
5
|
+
/** Prompt tokens served from the provider cache; shown when > 0. */
|
|
6
|
+
cachedInputTokens?: number;
|
|
7
|
+
durationMs: number;
|
|
8
|
+
iteration: number;
|
|
9
|
+
reason?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Running USD cost. When undefined the footer omits the cost chip; the
|
|
12
|
+
* UI only passes this when pricing was resolved.
|
|
13
|
+
*/
|
|
14
|
+
costUsd?: number;
|
|
15
|
+
/** When cost is shown, total redactions so far in this session. */
|
|
16
|
+
redacted?: number;
|
|
17
|
+
/** Cache stats: only shown when verbose. */
|
|
18
|
+
cacheHits?: number;
|
|
19
|
+
cacheMisses?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function Footer(props: FooterProps): React.ReactElement;
|
|
22
|
+
//# sourceMappingURL=Footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA0D7D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
function formatNumber(n) {
|
|
4
|
+
if (n < 1000)
|
|
5
|
+
return String(n);
|
|
6
|
+
if (n < 1_000_000)
|
|
7
|
+
return (n / 1000).toFixed(1) + 'k';
|
|
8
|
+
return (n / 1_000_000).toFixed(2) + 'M';
|
|
9
|
+
}
|
|
10
|
+
export function Footer(props) {
|
|
11
|
+
const { inputTokens, outputTokens, cachedInputTokens, durationMs, iteration, reason, costUsd, redacted, cacheHits, cacheMisses } = props;
|
|
12
|
+
const seconds = (durationMs / 1000).toFixed(1);
|
|
13
|
+
const costLabel = costUsd === undefined
|
|
14
|
+
? null
|
|
15
|
+
: costUsd === 0
|
|
16
|
+
? '$0.00'
|
|
17
|
+
: costUsd < 0.01
|
|
18
|
+
? '$' + costUsd.toFixed(4)
|
|
19
|
+
: costUsd < 1
|
|
20
|
+
? '$' + costUsd.toFixed(3)
|
|
21
|
+
: '$' + costUsd.toFixed(2);
|
|
22
|
+
return (React.createElement(Box, { borderStyle: "round", borderColor: "gray", paddingX: 1, flexDirection: "row", justifyContent: "space-between" },
|
|
23
|
+
React.createElement(Box, null,
|
|
24
|
+
React.createElement(Text, { color: "gray" }, "tokens: "),
|
|
25
|
+
React.createElement(Text, null,
|
|
26
|
+
"\u2191",
|
|
27
|
+
formatNumber(inputTokens),
|
|
28
|
+
" \u2193",
|
|
29
|
+
formatNumber(outputTokens),
|
|
30
|
+
cachedInputTokens !== undefined && cachedInputTokens > 0 ? ` (${formatNumber(cachedInputTokens)} cached)` : ''),
|
|
31
|
+
costLabel !== null && (React.createElement(React.Fragment, null,
|
|
32
|
+
React.createElement(Text, { color: "gray" }, " \u00B7 "),
|
|
33
|
+
React.createElement(Text, { color: "green" }, costLabel))),
|
|
34
|
+
redacted !== undefined && redacted > 0 && (React.createElement(React.Fragment, null,
|
|
35
|
+
React.createElement(Text, { color: "gray" }, " \u00B7 "),
|
|
36
|
+
React.createElement(Text, { color: "red" },
|
|
37
|
+
"\uD83D\uDD12 ",
|
|
38
|
+
redacted))),
|
|
39
|
+
cacheHits !== undefined && (cacheHits > 0 || (cacheMisses !== undefined && cacheMisses > 0)) && (React.createElement(React.Fragment, null,
|
|
40
|
+
React.createElement(Text, { color: "gray" }, " \u00B7 "),
|
|
41
|
+
React.createElement(Text, { color: "cyan" },
|
|
42
|
+
"cache: ",
|
|
43
|
+
cacheHits,
|
|
44
|
+
"H/",
|
|
45
|
+
cacheMisses ?? 0,
|
|
46
|
+
"M"))),
|
|
47
|
+
React.createElement(Text, { color: "gray" }, " \u00B7 "),
|
|
48
|
+
React.createElement(Text, null,
|
|
49
|
+
seconds,
|
|
50
|
+
"s"),
|
|
51
|
+
React.createElement(Text, { color: "gray" }, " \u00B7 "),
|
|
52
|
+
React.createElement(Text, null,
|
|
53
|
+
"steps: ",
|
|
54
|
+
iteration)),
|
|
55
|
+
reason && (React.createElement(Box, null,
|
|
56
|
+
React.createElement(Text, { color: "gray" }, "finished: "),
|
|
57
|
+
React.createElement(Text, { color: reason === 'completed' ? 'green' : 'yellow' }, reason)))));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=Footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAsBhC,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,SAAS;QAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACtD,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAkB;IACvC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IACzI,MAAM,OAAO,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GACb,OAAO,KAAK,SAAS;QACnB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,GAAG,IAAI;gBAChB,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1B,CAAC,CAAC,OAAO,GAAG,CAAC;oBACb,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC1B,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,cAAc,EAAC,eAAe;QACzG,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,eAAgB;YAClC,oBAAC,IAAI;;gBACD,YAAY,CAAC,WAAW,CAAC;;gBAAI,YAAY,CAAC,YAAY,CAAC;gBACxD,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAC1G;YACN,SAAS,KAAK,IAAI,IAAI,CACrB;gBACE,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,eAAW;gBAC7B,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,IAAE,SAAS,CAAQ,CACrC,CACJ;YACA,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,CAAC,IAAI,CACzC;gBACE,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,eAAW;gBAC7B,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK;;oBAAK,QAAQ,CAAQ,CACrC,CACJ;YACA,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAC/F;gBACE,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,eAAW;gBAC7B,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;oBACR,SAAS;;oBAAI,WAAW,IAAI,CAAC;wBAChC,CACN,CACJ;YACD,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,eAAW;YAC7B,oBAAC,IAAI;gBACF,OAAO;oBACH;YACP,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,eAAW;YAC7B,oBAAC,IAAI;;gBACK,SAAS,CACZ,CACH;QACL,MAAM,IAAI,CACT,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,iBAAkB;YACpC,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAG,MAAM,CAAQ,CACrE,CACP,CACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ModelConfig } from '@ikarmic/forge-core';
|
|
3
|
+
export interface HeaderProps {
|
|
4
|
+
model: ModelConfig;
|
|
5
|
+
iteration: number;
|
|
6
|
+
maxIterations: number;
|
|
7
|
+
status: 'idle' | 'running' | 'done' | 'error';
|
|
8
|
+
auto: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function Header(props: HeaderProps): React.ReactElement;
|
|
11
|
+
//# sourceMappingURL=Header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA0B7D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { formatModelId } from '@ikarmic/forge-core';
|
|
4
|
+
export function Header(props) {
|
|
5
|
+
const { model, iteration, maxIterations, status, auto } = props;
|
|
6
|
+
const statusColor = status === 'running' ? 'yellow' : status === 'done' ? 'green' : status === 'error' ? 'red' : 'gray';
|
|
7
|
+
return (React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, flexDirection: "row", justifyContent: "space-between" },
|
|
8
|
+
React.createElement(Box, null,
|
|
9
|
+
React.createElement(Text, { color: "cyan", bold: true }, "\u2692 forge"),
|
|
10
|
+
React.createElement(Text, null, " \u00B7 "),
|
|
11
|
+
React.createElement(Text, { color: "magenta" }, formatModelId(model))),
|
|
12
|
+
React.createElement(Box, null,
|
|
13
|
+
React.createElement(Text, { color: auto ? 'red' : 'green', bold: true }, auto ? 'AUTO' : 'INTERACTIVE'),
|
|
14
|
+
React.createElement(Text, null, " \u00B7 "),
|
|
15
|
+
React.createElement(Text, null,
|
|
16
|
+
"step ",
|
|
17
|
+
iteration,
|
|
18
|
+
"/",
|
|
19
|
+
maxIterations),
|
|
20
|
+
React.createElement(Text, null, " \u00B7 "),
|
|
21
|
+
React.createElement(Text, { color: statusColor }, status.toUpperCase()))));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWpD,MAAM,UAAU,MAAM,CAAC,KAAkB;IACvC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAChE,MAAM,WAAW,GACf,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACtG,OAAO,CACL,oBAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,cAAc,EAAC,eAAe;QACzG,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,yBAEhB;YACP,oBAAC,IAAI,mBAAW;YAChB,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,IAAE,aAAa,CAAC,KAAK,CAAC,CAAQ,CAC/C;QACN,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,UACtC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CACzB;YACP,oBAAC,IAAI,mBAAW;YAChB,oBAAC,IAAI;;gBACG,SAAS;;gBAAG,aAAa,CAC1B;YACP,oBAAC,IAAI,mBAAW;YAChB,oBAAC,IAAI,IAAC,KAAK,EAAE,WAAW,IAAG,MAAM,CAAC,WAAW,EAAE,CAAQ,CACnD,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,wBAAgB,OAAO,IAAI,KAAK,CAAC,YAAY,CAM5C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import InkSpinner from 'ink-spinner';
|
|
3
|
+
import { Text } from 'ink';
|
|
4
|
+
export function Spinner() {
|
|
5
|
+
return (React.createElement(Text, { color: "cyan" },
|
|
6
|
+
React.createElement(InkSpinner, { type: "dots" })));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../src/components/Spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAE3B,MAAM,UAAU,OAAO;IACrB,OAAO,CACL,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;QAChB,oBAAC,UAAU,IAAC,IAAI,EAAC,MAAM,GAAG,CACrB,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface StreamProps {
|
|
3
|
+
text: string;
|
|
4
|
+
/** True while tokens are still arriving (renders a cursor). */
|
|
5
|
+
streaming: boolean;
|
|
6
|
+
/** Defaults to "assistant": pass "reasoning" for the reasoning-trace block. */
|
|
7
|
+
label?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function Stream({ text, streaming, label }: StreamProps): React.ReactElement;
|
|
10
|
+
//# sourceMappingURL=Stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stream.d.ts","sourceRoot":"","sources":["../../src/components/Stream.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAmB,EAAE,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAYhG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function Stream({ text, streaming, label = 'assistant' }) {
|
|
4
|
+
return (React.createElement(Box, { flexDirection: "column", marginTop: 1 },
|
|
5
|
+
React.createElement(Text, { color: "gray" },
|
|
6
|
+
"\u250C\u2500 ",
|
|
7
|
+
label),
|
|
8
|
+
React.createElement(Box, { marginLeft: 2, flexDirection: "row" },
|
|
9
|
+
React.createElement(Text, null,
|
|
10
|
+
text,
|
|
11
|
+
streaming ? '▌' : ''))));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=Stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stream.js","sourceRoot":"","sources":["../../src/components/Stream.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAUhC,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,WAAW,EAAe;IAC1E,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC;QACtC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;YAAK,KAAK,CAAQ;QACpC,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK;YACrC,oBAAC,IAAI;gBACF,IAAI;gBACJ,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAChB,CACH,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type DetailLevel } from '../tool-display.js';
|
|
3
|
+
export interface ToolEventProps {
|
|
4
|
+
name: string;
|
|
5
|
+
args: unknown;
|
|
6
|
+
result?: unknown;
|
|
7
|
+
isError?: boolean;
|
|
8
|
+
durationMs?: number;
|
|
9
|
+
pending?: boolean;
|
|
10
|
+
detail?: DetailLevel;
|
|
11
|
+
}
|
|
12
|
+
export declare const ToolEvent: React.NamedExoticComponent<ToolEventProps>;
|
|
13
|
+
//# sourceMappingURL=ToolEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolEvent.d.ts","sourceRoot":"","sources":["../../src/components/ToolEvent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE3F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAUD,eAAO,MAAM,SAAS,4CAiCpB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { getUnifiedDiffText, summarizeResult } from '../tool-display.js';
|
|
4
|
+
function diffLineColor(line) {
|
|
5
|
+
if (line.startsWith('+++') || line.startsWith('---'))
|
|
6
|
+
return 'gray';
|
|
7
|
+
if (line.startsWith('@@'))
|
|
8
|
+
return 'cyan';
|
|
9
|
+
if (line.startsWith('+'))
|
|
10
|
+
return 'green';
|
|
11
|
+
if (line.startsWith('-'))
|
|
12
|
+
return 'red';
|
|
13
|
+
return 'gray';
|
|
14
|
+
}
|
|
15
|
+
export const ToolEvent = React.memo(function ToolEvent(props) {
|
|
16
|
+
const { name, args, result, isError, durationMs, pending, detail = 'compact' } = props;
|
|
17
|
+
const argSummary = summarizeArgs(args);
|
|
18
|
+
const diffText = pending ? null : getUnifiedDiffText(name, args, result);
|
|
19
|
+
const resultSummary = pending || diffText ? undefined : summarizeResult(result, isError, detail);
|
|
20
|
+
return (React.createElement(Box, { flexDirection: "column", marginLeft: 2, marginTop: 1 },
|
|
21
|
+
React.createElement(Box, null,
|
|
22
|
+
React.createElement(Text, { color: isError ? 'red' : 'blue', bold: true },
|
|
23
|
+
isError ? '✗' : pending ? '◌' : '✓',
|
|
24
|
+
" ",
|
|
25
|
+
name),
|
|
26
|
+
React.createElement(Text, { color: "gray" }, argSummary),
|
|
27
|
+
durationMs !== undefined && (React.createElement(Text, { color: "gray" },
|
|
28
|
+
" \u00B7 ",
|
|
29
|
+
durationMs,
|
|
30
|
+
"ms"))),
|
|
31
|
+
diffText && (React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, diffText.replace(/\n$/, '').split('\n').map((line, i) => (React.createElement(Text, { key: i, color: diffLineColor(line) }, line))))),
|
|
32
|
+
resultSummary !== undefined && (React.createElement(Box, { marginLeft: 2 },
|
|
33
|
+
React.createElement(Text, { color: isError ? 'red' : 'gray' }, resultSummary)))));
|
|
34
|
+
});
|
|
35
|
+
function summarizeArgs(args) {
|
|
36
|
+
if (args === undefined || args === null)
|
|
37
|
+
return '()';
|
|
38
|
+
if (typeof args !== 'object')
|
|
39
|
+
return `(${String(args)})`;
|
|
40
|
+
const obj = args;
|
|
41
|
+
const keys = Object.keys(obj);
|
|
42
|
+
if (keys.length === 0)
|
|
43
|
+
return '()';
|
|
44
|
+
const parts = keys.slice(0, 3).map((k) => {
|
|
45
|
+
const v = obj[k];
|
|
46
|
+
const vs = typeof v === 'string' ? JSON.stringify(v) : JSON.stringify(v);
|
|
47
|
+
const truncated = vs.length > 80 ? vs.slice(0, 77) + '...' : vs;
|
|
48
|
+
return `${k}=${truncated}`;
|
|
49
|
+
});
|
|
50
|
+
if (keys.length > 3)
|
|
51
|
+
parts.push(`+${keys.length - 3} more`);
|
|
52
|
+
return `(${parts.join(' ')})`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=ToolEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolEvent.js","sourceRoot":"","sources":["../../src/components/ToolEvent.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CredentialStore } from '@ikarmic/forge-core';
|
|
2
|
+
/**
|
|
3
|
+
* OS-keychain-backed CredentialStore for the CLI. Uses the same
|
|
4
|
+
* service/account naming as the VS Code SecretStorage implementation
|
|
5
|
+
* so a key entered on one surface is visible on the other.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createKeyringCredentialStore(): CredentialStore;
|
|
8
|
+
//# sourceMappingURL=credential-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,4BAA4B,IAAI,eAAe,CA0B9D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Entry } from '@napi-rs/keyring';
|
|
2
|
+
import { CREDENTIAL_SERVICE_NAME, credentialAccountKey } from '@ikarmic/forge-core';
|
|
3
|
+
/**
|
|
4
|
+
* OS-keychain-backed CredentialStore for the CLI. Uses the same
|
|
5
|
+
* service/account naming as the VS Code SecretStorage implementation
|
|
6
|
+
* so a key entered on one surface is visible on the other.
|
|
7
|
+
*/
|
|
8
|
+
export function createKeyringCredentialStore() {
|
|
9
|
+
return {
|
|
10
|
+
async get(provider) {
|
|
11
|
+
try {
|
|
12
|
+
const entry = new Entry(CREDENTIAL_SERVICE_NAME, credentialAccountKey(provider));
|
|
13
|
+
return entry.getPassword() ?? undefined;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// OS keychain unavailable (e.g. headless Linux without libsecret):
|
|
17
|
+
// treat as "not set" rather than surfacing a low-level error.
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
async set(provider, key) {
|
|
22
|
+
const entry = new Entry(CREDENTIAL_SERVICE_NAME, credentialAccountKey(provider));
|
|
23
|
+
entry.setPassword(key);
|
|
24
|
+
},
|
|
25
|
+
async delete(provider) {
|
|
26
|
+
try {
|
|
27
|
+
const entry = new Entry(CREDENTIAL_SERVICE_NAME, credentialAccountKey(provider));
|
|
28
|
+
entry.deletePassword();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Already absent, or keychain unavailable: deleting a
|
|
32
|
+
// non-existent entry is a no-op either way.
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=credential-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGpF;;;;GAIG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,QAAQ;YAChB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjF,OAAO,KAAK,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,oEAAoE;gBACpE,8DAA8D;gBAC9D,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG;YACrB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjF,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,QAAQ;YACnB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjF,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;gBACtD,4CAA4C;YAC9C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ForgeCommit, GitCommitOptions, ModelConfig } from '@ikarmic/forge-core';
|
|
2
|
+
import type { CliOptions } from './options.js';
|
|
3
|
+
export interface GitWorkflow {
|
|
4
|
+
/** Call before the agent starts. Returns the commit that saved your own changes, if any. */
|
|
5
|
+
before(): Promise<ForgeCommit | null>;
|
|
6
|
+
/** Call after a completed run. Returns the commit holding the agent's changes, if any. */
|
|
7
|
+
after(task: string): Promise<ForgeCommit | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare function gitCommitOptions(options: Pick<CliOptions, 'noAttribute' | 'gitCommitVerify'>): GitCommitOptions;
|
|
10
|
+
/** Commit messages use the cheap model when one is configured, else the main model. */
|
|
11
|
+
export declare function resolveCommitModel(options: Pick<CliOptions, 'cheapModel'>, model: ModelConfig): Promise<ModelConfig>;
|
|
12
|
+
export declare function createGitWorkflow(options: Pick<CliOptions, 'autoCommit' | 'noDirtyCommits' | 'noAttribute' | 'gitCommitVerify' | 'cheapModel'> & {
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
}, cwd: string, model: ModelConfig): Promise<GitWorkflow | null>;
|
|
15
|
+
export declare function formatCommitLine(commit: ForgeCommit): string;
|
|
16
|
+
//# sourceMappingURL=git-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-workflow.d.ts","sourceRoot":"","sources":["../src/git-workflow.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,4FAA4F;IAC5F,MAAM,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtC,0FAA0F;IAC1F,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAClD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,iBAAiB,CAAC,GAAG,gBAAgB,CAE/G;AAED,uFAAuF;AACvF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAI1H;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,gBAAgB,GAAG,aAAa,GAAG,iBAAiB,GAAG,YAAY,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EACpI,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAe7B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAG5D"}
|