@xortex/xcode 3.1.0 → 3.1.1

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 (52) hide show
  1. package/bin/xcode +1 -1
  2. package/entrypoints/cli.tsx +1 -1
  3. package/macro.ts +1 -1
  4. package/package.json +54 -1
  5. package/INSTALLATION.md +0 -285
  6. package/QUICKSTART.md +0 -151
  7. package/SYSTEM_PROMPT.md +0 -583
  8. package/SYSTEM_PROMPT_EXTRACTED.md +0 -1
  9. package/Untitled +0 -1
  10. package/bun.lock +0 -645
  11. package/costHook.ts +0 -22
  12. package/dialogLaunchers.tsx +0 -133
  13. package/extract_prompt.ts +0 -304
  14. package/inspect.js +0 -7
  15. package/install.sh +0 -221
  16. package/moreright/useMoreRight.tsx +0 -26
  17. package/native-ts/color-diff/index.ts +0 -999
  18. package/native-ts/file-index/index.ts +0 -370
  19. package/native-ts/yoga-layout/enums.ts +0 -134
  20. package/native-ts/yoga-layout/index.ts +0 -2578
  21. package/outputStyles/loadOutputStylesDir.ts +0 -98
  22. package/patch-box.js +0 -54
  23. package/patch-compact.js +0 -13
  24. package/patch-condensed-center.js +0 -13
  25. package/patch-condensed-row.js +0 -13
  26. package/patch-condensed.js +0 -13
  27. package/patch-final.js +0 -58
  28. package/patch-input-body.js +0 -46
  29. package/patch-input-body2.js +0 -35
  30. package/patch-input-style.js +0 -13
  31. package/patch-input-width.js +0 -13
  32. package/patch-layout.js +0 -87
  33. package/patch-logo-row.js +0 -12
  34. package/patch-width.js +0 -13
  35. package/patch-width2.js +0 -13
  36. package/patch2.js +0 -74
  37. package/patch3.js +0 -13
  38. package/plugins/builtinPlugins.ts +0 -159
  39. package/plugins/bundled/index.ts +0 -23
  40. package/projectOnboardingState.ts +0 -83
  41. package/public/claude-files.png +0 -0
  42. package/public/leak-tweet.png +0 -0
  43. package/replLauncher.tsx +0 -27
  44. package/server/createDirectConnectSession.ts +0 -88
  45. package/server/directConnectManager.ts +0 -213
  46. package/server/types.ts +0 -57
  47. package/stub_types.sh +0 -13
  48. package/vim/motions.ts +0 -82
  49. package/vim/operators.ts +0 -556
  50. package/vim/textObjects.ts +0 -186
  51. package/vim/transitions.ts +0 -490
  52. package/vim/types.ts +0 -199
package/costHook.ts DELETED
@@ -1,22 +0,0 @@
1
- import { useEffect } from 'react'
2
- import { formatTotalCost, saveCurrentSessionCosts } from './cost-tracker.js'
3
- import { hasConsoleBillingAccess } from './utils/billing.js'
4
- import type { FpsMetrics } from './utils/fpsTracker.js'
5
-
6
- export function useCostSummary(
7
- getFpsMetrics?: () => FpsMetrics | undefined,
8
- ): void {
9
- useEffect(() => {
10
- const f = () => {
11
- if (hasConsoleBillingAccess()) {
12
- process.stdout.write('\n' + formatTotalCost() + '\n')
13
- }
14
-
15
- saveCurrentSessionCosts(getFpsMetrics?.())
16
- }
17
- process.on('exit', f)
18
- return () => {
19
- process.off('exit', f)
20
- }
21
- }, [])
22
- }
@@ -1,133 +0,0 @@
1
- /**
2
- * Thin launchers for one-off dialog JSX sites in main.tsx.
3
- * Each launcher dynamically imports its component and wires the `done` callback
4
- * identically to the original inline call site. Zero behavior change.
5
- *
6
- * Part of the main.tsx React/JSX extraction effort. See sibling PRs
7
- * perf/extract-interactive-helpers and perf/launch-repl.
8
- */
9
- import React from 'react';
10
- import type { AssistantSession } from './assistant/sessionDiscovery.js';
11
- import type { StatsStore } from './context/stats.js';
12
- import type { Root } from './ink.js';
13
- import { renderAndRun, showSetupDialog } from './interactiveHelpers.js';
14
- import { KeybindingSetup } from './keybindings/KeybindingProviderSetup.js';
15
- import type { AppState } from './state/AppStateStore.js';
16
- import type { AgentMemoryScope } from './tools/AgentTool/agentMemory.js';
17
- import type { TeleportRemoteResponse } from './utils/conversationRecovery.js';
18
- import type { FpsMetrics } from './utils/fpsTracker.js';
19
- import type { ValidationError } from './utils/settings/validation.js';
20
-
21
- // Type-only access to ResumeConversation's Props via the module type.
22
- // No runtime cost - erased at compile time.
23
- type ResumeConversationProps = React.ComponentProps<typeof import('./screens/ResumeConversation.js').ResumeConversation>;
24
-
25
- /**
26
- * Site ~3173: SnapshotUpdateDialog (agent memory snapshot update prompt).
27
- * Original callback wiring: onComplete={done}, onCancel={() => done('keep')}.
28
- */
29
- export async function launchSnapshotUpdateDialog(root: Root, props: {
30
- agentType: string;
31
- scope: AgentMemoryScope;
32
- snapshotTimestamp: string;
33
- }): Promise<'merge' | 'keep' | 'replace'> {
34
- const {
35
- SnapshotUpdateDialog
36
- } = await import('./components/agents/SnapshotUpdateDialog.js');
37
- return showSetupDialog<'merge' | 'keep' | 'replace'>(root, done => <SnapshotUpdateDialog agentType={props.agentType} scope={props.scope} snapshotTimestamp={props.snapshotTimestamp} onComplete={done} onCancel={() => done('keep')} />);
38
- }
39
-
40
- /**
41
- * Site ~3250: InvalidSettingsDialog (settings validation errors).
42
- * Original callback wiring: onContinue={done}, onExit passed through from caller.
43
- */
44
- export async function launchInvalidSettingsDialog(root: Root, props: {
45
- settingsErrors: ValidationError[];
46
- onExit: () => void;
47
- }): Promise<void> {
48
- const {
49
- InvalidSettingsDialog
50
- } = await import('./components/InvalidSettingsDialog.js');
51
- return showSetupDialog(root, done => <InvalidSettingsDialog settingsErrors={props.settingsErrors} onContinue={done} onExit={props.onExit} />);
52
- }
53
-
54
- /**
55
- * Site ~4229: AssistantSessionChooser (pick a bridge session to attach to).
56
- * Original callback wiring: onSelect={id => done(id)}, onCancel={() => done(null)}.
57
- */
58
- export async function launchAssistantSessionChooser(root: Root, props: {
59
- sessions: AssistantSession[];
60
- }): Promise<string | null> {
61
- const {
62
- AssistantSessionChooser
63
- } = await import('./assistant/AssistantSessionChooser.js');
64
- return showSetupDialog<string | null>(root, done => <AssistantSessionChooser sessions={props.sessions} onSelect={id => done(id)} onCancel={() => done(null)} />);
65
- }
66
-
67
- /**
68
- * `claude assistant` found zero sessions — show the same install wizard
69
- * as `/assistant` when daemon.json is empty. Resolves to the installed dir on
70
- * success, null on cancel. Rejects on install failure so the caller can
71
- * distinguish errors from user cancellation.
72
- */
73
- export async function launchAssistantInstallWizard(root: Root): Promise<string | null> {
74
- const {
75
- NewInstallWizard,
76
- computeDefaultInstallDir
77
- } = await import('./commands/assistant/assistant.js');
78
- const defaultDir = await computeDefaultInstallDir();
79
- let rejectWithError: (reason: Error) => void;
80
- const errorPromise = new Promise<never>((_, reject) => {
81
- rejectWithError = reject;
82
- });
83
- const resultPromise = showSetupDialog<string | null>(root, done => <NewInstallWizard defaultDir={defaultDir} onInstalled={dir => done(dir)} onCancel={() => done(null)} onError={message => rejectWithError(new Error(`Installation failed: ${message}`))} />);
84
- return Promise.race([resultPromise, errorPromise]);
85
- }
86
-
87
- /**
88
- * Site ~4549: TeleportResumeWrapper (interactive teleport session picker).
89
- * Original callback wiring: onComplete={done}, onCancel={() => done(null)}, source="cliArg".
90
- */
91
- export async function launchTeleportResumeWrapper(root: Root): Promise<TeleportRemoteResponse | null> {
92
- const {
93
- TeleportResumeWrapper
94
- } = await import('./components/TeleportResumeWrapper.js');
95
- return showSetupDialog<TeleportRemoteResponse | null>(root, done => <TeleportResumeWrapper onComplete={done} onCancel={() => done(null)} source="cliArg" />);
96
- }
97
-
98
- /**
99
- * Site ~4597: TeleportRepoMismatchDialog (pick a local checkout of the target repo).
100
- * Original callback wiring: onSelectPath={done}, onCancel={() => done(null)}.
101
- */
102
- export async function launchTeleportRepoMismatchDialog(root: Root, props: {
103
- targetRepo: string;
104
- initialPaths: string[];
105
- }): Promise<string | null> {
106
- const {
107
- TeleportRepoMismatchDialog
108
- } = await import('./components/TeleportRepoMismatchDialog.js');
109
- return showSetupDialog<string | null>(root, done => <TeleportRepoMismatchDialog targetRepo={props.targetRepo} initialPaths={props.initialPaths} onSelectPath={done} onCancel={() => done(null)} />);
110
- }
111
-
112
- /**
113
- * Site ~4903: ResumeConversation mount (interactive session picker).
114
- * Uses renderAndRun, NOT showSetupDialog. Wraps in <App><KeybindingSetup>.
115
- * Preserves original Promise.all parallelism between getWorktreePaths and imports.
116
- */
117
- export async function launchResumeChooser(root: Root, appProps: {
118
- getFpsMetrics: () => FpsMetrics | undefined;
119
- stats: StatsStore;
120
- initialState: AppState;
121
- }, worktreePathsPromise: Promise<string[]>, resumeProps: Omit<ResumeConversationProps, 'worktreePaths'>): Promise<void> {
122
- const [worktreePaths, {
123
- ResumeConversation
124
- }, {
125
- App
126
- }] = await Promise.all([worktreePathsPromise, import('./screens/ResumeConversation.js'), import('./components/App.js')]);
127
- await renderAndRun(root, <App getFpsMetrics={appProps.getFpsMetrics} stats={appProps.stats} initialState={appProps.initialState}>
128
- <KeybindingSetup>
129
- <ResumeConversation {...resumeProps} worktreePaths={worktreePaths} />
130
- </KeybindingSetup>
131
- </App>);
132
- }
133
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkFzc2lzdGFudFNlc3Npb24iLCJTdGF0c1N0b3JlIiwiUm9vdCIsInJlbmRlckFuZFJ1biIsInNob3dTZXR1cERpYWxvZyIsIktleWJpbmRpbmdTZXR1cCIsIkFwcFN0YXRlIiwiQWdlbnRNZW1vcnlTY29wZSIsIlRlbGVwb3J0UmVtb3RlUmVzcG9uc2UiLCJGcHNNZXRyaWNzIiwiVmFsaWRhdGlvbkVycm9yIiwiUmVzdW1lQ29udmVyc2F0aW9uUHJvcHMiLCJDb21wb25lbnRQcm9wcyIsIlJlc3VtZUNvbnZlcnNhdGlvbiIsImxhdW5jaFNuYXBzaG90VXBkYXRlRGlhbG9nIiwicm9vdCIsInByb3BzIiwiYWdlbnRUeXBlIiwic2NvcGUiLCJzbmFwc2hvdFRpbWVzdGFtcCIsIlByb21pc2UiLCJTbmFwc2hvdFVwZGF0ZURpYWxvZyIsImRvbmUiLCJsYXVuY2hJbnZhbGlkU2V0dGluZ3NEaWFsb2ciLCJzZXR0aW5nc0Vycm9ycyIsIm9uRXhpdCIsIkludmFsaWRTZXR0aW5nc0RpYWxvZyIsImxhdW5jaEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIiwic2Vzc2lvbnMiLCJBc3Npc3RhbnRTZXNzaW9uQ2hvb3NlciIsImlkIiwibGF1bmNoQXNzaXN0YW50SW5zdGFsbFdpemFyZCIsIk5ld0luc3RhbGxXaXphcmQiLCJjb21wdXRlRGVmYXVsdEluc3RhbGxEaXIiLCJkZWZhdWx0RGlyIiwicmVqZWN0V2l0aEVycm9yIiwicmVhc29uIiwiRXJyb3IiLCJlcnJvclByb21pc2UiLCJfIiwicmVqZWN0IiwicmVzdWx0UHJvbWlzZSIsImRpciIsIm1lc3NhZ2UiLCJyYWNlIiwibGF1bmNoVGVsZXBvcnRSZXN1bWVXcmFwcGVyIiwiVGVsZXBvcnRSZXN1bWVXcmFwcGVyIiwibGF1bmNoVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2ciLCJ0YXJnZXRSZXBvIiwiaW5pdGlhbFBhdGhzIiwiVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2ciLCJsYXVuY2hSZXN1bWVDaG9vc2VyIiwiYXBwUHJvcHMiLCJnZXRGcHNNZXRyaWNzIiwic3RhdHMiLCJpbml0aWFsU3RhdGUiLCJ3b3JrdHJlZVBhdGhzUHJvbWlzZSIsInJlc3VtZVByb3BzIiwiT21pdCIsIndvcmt0cmVlUGF0aHMiLCJBcHAiLCJhbGwiXSwic291cmNlcyI6WyJkaWFsb2dMYXVuY2hlcnMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbiBsYXVuY2hlcnMgZm9yIG9uZS1vZmYgZGlhbG9nIEpTWCBzaXRlcyBpbiBtYWluLnRzeC5cbiAqIEVhY2ggbGF1bmNoZXIgZHluYW1pY2FsbHkgaW1wb3J0cyBpdHMgY29tcG9uZW50IGFuZCB3aXJlcyB0aGUgYGRvbmVgIGNhbGxiYWNrXG4gKiBpZGVudGljYWxseSB0byB0aGUgb3JpZ2luYWwgaW5saW5lIGNhbGwgc2l0ZS4gWmVybyBiZWhhdmlvciBjaGFuZ2UuXG4gKlxuICogUGFydCBvZiB0aGUgbWFpbi50c3ggUmVhY3QvSlNYIGV4dHJhY3Rpb24gZWZmb3J0LiBTZWUgc2libGluZyBQUnNcbiAqIHBlcmYvZXh0cmFjdC1pbnRlcmFjdGl2ZS1oZWxwZXJzIGFuZCBwZXJmL2xhdW5jaC1yZXBsLlxuICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IEFzc2lzdGFudFNlc3Npb24gfSBmcm9tICcuL2Fzc2lzdGFudC9zZXNzaW9uRGlzY292ZXJ5LmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0c1N0b3JlIH0gZnJvbSAnLi9jb250ZXh0L3N0YXRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBSb290IH0gZnJvbSAnLi9pbmsuanMnXG5pbXBvcnQgeyByZW5kZXJBbmRSdW4sIHNob3dTZXR1cERpYWxvZyB9IGZyb20gJy4vaW50ZXJhY3RpdmVIZWxwZXJzLmpzJ1xuaW1wb3J0IHsgS2V5YmluZGluZ1NldHVwIH0gZnJvbSAnLi9rZXliaW5kaW5ncy9LZXliaW5kaW5nUHJvdmlkZXJTZXR1cC5qcydcbmltcG9ydCB0eXBlIHsgQXBwU3RhdGUgfSBmcm9tICcuL3N0YXRlL0FwcFN0YXRlU3RvcmUuanMnXG5pbXBvcnQgdHlwZSB7IEFnZW50TWVtb3J5U2NvcGUgfSBmcm9tICcuL3Rvb2xzL0FnZW50VG9vbC9hZ2VudE1lbW9yeS5qcydcbmltcG9ydCB0eXBlIHsgVGVsZXBvcnRSZW1vdGVSZXNwb25zZSB9IGZyb20gJy4vdXRpbHMvY29udmVyc2F0aW9uUmVjb3ZlcnkuanMnXG5pbXBvcnQgdHlwZSB7IEZwc01ldHJpY3MgfSBmcm9tICcuL3V0aWxzL2Zwc1RyYWNrZXIuanMnXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vdXRpbHMvc2V0dGluZ3MvdmFsaWRhdGlvbi5qcydcblxuLy8gVHlwZS1vbmx5IGFjY2VzcyB0byBSZXN1bWVDb252ZXJzYXRpb24ncyBQcm9wcyB2aWEgdGhlIG1vZHVsZSB0eXBlLlxuLy8gTm8gcnVudGltZSBjb3N0IC0gZXJhc2VkIGF0IGNvbXBpbGUgdGltZS5cbnR5cGUgUmVzdW1lQ29udmVyc2F0aW9uUHJvcHMgPSBSZWFjdC5Db21wb25lbnRQcm9wczxcbiAgdHlwZW9mIGltcG9ydCgnLi9zY3JlZW5zL1Jlc3VtZUNvbnZlcnNhdGlvbi5qcycpLlJlc3VtZUNvbnZlcnNhdGlvblxuPlxuXG4vKipcbiAqIFNpdGUgfjMxNzM6IFNuYXBzaG90VXBkYXRlRGlhbG9nIChhZ2VudCBtZW1vcnkgc25hcHNob3QgdXBkYXRlIHByb21wdCkuXG4gKiBPcmlnaW5hbCBjYWxsYmFjayB3aXJpbmc6IG9uQ29tcGxldGU9e2RvbmV9LCBvbkNhbmNlbD17KCkgPT4gZG9uZSgna2VlcCcpfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFNuYXBzaG90VXBkYXRlRGlhbG9nKFxuICByb290OiBSb290LFxuICBwcm9wczoge1xuICAgIGFnZW50VHlwZTogc3RyaW5nXG4gICAgc2NvcGU6IEFnZW50TWVtb3J5U2NvcGVcbiAgICBzbmFwc2hvdFRpbWVzdGFtcDogc3RyaW5nXG4gIH0sXG4pOiBQcm9taXNlPCdtZXJnZScgfCAna2VlcCcgfCAncmVwbGFjZSc+IHtcbiAgY29uc3QgeyBTbmFwc2hvdFVwZGF0ZURpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL2NvbXBvbmVudHMvYWdlbnRzL1NuYXBzaG90VXBkYXRlRGlhbG9nLmpzJ1xuICApXG4gIHJldHVybiBzaG93U2V0dXBEaWFsb2c8J21lcmdlJyB8ICdrZWVwJyB8ICdyZXBsYWNlJz4ocm9vdCwgZG9uZSA9PiAoXG4gICAgPFNuYXBzaG90VXBkYXRlRGlhbG9nXG4gICAgICBhZ2VudFR5cGU9e3Byb3BzLmFnZW50VHlwZX1cbiAgICAgIHNjb3BlPXtwcm9wcy5zY29wZX1cbiAgICAgIHNuYXBzaG90VGltZXN0YW1wPXtwcm9wcy5zbmFwc2hvdFRpbWVzdGFtcH1cbiAgICAgIG9uQ29tcGxldGU9e2RvbmV9XG4gICAgICBvbkNhbmNlbD17KCkgPT4gZG9uZSgna2VlcCcpfVxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+MzI1MDogSW52YWxpZFNldHRpbmdzRGlhbG9nIChzZXR0aW5ncyB2YWxpZGF0aW9uIGVycm9ycykuXG4gKiBPcmlnaW5hbCBjYWxsYmFjayB3aXJpbmc6IG9uQ29udGludWU9e2RvbmV9LCBvbkV4aXQgcGFzc2VkIHRocm91Z2ggZnJvbSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hJbnZhbGlkU2V0dGluZ3NEaWFsb2coXG4gIHJvb3Q6IFJvb3QsXG4gIHByb3BzOiB7XG4gICAgc2V0dGluZ3NFcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdXG4gICAgb25FeGl0OiAoKSA9PiB2b2lkXG4gIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBJbnZhbGlkU2V0dGluZ3NEaWFsb2cgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi9jb21wb25lbnRzL0ludmFsaWRTZXR0aW5nc0RpYWxvZy5qcydcbiAgKVxuICByZXR1cm4gc2hvd1NldHVwRGlhbG9nKHJvb3QsIGRvbmUgPT4gKFxuICAgIDxJbnZhbGlkU2V0dGluZ3NEaWFsb2dcbiAgICAgIHNldHRpbmdzRXJyb3JzPXtwcm9wcy5zZXR0aW5nc0Vycm9yc31cbiAgICAgIG9uQ29udGludWU9e2RvbmV9XG4gICAgICBvbkV4aXQ9e3Byb3BzLm9uRXhpdH1cbiAgICAvPlxuICApKVxufVxuXG4vKipcbiAqIFNpdGUgfjQyMjk6IEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIChwaWNrIGEgYnJpZGdlIHNlc3Npb24gdG8gYXR0YWNoIHRvKS5cbiAqIE9yaWdpbmFsIGNhbGxiYWNrIHdpcmluZzogb25TZWxlY3Q9e2lkID0+IGRvbmUoaWQpfSwgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXNzaXN0YW50U2Vzc2lvbkNob29zZXIoXG4gIHJvb3Q6IFJvb3QsXG4gIHByb3BzOiB7IHNlc3Npb25zOiBBc3Npc3RhbnRTZXNzaW9uW10gfSxcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCB7IEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJy4vYXNzaXN0YW50L0Fzc2lzdGFudFNlc3Npb25DaG9vc2VyLmpzJ1xuICApXG4gIHJldHVybiBzaG93U2V0dXBEaWFsb2c8c3RyaW5nIHwgbnVsbD4ocm9vdCwgZG9uZSA9PiAoXG4gICAgPEFzc2lzdGFudFNlc3Npb25DaG9vc2VyXG4gICAgICBzZXNzaW9ucz17cHJvcHMuc2Vzc2lvbnN9XG4gICAgICBvblNlbGVjdD17aWQgPT4gZG9uZShpZCl9XG4gICAgICBvbkNhbmNlbD17KCkgPT4gZG9uZShudWxsKX1cbiAgICAvPlxuICApKVxufVxuXG4vKipcbiAqIGBjbGF1ZGUgYXNzaXN0YW50YCBmb3VuZCB6ZXJvIHNlc3Npb25zIOKAlCBzaG93IHRoZSBzYW1lIGluc3RhbGwgd2l6YXJkXG4gKiBhcyBgL2Fzc2lzdGFudGAgd2hlbiBkYWVtb24uanNvbiBpcyBlbXB0eS4gUmVzb2x2ZXMgdG8gdGhlIGluc3RhbGxlZCBkaXIgb25cbiAqIHN1Y2Nlc3MsIG51bGwgb24gY2FuY2VsLiBSZWplY3RzIG9uIGluc3RhbGwgZmFpbHVyZSBzbyB0aGUgY2FsbGVyIGNhblxuICogZGlzdGluZ3Vpc2ggZXJyb3JzIGZyb20gdXNlciBjYW5jZWxsYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hBc3Npc3RhbnRJbnN0YWxsV2l6YXJkKFxuICByb290OiBSb290LFxuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHsgTmV3SW5zdGFsbFdpemFyZCwgY29tcHV0ZURlZmF1bHRJbnN0YWxsRGlyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJy4vY29tbWFuZHMvYXNzaXN0YW50L2Fzc2lzdGFudC5qcydcbiAgKVxuICBjb25zdCBkZWZhdWx0RGlyID0gYXdhaXQgY29tcHV0ZURlZmF1bHRJbnN0YWxsRGlyKClcbiAgbGV0IHJlamVjdFdpdGhFcnJvcjogKHJlYXNvbjogRXJyb3IpID0+IHZvaWRcbiAgY29uc3QgZXJyb3JQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICByZWplY3RXaXRoRXJyb3IgPSByZWplY3RcbiAgfSlcbiAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHNob3dTZXR1cERpYWxvZzxzdHJpbmcgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8TmV3SW5zdGFsbFdpemFyZFxuICAgICAgZGVmYXVsdERpcj17ZGVmYXVsdERpcn1cbiAgICAgIG9uSW5zdGFsbGVkPXtkaXIgPT4gZG9uZShkaXIpfVxuICAgICAgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9XG4gICAgICBvbkVycm9yPXttZXNzYWdlID0+XG4gICAgICAgIHJlamVjdFdpdGhFcnJvcihuZXcgRXJyb3IoYEluc3RhbGxhdGlvbiBmYWlsZWQ6ICR7bWVzc2FnZX1gKSlcbiAgICAgIH1cbiAgICAvPlxuICApKVxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXN1bHRQcm9taXNlLCBlcnJvclByb21pc2VdKVxufVxuXG4vKipcbiAqIFNpdGUgfjQ1NDk6IFRlbGVwb3J0UmVzdW1lV3JhcHBlciAoaW50ZXJhY3RpdmUgdGVsZXBvcnQgc2Vzc2lvbiBwaWNrZXIpLlxuICogT3JpZ2luYWwgY2FsbGJhY2sgd2lyaW5nOiBvbkNvbXBsZXRlPXtkb25lfSwgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9LCBzb3VyY2U9XCJjbGlBcmdcIi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFRlbGVwb3J0UmVzdW1lV3JhcHBlcihcbiAgcm9vdDogUm9vdCxcbik6IFByb21pc2U8VGVsZXBvcnRSZW1vdGVSZXNwb25zZSB8IG51bGw+IHtcbiAgY29uc3QgeyBUZWxlcG9ydFJlc3VtZVdyYXBwZXIgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi9jb21wb25lbnRzL1RlbGVwb3J0UmVzdW1lV3JhcHBlci5qcydcbiAgKVxuICByZXR1cm4gc2hvd1NldHVwRGlhbG9nPFRlbGVwb3J0UmVtb3RlUmVzcG9uc2UgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8VGVsZXBvcnRSZXN1bWVXcmFwcGVyXG4gICAgICBvbkNvbXBsZXRlPXtkb25lfVxuICAgICAgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9XG4gICAgICBzb3VyY2U9XCJjbGlBcmdcIlxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+NDU5NzogVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2cgKHBpY2sgYSBsb2NhbCBjaGVja291dCBvZiB0aGUgdGFyZ2V0IHJlcG8pLlxuICogT3JpZ2luYWwgY2FsbGJhY2sgd2lyaW5nOiBvblNlbGVjdFBhdGg9e2RvbmV9LCBvbkNhbmNlbD17KCkgPT4gZG9uZShudWxsKX0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hUZWxlcG9ydFJlcG9NaXNtYXRjaERpYWxvZyhcbiAgcm9vdDogUm9vdCxcbiAgcHJvcHM6IHtcbiAgICB0YXJnZXRSZXBvOiBzdHJpbmdcbiAgICBpbml0aWFsUGF0aHM6IHN0cmluZ1tdXG4gIH0sXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgeyBUZWxlcG9ydFJlcG9NaXNtYXRjaERpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL2NvbXBvbmVudHMvVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2cuanMnXG4gIClcbiAgcmV0dXJuIHNob3dTZXR1cERpYWxvZzxzdHJpbmcgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8VGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2dcbiAgICAgIHRhcmdldFJlcG89e3Byb3BzLnRhcmdldFJlcG99XG4gICAgICBpbml0aWFsUGF0aHM9e3Byb3BzLmluaXRpYWxQYXRoc31cbiAgICAgIG9uU2VsZWN0UGF0aD17ZG9uZX1cbiAgICAgIG9uQ2FuY2VsPXsoKSA9PiBkb25lKG51bGwpfVxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+NDkwMzogUmVzdW1lQ29udmVyc2F0aW9uIG1vdW50IChpbnRlcmFjdGl2ZSBzZXNzaW9uIHBpY2tlcikuXG4gKiBVc2VzIHJlbmRlckFuZFJ1biwgTk9UIHNob3dTZXR1cERpYWxvZy4gV3JhcHMgaW4gPEFwcD48S2V5YmluZGluZ1NldHVwPi5cbiAqIFByZXNlcnZlcyBvcmlnaW5hbCBQcm9taXNlLmFsbCBwYXJhbGxlbGlzbSBiZXR3ZWVuIGdldFdvcmt0cmVlUGF0aHMgYW5kIGltcG9ydHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hSZXN1bWVDaG9vc2VyKFxuICByb290OiBSb290LFxuICBhcHBQcm9wczoge1xuICAgIGdldEZwc01ldHJpY3M6ICgpID0+IEZwc01ldHJpY3MgfCB1bmRlZmluZWRcbiAgICBzdGF0czogU3RhdHNTdG9yZVxuICAgIGluaXRpYWxTdGF0ZTogQXBwU3RhdGVcbiAgfSxcbiAgd29ya3RyZWVQYXRoc1Byb21pc2U6IFByb21pc2U8c3RyaW5nW10+LFxuICByZXN1bWVQcm9wczogT21pdDxSZXN1bWVDb252ZXJzYXRpb25Qcm9wcywgJ3dvcmt0cmVlUGF0aHMnPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbd29ya3RyZWVQYXRocywgeyBSZXN1bWVDb252ZXJzYXRpb24gfSwgeyBBcHAgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgd29ya3RyZWVQYXRoc1Byb21pc2UsXG4gICAgaW1wb3J0KCcuL3NjcmVlbnMvUmVzdW1lQ29udmVyc2F0aW9uLmpzJyksXG4gICAgaW1wb3J0KCcuL2NvbXBvbmVudHMvQXBwLmpzJyksXG4gIF0pXG4gIGF3YWl0IHJlbmRlckFuZFJ1bihcbiAgICByb290LFxuICAgIDxBcHBcbiAgICAgIGdldEZwc01ldHJpY3M9e2FwcFByb3BzLmdldEZwc01ldHJpY3N9XG4gICAgICBzdGF0cz17YXBwUHJvcHMuc3RhdHN9XG4gICAgICBpbml0aWFsU3RhdGU9e2FwcFByb3BzLmluaXRpYWxTdGF0ZX1cbiAgICA+XG4gICAgICA8S2V5YmluZGluZ1NldHVwPlxuICAgICAgICA8UmVzdW1lQ29udmVyc2F0aW9uIHsuLi5yZXN1bWVQcm9wc30gd29ya3RyZWVQYXRocz17d29ya3RyZWVQYXRoc30gLz5cbiAgICAgIDwvS2V5YmluZGluZ1NldHVwPlxuICAgIDwvQXBwPixcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsY0FBY0MsZ0JBQWdCLFFBQVEsaUNBQWlDO0FBQ3ZFLGNBQWNDLFVBQVUsUUFBUSxvQkFBb0I7QUFDcEQsY0FBY0MsSUFBSSxRQUFRLFVBQVU7QUFDcEMsU0FBU0MsWUFBWSxFQUFFQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3ZFLFNBQVNDLGVBQWUsUUFBUSwwQ0FBMEM7QUFDMUUsY0FB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
package/extract_prompt.ts DELETED
@@ -1,304 +0,0 @@
1
- /**
2
- * extract_prompt.ts
3
- * Extracts and prints the real Claude Code system prompt by directly
4
- * reading and evaluating all prompt-generating functions from source.
5
- * Run with: bun extract_prompt.ts
6
- */
7
-
8
- // ── Mock bun:bundle feature() macro (always returns false for clean external build) ──
9
- // We patch this before any module loads it
10
- const Module = require('module')
11
- const originalLoad = Module._load
12
- Module._load = function (request: string, ...args: unknown[]) {
13
- if (request === 'bun:bundle') {
14
- return { feature: (_: string) => false }
15
- }
16
- return originalLoad.call(this, request, ...args)
17
- }
18
-
19
- // ── Read raw source file and extract string content from template literals ──
20
- import { readFileSync } from 'fs'
21
- import { join } from 'path'
22
-
23
- const ROOT = import.meta.dir
24
-
25
- function readSource(rel: string): string {
26
- return readFileSync(join(ROOT, rel), 'utf-8')
27
- }
28
-
29
- // Extract all backtick template literal bodies from a function by name
30
- function extractTemplateLiterals(src: string): string[] {
31
- const results: string[] = []
32
- let i = 0
33
- while (i < src.length) {
34
- if (src[i] === '`') {
35
- let j = i + 1
36
- let body = ''
37
- while (j < src.length) {
38
- if (src[j] === '\\') { body += src[j] + src[j+1]; j += 2; continue }
39
- if (src[j] === '`') break
40
- body += src[j]
41
- j++
42
- }
43
- results.push(body)
44
- i = j + 1
45
- } else {
46
- i++
47
- }
48
- }
49
- return results
50
- }
51
-
52
- // ── Extract sections from prompts.ts ────────────────────────────────────────
53
-
54
- const promptsSrc = readSource('constants/prompts.ts')
55
- const systemSrc = readSource('constants/system.ts')
56
- const coordSrc = readSource('coordinator/coordinatorMode.ts')
57
- const cyberSrc = readSource('constants/cyberRiskInstruction.ts')
58
-
59
- // Pull CYBER_RISK_INSTRUCTION
60
- const cyberMatch = cyberSrc.match(/CYBER_RISK_INSTRUCTION\s*=\s*`([^`]+)`/)
61
- const CYBER_RISK = cyberMatch?.[1] ?? '[cyber risk instruction not found]'
62
-
63
- // Pull coordinator system prompt (between the return template literal)
64
- const coordMatch = coordSrc.match(/return\s*`(You are Claude Code, an AI assistant[\s\S]+?)`\s*\}/)
65
- const COORDINATOR_PROMPT = coordMatch?.[1] ?? '[coordinator prompt not found]'
66
-
67
- // Helper: extract named function body
68
- function getFunctionBody(src: string, fnName: string): string {
69
- const idx = src.indexOf(`function ${fnName}(`)
70
- if (idx === -1) return `[${fnName} not found]`
71
- let depth = 0
72
- let start = -1
73
- for (let i = idx; i < src.length; i++) {
74
- if (src[i] === '{') { if (start === -1) start = i; depth++ }
75
- else if (src[i] === '}') { depth--; if (depth === 0) return src.slice(start, i+1) }
76
- }
77
- return `[${fnName} body unterminated]`
78
- }
79
-
80
- // Extract all return template strings from a function
81
- function getReturnStrings(fnBody: string): string[] {
82
- // Find return `...` blocks
83
- const results: string[] = []
84
- const matches = fnBody.matchAll(/return\s*`([\s\S]*?)`/g)
85
- for (const m of matches) results.push(m[1])
86
- return results
87
- }
88
-
89
- // ── Manually inline relevant prompt section text ─────────────────────────────
90
-
91
- // 1. getSimpleIntroSection
92
- const introFn = getFunctionBody(promptsSrc, 'getSimpleIntroSection')
93
- const introStr = getReturnStrings(introFn)
94
-
95
- // 2. getSimpleSystemSection
96
- const sysFn = getFunctionBody(promptsSrc, 'getSimpleSystemSection')
97
-
98
- // 3. getSimpleDoingTasksSection
99
- const doingFn = getFunctionBody(promptsSrc, 'getSimpleDoingTasksSection')
100
-
101
- // 4. getActionsSection
102
- const actionsFn = getFunctionBody(promptsSrc, 'getActionsSection')
103
- const actionsStr = getReturnStrings(actionsFn)
104
-
105
- // 5. getOutputEfficiencySection
106
- const effFn = getFunctionBody(promptsSrc, 'getOutputEfficiencySection')
107
- const effStrings = getReturnStrings(effFn)
108
-
109
- // 6. computeSimpleEnvInfo - template
110
- const envFn = getFunctionBody(promptsSrc, 'computeSimpleEnvInfo')
111
- const envTemplate = getReturnStrings(envFn)
112
-
113
- // 7. getScratchpadInstructions
114
- const scratchFn = getFunctionBody(promptsSrc, 'getScratchpadInstructions')
115
- const scratchStr = getReturnStrings(scratchFn)
116
-
117
- // 8. DEFAULT_AGENT_PROMPT
118
- const agentMatch = promptsSrc.match(/DEFAULT_AGENT_PROMPT\s*=\s*`([^`]+)`/)
119
- const DEFAULT_AGENT_PROMPT = agentMatch?.[1] ?? '[not found]'
120
-
121
- // 9. SUMMARIZE_TOOL_RESULTS_SECTION
122
- const sumMatch = promptsSrc.match(/SUMMARIZE_TOOL_RESULTS_SECTION\s*=\s*`([^`]+)`/)
123
- const SUMMARIZE = sumMatch?.[1] ?? '[not found]'
124
-
125
- // 10. getSystemRemindersSection
126
- const remMatch = promptsSrc.match(/function getSystemRemindersSection[\s\S]*?return\s*`([\s\S]*?)`/)
127
- const SYSTEM_REMINDERS = remMatch?.[1] ?? '[not found]'
128
-
129
- // 11. getHooksSection
130
- const hooksMatch = promptsSrc.match(/function getHooksSection[\s\S]*?return\s*`([\s\S]*?)`/)
131
- const HOOKS = hooksMatch?.[1] ?? '[not found]'
132
-
133
- // 12. getFunctionResultClearingSection template
134
- const frcMatch = promptsSrc.match(/return\s*`# Function Result Clearing[\s\S]*?`/)
135
- const FRC = frcMatch?.[0]?.replace(/^return\s*`/, '').replace(/`$/, '') ?? '[not found]'
136
-
137
- // 13. Token budget section
138
- const tokenMatch = promptsSrc.match(/'token_budget',\s*\(\)\s*=>\s*'([\s\S]*?)',/)
139
- const TOKEN_BUDGET = tokenMatch?.[1] ?? '[not found]'
140
-
141
- // 14. Proactive section
142
- const proactiveFn = getFunctionBody(promptsSrc, 'getProactiveSection')
143
- const proactiveStr = getReturnStrings(proactiveFn)
144
-
145
- // 15. getSimpleToneAndStyleSection items
146
- const toneFn = getFunctionBody(promptsSrc, 'getSimpleToneAndStyleSection')
147
-
148
- // 16. getMcpInstructions template
149
- const mcpMatch = promptsSrc.match(/return\s*`# MCP Server Instructions[\s\S]*?`/)
150
- const MCP_TEMPLATE = mcpMatch?.[0]?.replace(/^return\s*`/, '').replace(/`$/, '') ?? '[not found]'
151
-
152
- // ── Build and print the full prompt ──────────────────────────────────────────
153
-
154
- const HR = '\n' + '='.repeat(80) + '\n'
155
- const output: string[] = []
156
-
157
- output.push(`# CLAUDE CODE — REAL SYSTEM PROMPT (Extracted from Source)`)
158
- output.push(`Generated by extract_prompt.ts — reads directly from constants/prompts.ts\n`)
159
-
160
- output.push(HR)
161
- output.push(`## SECTION 0 — IDENTITY PREFIX`)
162
- output.push(`\`\`\``)
163
- output.push(`You are Claude Code, Anthropic's official CLI for Claude.`)
164
- output.push(`\`\`\``)
165
-
166
- output.push(HR)
167
- output.push(`## SECTION 1 — SIMPLE MODE (env CLAUDE_CODE_SIMPLE=1)`)
168
- output.push(`\`\`\``)
169
- output.push(`You are Claude Code, Anthropic's official CLI for Claude.\n\nCWD: <cwd>\nDate: <session start date>`)
170
- output.push(`\`\`\``)
171
-
172
- output.push(HR)
173
- output.push(`## SECTION 2 — INTRO (getSimpleIntroSection)`)
174
- output.push(`\`\`\``)
175
- output.push(`\nYou are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\n${CYBER_RISK}\nIMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.`)
176
- output.push(`\`\`\``)
177
-
178
- output.push(HR)
179
- output.push(`## SECTION 3 — SYSTEM (getSimpleSystemSection)`)
180
- // Extract bullet items from the array literal in getSimpleSystemSection
181
- const systemItemsMatch = promptsSrc.match(/function getSimpleSystemSection[\s\S]*?const items = \[([\s\S]*?)\]/m)
182
- if (systemItemsMatch) {
183
- // Pull backtick strings out of the items array
184
- const itemsBlock = systemItemsMatch[1]
185
- const ticks = extractTemplateLiterals(itemsBlock)
186
-
187
- // Replace HOOKS placeholder
188
- const finalItems = ticks.map(t => t.replace(/\${getHooksSection\(\)}/, HOOKS))
189
-
190
- output.push(`\`\`\``)
191
- output.push(`# System`)
192
- finalItems.forEach(item => output.push(` - ${item}`))
193
- output.push(`\`\`\``)
194
- }
195
-
196
- output.push(HR)
197
- output.push(`## SECTION 4 — ACTIONS (getActionsSection)`)
198
- output.push(`\`\`\``)
199
- if (actionsStr[0]) output.push(actionsStr[0].replace(/\\n/g, '\n'))
200
- output.push(`\`\`\``)
201
-
202
- output.push(HR)
203
- output.push(`## SECTION 5 — DOING TASKS (getSimpleDoingTasksSection) — key items`)
204
- // Extract the outer items array
205
- const doingItemsRegex = /`The user will primarily[\s\S]*?`/g
206
- const doingMatches = [...doingFn.matchAll(/`([^`]{20,})`/g)].map(m => m[1]).filter(s => !s.includes('${'))
207
- output.push(`\`\`\``)
208
- output.push(`# Doing tasks`)
209
- doingMatches.slice(0, 15).forEach(i => output.push(` - ${i}`))
210
- output.push(`\`\`\``)
211
-
212
- output.push(HR)
213
- output.push(`## SECTION 6 — TONE AND STYLE (getSimpleToneAndStyleSection)`)
214
- const toneItems = [...toneFn.matchAll(/`([^`]{20,})`/g)].map(m => m[1]).filter(s => !s.includes('${'))
215
- output.push(`\`\`\``)
216
- output.push(`# Tone and style`)
217
- toneItems.forEach(i => output.push(` - ${i}`))
218
- output.push(`\`\`\``)
219
-
220
- output.push(HR)
221
- output.push(`## SECTION 7 — OUTPUT EFFICIENCY (getOutputEfficiencySection)`)
222
- output.push(`\`\`\``)
223
- if (effStrings[1]) output.push(effStrings[1])
224
- else if (effStrings[0]) output.push(effStrings[0])
225
- output.push(`\`\`\``)
226
-
227
- output.push(HR)
228
- output.push(`## SECTION 8 — ENVIRONMENT (computeSimpleEnvInfo) — template`)
229
- output.push(`\`\`\``)
230
- output.push(`# Environment
231
- You have been invoked in the following environment:
232
- - Primary working directory: <cwd>
233
- - Is a git repository: Yes/No
234
- - Platform: darwin/linux/win32
235
- - Shell: zsh/bash
236
- - OS Version: Darwin 25.x.x
237
- - You are powered by the model named <model>. The exact model ID is <model-id>.
238
- - Assistant knowledge cutoff is <date>.
239
- - The most recent Claude model family is Claude 4.5/4.6. Model IDs — Opus 4.6: 'claude-opus-4-6', Sonnet 4.6: 'claude-sonnet-4-6', Haiku 4.5: 'claude-haiku-4-5-20251001'. When building AI applications, default to the latest and most capable Claude models.
240
- - Claude Code is available as a CLI in the terminal, desktop app (Mac/Windows), web app (claude.ai/code), and IDE extensions (VS Code, JetBrains).
241
- - Fast mode for Claude Code uses the same Claude Opus 4.6 model with faster output. It does NOT switch to a different model. It can be toggled with /fast.`)
242
- output.push(`\`\`\``)
243
-
244
- output.push(HR)
245
- output.push(`## SECTION 9 — SYSTEM REMINDERS (getSystemRemindersSection)`)
246
- output.push(`\`\`\``)
247
- output.push(SYSTEM_REMINDERS)
248
- output.push(`\`\`\``)
249
-
250
- output.push(HR)
251
- output.push(`## SECTION 10 — SUMMARIZE TOOL RESULTS`)
252
- output.push(`\`\`\``)
253
- output.push(SUMMARIZE)
254
- output.push(`\`\`\``)
255
-
256
- output.push(HR)
257
- output.push(`## SECTION 11 — SCRATCHPAD DIRECTORY (getScratchpadInstructions)`)
258
- output.push(`\`\`\``)
259
- if (scratchStr[0]) output.push(scratchStr[0])
260
- output.push(`\`\`\``)
261
-
262
- output.push(HR)
263
- output.push(`## SECTION 12 — MCP SERVER INSTRUCTIONS TEMPLATE`)
264
- output.push(`\`\`\``)
265
- output.push(MCP_TEMPLATE)
266
- output.push(`\`\`\``)
267
-
268
- output.push(HR)
269
- output.push(`## SECTION 13 — FUNCTION RESULT CLEARING`)
270
- output.push(`\`\`\``)
271
- output.push(FRC)
272
- output.push(`\`\`\``)
273
-
274
- output.push(HR)
275
- output.push(`## SECTION 14 — TOKEN BUDGET`)
276
- output.push(`\`\`\``)
277
- output.push(TOKEN_BUDGET)
278
- output.push(`\`\`\``)
279
-
280
- output.push(HR)
281
- output.push(`## SECTION 15 — DEFAULT AGENT PROMPT`)
282
- output.push(`\`\`\``)
283
- output.push(DEFAULT_AGENT_PROMPT)
284
- output.push(`\`\`\``)
285
-
286
- output.push(HR)
287
- output.push(`## SECTION 16 — COORDINATOR MODE SYSTEM PROMPT`)
288
- output.push(`\`\`\``)
289
- output.push(COORDINATOR_PROMPT)
290
- output.push(`\`\`\``)
291
-
292
- output.push(HR)
293
- output.push(`## SECTION 17 — AUTONOMOUS / PROACTIVE MODE SECTION`)
294
- output.push(`\`\`\``)
295
- if (proactiveStr[0]) output.push(proactiveStr[0])
296
- output.push(`\`\`\``)
297
-
298
- const finalOutput = output.join('\n')
299
- console.log(finalOutput)
300
-
301
- // Also write to file
302
- import { writeFileSync } from 'fs'
303
- writeFileSync(join(ROOT, 'SYSTEM_PROMPT_EXTRACTED.md'), finalOutput, 'utf-8')
304
- console.error('\n\nWritten to SYSTEM_PROMPT_EXTRACTED.md')
package/inspect.js DELETED
@@ -1,7 +0,0 @@
1
- const fs = require('fs');
2
- const inputPath = 'components/PromptInput/PromptInput.tsx';
3
- const src = fs.readFileSync(inputPath, 'utf8');
4
-
5
- // Extract the prompt rendering logic to understand it
6
- const match = src.match(/borderLeft=\{messages\.length === 0.*?(?=minHeight=\{messages\.length)/s);
7
- console.log(match ? match[0] : "Not found");