ikarmic-forge 0.0.0-stage → 4.4.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 +58 -2
- package/dist/acp/server.d.ts +53 -0
- package/dist/acp/server.d.ts.map +1 -0
- package/dist/acp/server.js +235 -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 +747 -0
- package/dist/bin/forge.js.map +1 -0
- package/dist/chat-files.d.ts +37 -0
- package/dist/chat-files.d.ts.map +1 -0
- package/dist/chat-files.js +152 -0
- package/dist/chat-files.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/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 +13 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +76 -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 +37 -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 +407 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +792 -0
- package/dist/options.js.map +1 -0
- package/dist/repl-commands.d.ts +53 -0
- package/dist/repl-commands.d.ts.map +1 -0
- package/dist/repl-commands.js +141 -0
- package/dist/repl-commands.js.map +1 -0
- package/dist/repl.d.ts +52 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +1174 -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,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge watch`: runs a filesystem watcher that dispatches FileChanged
|
|
3
|
+
* hook events independent of any active Agent.run(). Runs until
|
|
4
|
+
* SIGINT (Ctrl+C). No agent loop involved.
|
|
5
|
+
*
|
|
6
|
+
* Loads hooks config exactly the way toAgentConfig does elsewhere
|
|
7
|
+
* (loadHooksConfig -> new HooksBus). trustedProjectHooks is never set
|
|
8
|
+
* to true here, same as every other CLI call site: project-level
|
|
9
|
+
* FileChanged hooks stay blocked by default.
|
|
10
|
+
*/
|
|
11
|
+
import process from 'node:process';
|
|
12
|
+
import { createAiCommentHandler } from './ai-comments.js';
|
|
13
|
+
import { Agent, createAgentHookRunner, FileChangeCoalescer, HooksBus, loadHooksConfig, watchFilesystem, } from '@ikarmic/forge-core';
|
|
14
|
+
function hasAgentHooks(config) {
|
|
15
|
+
return Object.values(config).some((entries) => entries?.some((e) => e.hooks.some((h) => h.type === 'agent')));
|
|
16
|
+
}
|
|
17
|
+
export async function handleWatchCommand(cwd, resolveModel, watchOptions = {}) {
|
|
18
|
+
const { config, sources, warnings } = await loadHooksConfig(cwd);
|
|
19
|
+
for (const warning of warnings) {
|
|
20
|
+
process.stderr.write(`forge watch: warning: ${warning}\n`);
|
|
21
|
+
}
|
|
22
|
+
if (sources.length === 0) {
|
|
23
|
+
process.stdout.write('(no hooks configured: neither ~/.forge/settings.json nor .forge/settings.json exists; watching anyway, but nothing will run)\n');
|
|
24
|
+
}
|
|
25
|
+
// `type: 'agent'` hooks need a model. Resolve it only when one is configured, so a
|
|
26
|
+
// shell-only watch keeps working with no API key.
|
|
27
|
+
let agentRunner;
|
|
28
|
+
if (hasAgentHooks(config)) {
|
|
29
|
+
try {
|
|
30
|
+
if (!resolveModel)
|
|
31
|
+
throw new Error('no model resolver');
|
|
32
|
+
agentRunner = createAgentHookRunner({ model: resolveModel(), cwd });
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
process.stderr.write(`forge watch: agent hooks disabled: ${err.message}
|
|
36
|
+
`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const bus = new HooksBus(config, agentRunner ? { agentRunner } : {});
|
|
40
|
+
const coalescer = new FileChangeCoalescer((relPath, changeType) => {
|
|
41
|
+
void dispatchAndReport(bus, cwd, relPath, changeType);
|
|
42
|
+
});
|
|
43
|
+
const onAiComments = watchOptions.aiComments
|
|
44
|
+
? createAiCommentHandler({
|
|
45
|
+
cwd,
|
|
46
|
+
run: async (task, mode) => {
|
|
47
|
+
if (!resolveModel)
|
|
48
|
+
throw new Error('no model configured');
|
|
49
|
+
const agent = new Agent({
|
|
50
|
+
model: resolveModel(),
|
|
51
|
+
cwd,
|
|
52
|
+
auto: true,
|
|
53
|
+
...(mode === 'question' ? { planMode: true } : {}),
|
|
54
|
+
});
|
|
55
|
+
return (await agent.run({ task })).finalText;
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
: null;
|
|
59
|
+
const watcherHandle = watchFilesystem(cwd, (relPath, changeType) => {
|
|
60
|
+
coalescer.notify(relPath, changeType);
|
|
61
|
+
if (onAiComments && changeType !== 'deleted')
|
|
62
|
+
void onAiComments(relPath);
|
|
63
|
+
});
|
|
64
|
+
process.stdout.write(`forge watch: watching ${cwd}${watchOptions.aiComments ? ' for AI!/AI? comments' : ''} (Ctrl+C to stop)\n`);
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
const shutdown = () => {
|
|
67
|
+
coalescer.dispose();
|
|
68
|
+
void watcherHandle.close().then(() => {
|
|
69
|
+
process.stdout.write('\nforge watch: stopped\n');
|
|
70
|
+
resolve(130);
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
process.on('SIGINT', shutdown);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function dispatchAndReport(bus, cwd, relPath, changeType) {
|
|
77
|
+
const log = await bus.dispatch({ type: 'FileChanged', path: relPath, changeType, cwd });
|
|
78
|
+
const ranCount = log.results.length;
|
|
79
|
+
if (ranCount > 0) {
|
|
80
|
+
process.stdout.write(`[${changeType}] ${relPath} -> ${ranCount} hook${ranCount === 1 ? '' : 's'} run\n`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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 type { ParsedWorktreeCommand } from '../options.js';
|
|
21
|
+
export declare function handleWorktreeCommand(cmd: ParsedWorktreeCommand, cwd: string): Promise<number>;
|
|
22
|
+
//# sourceMappingURL=worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3D,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,qBAAqB,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
|
|
@@ -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,CAoDlF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
return (React.createElement(Box, { flexDirection: "column", marginTop: 1, borderStyle: "round", borderColor: "yellow", paddingX: 1 },
|
|
21
|
+
React.createElement(Box, null,
|
|
22
|
+
React.createElement(Text, { color: request.destructive ? 'red' : 'yellow', bold: true }, "\u26A0 approval required"),
|
|
23
|
+
React.createElement(Text, null, " \u00B7 "),
|
|
24
|
+
React.createElement(Text, { bold: true }, request.name),
|
|
25
|
+
request.destructive && (React.createElement(React.Fragment, null,
|
|
26
|
+
React.createElement(Text, null, " \u00B7 "),
|
|
27
|
+
React.createElement(Text, { color: "red", bold: true }, "destructive")))),
|
|
28
|
+
React.createElement(Box, { marginLeft: 2, marginTop: 1 },
|
|
29
|
+
React.createElement(Text, { color: "gray" }, argSummary)),
|
|
30
|
+
React.createElement(Box, { marginTop: 1 }, answered === null ? (React.createElement(Text, null,
|
|
31
|
+
"Allow? ",
|
|
32
|
+
React.createElement(Text, { color: "green", bold: true }, "Y"),
|
|
33
|
+
React.createElement(Text, null, "es / "),
|
|
34
|
+
React.createElement(Text, { color: "red", bold: true }, "N"),
|
|
35
|
+
React.createElement(Text, null, "o (esc)"))) : (React.createElement(Text, { color: answered === 'y' ? 'green' : 'red' }, answered === 'y' ? '✓ approved' : '✗ denied')))));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=Approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Approval.js","sourceRoot":"","sources":["../../src/components/Approval.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAa,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAU1C,MAAM,UAAU,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAiB;IAC5D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IAEjE,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7B,WAAW,CAAC,GAAG,CAAC,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;YAChF,WAAW,CAAC,GAAG,CAAC,CAAC;YACjB,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAE3F,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC;QAC5F,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,qCAElD;YACP,oBAAC,IAAI,mBAAW;YAChB,oBAAC,IAAI,IAAC,IAAI,UAAE,OAAO,CAAC,IAAI,CAAQ;YAC/B,OAAO,CAAC,WAAW,IAAI,CACtB;gBACE,oBAAC,IAAI,mBAAW;gBAChB,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,wBAAmB,CACxC,CACJ,CACG;QACN,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;YAC9B,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,IAAE,UAAU,CAAQ,CAClC;QACN,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,IACd,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CACnB,oBAAC,IAAI;;YACI,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,cAAS;YACxC,oBAAC,IAAI,gBAAa;YAClB,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,cAAS;YAC/B,oBAAC,IAAI,kBAAe,CACf,CACR,CAAC,CAAC,CAAC,CACF,oBAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAC5C,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CACxC,CACR,CACG,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|