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.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -2
  3. package/dist/acp/server.d.ts +53 -0
  4. package/dist/acp/server.d.ts.map +1 -0
  5. package/dist/acp/server.js +235 -0
  6. package/dist/acp/server.js.map +1 -0
  7. package/dist/app.d.ts +22 -0
  8. package/dist/app.d.ts.map +1 -0
  9. package/dist/app.js +159 -0
  10. package/dist/app.js.map +1 -0
  11. package/dist/bin/forge.d.ts +3 -0
  12. package/dist/bin/forge.d.ts.map +1 -0
  13. package/dist/bin/forge.js +747 -0
  14. package/dist/bin/forge.js.map +1 -0
  15. package/dist/chat-files.d.ts +37 -0
  16. package/dist/chat-files.d.ts.map +1 -0
  17. package/dist/chat-files.js +152 -0
  18. package/dist/chat-files.js.map +1 -0
  19. package/dist/commands/acp.d.ts +4 -0
  20. package/dist/commands/acp.d.ts.map +1 -0
  21. package/dist/commands/acp.js +36 -0
  22. package/dist/commands/acp.js.map +1 -0
  23. package/dist/commands/ai-comments.d.ts +9 -0
  24. package/dist/commands/ai-comments.d.ts.map +1 -0
  25. package/dist/commands/ai-comments.js +43 -0
  26. package/dist/commands/ai-comments.js.map +1 -0
  27. package/dist/commands/architect.d.ts +9 -0
  28. package/dist/commands/architect.d.ts.map +1 -0
  29. package/dist/commands/architect.js +27 -0
  30. package/dist/commands/architect.js.map +1 -0
  31. package/dist/commands/checkpoint.d.ts +10 -0
  32. package/dist/commands/checkpoint.d.ts.map +1 -0
  33. package/dist/commands/checkpoint.js +168 -0
  34. package/dist/commands/checkpoint.js.map +1 -0
  35. package/dist/commands/config.d.ts +15 -0
  36. package/dist/commands/config.d.ts.map +1 -0
  37. package/dist/commands/config.js +180 -0
  38. package/dist/commands/config.js.map +1 -0
  39. package/dist/commands/diff.d.ts +29 -0
  40. package/dist/commands/diff.d.ts.map +1 -0
  41. package/dist/commands/diff.js +90 -0
  42. package/dist/commands/diff.js.map +1 -0
  43. package/dist/commands/hook.d.ts +10 -0
  44. package/dist/commands/hook.d.ts.map +1 -0
  45. package/dist/commands/hook.js +121 -0
  46. package/dist/commands/hook.js.map +1 -0
  47. package/dist/commands/mcp.d.ts +10 -0
  48. package/dist/commands/mcp.d.ts.map +1 -0
  49. package/dist/commands/mcp.js +110 -0
  50. package/dist/commands/mcp.js.map +1 -0
  51. package/dist/commands/orchestrator.d.ts +22 -0
  52. package/dist/commands/orchestrator.d.ts.map +1 -0
  53. package/dist/commands/orchestrator.js +113 -0
  54. package/dist/commands/orchestrator.js.map +1 -0
  55. package/dist/commands/plugin.d.ts +3 -0
  56. package/dist/commands/plugin.d.ts.map +1 -0
  57. package/dist/commands/plugin.js +62 -0
  58. package/dist/commands/plugin.js.map +1 -0
  59. package/dist/commands/policy.d.ts +2 -0
  60. package/dist/commands/policy.d.ts.map +1 -0
  61. package/dist/commands/policy.js +21 -0
  62. package/dist/commands/policy.js.map +1 -0
  63. package/dist/commands/skill.d.ts +13 -0
  64. package/dist/commands/skill.d.ts.map +1 -0
  65. package/dist/commands/skill.js +194 -0
  66. package/dist/commands/skill.js.map +1 -0
  67. package/dist/commands/spec.d.ts +13 -0
  68. package/dist/commands/spec.d.ts.map +1 -0
  69. package/dist/commands/spec.js +76 -0
  70. package/dist/commands/spec.js.map +1 -0
  71. package/dist/commands/watch.d.ts +15 -0
  72. package/dist/commands/watch.d.ts.map +1 -0
  73. package/dist/commands/watch.js +83 -0
  74. package/dist/commands/watch.js.map +1 -0
  75. package/dist/commands/worktree.d.ts +22 -0
  76. package/dist/commands/worktree.d.ts.map +1 -0
  77. package/dist/commands/worktree.js +187 -0
  78. package/dist/commands/worktree.js.map +1 -0
  79. package/dist/components/Approval.d.ts +9 -0
  80. package/dist/components/Approval.d.ts.map +1 -0
  81. package/dist/components/Approval.js +37 -0
  82. package/dist/components/Approval.js.map +1 -0
  83. package/dist/components/Footer.d.ts +22 -0
  84. package/dist/components/Footer.d.ts.map +1 -0
  85. package/dist/components/Footer.js +59 -0
  86. package/dist/components/Footer.js.map +1 -0
  87. package/dist/components/Header.d.ts +11 -0
  88. package/dist/components/Header.d.ts.map +1 -0
  89. package/dist/components/Header.js +23 -0
  90. package/dist/components/Header.js.map +1 -0
  91. package/dist/components/Spinner.d.ts +3 -0
  92. package/dist/components/Spinner.d.ts.map +1 -0
  93. package/dist/components/Spinner.js +8 -0
  94. package/dist/components/Spinner.js.map +1 -0
  95. package/dist/components/Stream.d.ts +10 -0
  96. package/dist/components/Stream.d.ts.map +1 -0
  97. package/dist/components/Stream.js +13 -0
  98. package/dist/components/Stream.js.map +1 -0
  99. package/dist/components/ToolEvent.d.ts +13 -0
  100. package/dist/components/ToolEvent.d.ts.map +1 -0
  101. package/dist/components/ToolEvent.js +54 -0
  102. package/dist/components/ToolEvent.js.map +1 -0
  103. package/dist/credential-store.d.ts +8 -0
  104. package/dist/credential-store.d.ts.map +1 -0
  105. package/dist/credential-store.js +37 -0
  106. package/dist/credential-store.js.map +1 -0
  107. package/dist/git-workflow.d.ts +16 -0
  108. package/dist/git-workflow.d.ts.map +1 -0
  109. package/dist/git-workflow.js +38 -0
  110. package/dist/git-workflow.js.map +1 -0
  111. package/dist/mcp-loader.d.ts +25 -0
  112. package/dist/mcp-loader.d.ts.map +1 -0
  113. package/dist/mcp-loader.js +99 -0
  114. package/dist/mcp-loader.js.map +1 -0
  115. package/dist/notify.d.ts +12 -0
  116. package/dist/notify.d.ts.map +1 -0
  117. package/dist/notify.js +47 -0
  118. package/dist/notify.js.map +1 -0
  119. package/dist/options.d.ts +407 -0
  120. package/dist/options.d.ts.map +1 -0
  121. package/dist/options.js +792 -0
  122. package/dist/options.js.map +1 -0
  123. package/dist/repl-commands.d.ts +53 -0
  124. package/dist/repl-commands.d.ts.map +1 -0
  125. package/dist/repl-commands.js +141 -0
  126. package/dist/repl-commands.js.map +1 -0
  127. package/dist/repl.d.ts +52 -0
  128. package/dist/repl.d.ts.map +1 -0
  129. package/dist/repl.js +1174 -0
  130. package/dist/repl.js.map +1 -0
  131. package/dist/runner.d.ts +64 -0
  132. package/dist/runner.d.ts.map +1 -0
  133. package/dist/runner.js +61 -0
  134. package/dist/runner.js.map +1 -0
  135. package/dist/session-checkpoints.d.ts +6 -0
  136. package/dist/session-checkpoints.d.ts.map +1 -0
  137. package/dist/session-checkpoints.js +25 -0
  138. package/dist/session-checkpoints.js.map +1 -0
  139. package/dist/specialists-loader.d.ts +22 -0
  140. package/dist/specialists-loader.d.ts.map +1 -0
  141. package/dist/specialists-loader.js +38 -0
  142. package/dist/specialists-loader.js.map +1 -0
  143. package/dist/tool-display.d.ts +19 -0
  144. package/dist/tool-display.d.ts.map +1 -0
  145. package/dist/tool-display.js +57 -0
  146. package/dist/tool-display.js.map +1 -0
  147. 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,3 @@
1
+ import React from 'react';
2
+ export declare function Spinner(): React.ReactElement;
3
+ //# sourceMappingURL=Spinner.d.ts.map
@@ -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"}