notsleep 1.0.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 (93) hide show
  1. package/.env.example +117 -0
  2. package/LICENSE +21 -0
  3. package/README.md +341 -0
  4. package/dashboard/index.html +893 -0
  5. package/dist/agent.d.ts +162 -0
  6. package/dist/agent.d.ts.map +1 -0
  7. package/dist/agent.js +1064 -0
  8. package/dist/agent.js.map +1 -0
  9. package/dist/api.d.ts +10 -0
  10. package/dist/api.d.ts.map +1 -0
  11. package/dist/api.js +39 -0
  12. package/dist/api.js.map +1 -0
  13. package/dist/checkpoint.d.ts +52 -0
  14. package/dist/checkpoint.d.ts.map +1 -0
  15. package/dist/checkpoint.js +234 -0
  16. package/dist/checkpoint.js.map +1 -0
  17. package/dist/config.d.ts +24 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +265 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/context.d.ts +15 -0
  22. package/dist/context.d.ts.map +1 -0
  23. package/dist/context.js +237 -0
  24. package/dist/context.js.map +1 -0
  25. package/dist/cost.d.ts +26 -0
  26. package/dist/cost.d.ts.map +1 -0
  27. package/dist/cost.js +161 -0
  28. package/dist/cost.js.map +1 -0
  29. package/dist/dashboard.d.ts +96 -0
  30. package/dist/dashboard.d.ts.map +1 -0
  31. package/dist/dashboard.js +292 -0
  32. package/dist/dashboard.js.map +1 -0
  33. package/dist/fileconfig.d.ts +129 -0
  34. package/dist/fileconfig.d.ts.map +1 -0
  35. package/dist/fileconfig.js +391 -0
  36. package/dist/fileconfig.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +882 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/init.d.ts +9 -0
  42. package/dist/init.d.ts.map +1 -0
  43. package/dist/init.js +221 -0
  44. package/dist/init.js.map +1 -0
  45. package/dist/logger.d.ts +33 -0
  46. package/dist/logger.d.ts.map +1 -0
  47. package/dist/logger.js +150 -0
  48. package/dist/logger.js.map +1 -0
  49. package/dist/modelsdev.d.ts +63 -0
  50. package/dist/modelsdev.d.ts.map +1 -0
  51. package/dist/modelsdev.js +265 -0
  52. package/dist/modelsdev.js.map +1 -0
  53. package/dist/parallel.d.ts +54 -0
  54. package/dist/parallel.d.ts.map +1 -0
  55. package/dist/parallel.js +139 -0
  56. package/dist/parallel.js.map +1 -0
  57. package/dist/pool.d.ts +17 -0
  58. package/dist/pool.d.ts.map +1 -0
  59. package/dist/pool.js +53 -0
  60. package/dist/pool.js.map +1 -0
  61. package/dist/provider.d.ts +60 -0
  62. package/dist/provider.d.ts.map +1 -0
  63. package/dist/provider.js +396 -0
  64. package/dist/provider.js.map +1 -0
  65. package/dist/registry.d.ts +60 -0
  66. package/dist/registry.d.ts.map +1 -0
  67. package/dist/registry.js +153 -0
  68. package/dist/registry.js.map +1 -0
  69. package/dist/safety.d.ts +21 -0
  70. package/dist/safety.d.ts.map +1 -0
  71. package/dist/safety.js +118 -0
  72. package/dist/safety.js.map +1 -0
  73. package/dist/schema.d.ts +9 -0
  74. package/dist/schema.d.ts.map +1 -0
  75. package/dist/schema.js +166 -0
  76. package/dist/schema.js.map +1 -0
  77. package/dist/test-dashboard.d.ts +5 -0
  78. package/dist/test-dashboard.d.ts.map +1 -0
  79. package/dist/test-dashboard.js +202 -0
  80. package/dist/test-dashboard.js.map +1 -0
  81. package/dist/tools.d.ts +27 -0
  82. package/dist/tools.d.ts.map +1 -0
  83. package/dist/tools.js +1212 -0
  84. package/dist/tools.js.map +1 -0
  85. package/dist/types.d.ts +180 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +14 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/worktree.d.ts +50 -0
  90. package/dist/worktree.d.ts.map +1 -0
  91. package/dist/worktree.js +186 -0
  92. package/dist/worktree.js.map +1 -0
  93. package/package.json +67 -0
package/dist/config.js ADDED
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // NotSleep - Configuration Loader
4
+ // ============================================================
5
+ //
6
+ // Priority (highest wins):
7
+ // 1. CLI flags / programmatic overrides
8
+ // 2. Project config file (./notsleep.json)
9
+ // 3. Global config file (~/.notsleep/config.json)
10
+ // 4. Environment / .env
11
+ // 5. Built-in defaults
12
+ // ============================================================
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.DEFAULT_SYSTEM_PROMPT = void 0;
48
+ exports.markContextLimitSource = markContextLimitSource;
49
+ exports.getConfigSources = getConfigSources;
50
+ exports.loadConfig = loadConfig;
51
+ const dotenv = __importStar(require("dotenv"));
52
+ const path = __importStar(require("path"));
53
+ const fs = __importStar(require("fs"));
54
+ const fileconfig_1 = require("./fileconfig");
55
+ const cost_1 = require("./cost");
56
+ const registry_1 = require("./registry");
57
+ const modelsdev_1 = require("./modelsdev");
58
+ exports.DEFAULT_SYSTEM_PROMPT = `You are NotSleep, a long-horizon autonomous AI agent. You have been given a task and you must complete it fully before stopping. You have access to tools that let you execute shell commands, read/write files, and search the web.
59
+
60
+ CRITICAL RULES:
61
+ 1. NEVER stop until the task is fully complete. If you encounter errors, debug and fix them.
62
+ 2. Break large tasks into smaller subtasks and track your progress.
63
+ 3. After completing each subtask, report progress and move to the next one.
64
+ 4. If you are unsure about something, investigate before acting.
65
+ 5. Always verify your work - run tests, check outputs, validate results.
66
+ 6. If the context gets too long, you will be asked to summarize your progress. Be thorough in your summary.
67
+ 7. Think step by step. Plan before you act.
68
+ 8. Use "add_task" to queue follow-up work you discover (improvements, tests, documentation, refactoring).
69
+ 9. Use "list_tasks" to see the current task queue and progress.
70
+
71
+ When you have fully completed the CURRENT task, call the "task_complete" tool with a summary of everything you accomplished. In continuous mode, you will automatically receive the next task from the queue.`;
72
+ /** Override the recorded context-limit source (e.g. after a /models endpoint hit). */
73
+ function markContextLimitSource(src) {
74
+ lastConfigSources.contextLimitSource = src;
75
+ }
76
+ let lastConfigSources = {
77
+ fileConfigSources: [],
78
+ envLoaded: false,
79
+ warnings: [],
80
+ contextLimitSource: 'static',
81
+ instructionFiles: [],
82
+ };
83
+ function getConfigSources() {
84
+ return lastConfigSources;
85
+ }
86
+ /** Pick the first defined value from a list of candidates. */
87
+ function firstDefined(...vals) {
88
+ for (const v of vals) {
89
+ if (v !== undefined && v !== null && !(typeof v === 'string' && v === ''))
90
+ return v;
91
+ }
92
+ return undefined;
93
+ }
94
+ function loadConfig(overrides) {
95
+ // ── 1. Load .env from current working directory ──
96
+ const envPath = path.resolve(process.cwd(), '.env');
97
+ let envLoaded = false;
98
+ if (fs.existsSync(envPath)) {
99
+ dotenv.config({ path: envPath });
100
+ envLoaded = true;
101
+ }
102
+ else {
103
+ const r = dotenv.config();
104
+ envLoaded = !r.error;
105
+ }
106
+ // ── 2. Load file config (global + project), env refs resolved ──
107
+ const { config: file, sources, warnings } = (0, fileconfig_1.loadFileConfig)();
108
+ // ── 3. Resolve provider (override > file > env > default) ──
109
+ const provider = (overrides?.provider ||
110
+ file.provider ||
111
+ process.env.NOTSLEEP_PROVIDER ||
112
+ 'openai');
113
+ // ── 4. Merge each field with correct priority ──
114
+ const config = {
115
+ provider,
116
+ openai: {
117
+ apiKey: firstDefined(overrides?.openai?.apiKey, file.openai?.apiKey, process.env.OPENAI_API_KEY) || '',
118
+ model: firstDefined(overrides?.openai?.model, file.openai?.model, process.env.OPENAI_MODEL) || 'gpt-4o',
119
+ baseURL: firstDefined(overrides?.openai?.baseURL, file.openai?.baseURL, process.env.OPENAI_BASE_URL),
120
+ },
121
+ anthropic: {
122
+ apiKey: firstDefined(overrides?.anthropic?.apiKey, file.anthropic?.apiKey, process.env.ANTHROPIC_API_KEY) || '',
123
+ model: firstDefined(overrides?.anthropic?.model, file.anthropic?.model, process.env.ANTHROPIC_MODEL) || 'claude-sonnet-4-20250514',
124
+ baseURL: firstDefined(overrides?.anthropic?.baseURL, file.anthropic?.baseURL, process.env.ANTHROPIC_BASE_URL),
125
+ },
126
+ maxIterations: firstDefined(overrides?.maxIterations, file.maxIterations, process.env.NOTSLEEP_MAX_ITERATIONS ? parseInt(process.env.NOTSLEEP_MAX_ITERATIONS, 10) : undefined) ?? 1000,
127
+ maxIterationsPerTask: firstDefined(overrides?.maxIterationsPerTask, file.maxIterationsPerTask, process.env.NOTSLEEP_MAX_ITERATIONS_PER_TASK ? parseInt(process.env.NOTSLEEP_MAX_ITERATIONS_PER_TASK, 10) : undefined) ?? 0, // 0 = no per-task cap
128
+ checkpointDir: firstDefined(overrides?.checkpointDir, file.checkpointDir, process.env.NOTSLEEP_CHECKPOINT_DIR) ?? '.notsleep/checkpoints',
129
+ logDir: firstDefined(overrides?.logDir, file.logDir, process.env.NOTSLEEP_LOG_DIR) ?? '.notsleep/logs',
130
+ // Context window limit: if not explicitly set, auto-detect from the
131
+ // model name so we never exceed what the model actually supports.
132
+ // The old hard-coded default of 120 000 was wrong for models like
133
+ // GPT-4 (8K) or Claude (200K).
134
+ contextWindowLimit: firstDefined(overrides?.contextWindowLimit, file.contextWindowLimit, process.env.NOTSLEEP_CONTEXT_WINDOW_LIMIT ? parseInt(process.env.NOTSLEEP_CONTEXT_WINDOW_LIMIT, 10) : undefined) ?? 0, // 0 = auto-detect (resolved below after model is known)
135
+ summarizeThreshold: firstDefined(overrides?.summarizeThreshold, file.summarizeThreshold, process.env.NOTSLEEP_SUMMARIZE_THRESHOLD ? parseFloat(process.env.NOTSLEEP_SUMMARIZE_THRESHOLD) : undefined) ?? 0.75,
136
+ maxRetries: firstDefined(overrides?.maxRetries, file.maxRetries, process.env.NOTSLEEP_MAX_RETRIES ? parseInt(process.env.NOTSLEEP_MAX_RETRIES, 10) : undefined) ?? 10,
137
+ retryBaseDelayMs: firstDefined(overrides?.retryBaseDelayMs, file.retryBaseDelayMs, process.env.NOTSLEEP_RETRY_BASE_DELAY_MS ? parseInt(process.env.NOTSLEEP_RETRY_BASE_DELAY_MS, 10) : undefined) ?? 1000,
138
+ toolTimeoutMs: firstDefined(overrides?.toolTimeoutMs, file.toolTimeoutMs, process.env.NOTSLEEP_TOOL_TIMEOUT_MS ? parseInt(process.env.NOTSLEEP_TOOL_TIMEOUT_MS, 10) : undefined) ?? 120000,
139
+ systemPrompt: firstDefined(overrides?.systemPrompt, file.systemPrompt) ?? exports.DEFAULT_SYSTEM_PROMPT,
140
+ continuous: firstDefined(overrides?.continuous, file.continuous, process.env.NOTSLEEP_CONTINUOUS === 'true' ? true : undefined) ?? false,
141
+ stopFile: firstDefined(overrides?.stopFile, file.stopFile, process.env.NOTSLEEP_STOP_FILE) ?? '.notsleep/STOP',
142
+ maxCostUsd: firstDefined(overrides?.maxCostUsd, file.maxCostUsd, process.env.NOTSLEEP_MAX_COST_USD ? parseFloat(process.env.NOTSLEEP_MAX_COST_USD) : undefined),
143
+ customTools: overrides?.customTools ?? file.customTools,
144
+ autoCommit: firstDefined(overrides?.autoCommit, file.autoCommit, process.env.NOTSLEEP_AUTO_COMMIT === 'true' ? true : undefined) ?? false,
145
+ dashboard: {
146
+ enabled: firstDefined(overrides?.dashboard?.enabled, file.dashboard?.enabled, process.env.NOTSLEEP_DASHBOARD === 'true' ? true : undefined) ?? false,
147
+ port: firstDefined(overrides?.dashboard?.port, file.dashboard?.port, process.env.NOTSLEEP_DASHBOARD_PORT ? parseInt(process.env.NOTSLEEP_DASHBOARD_PORT, 10) : undefined) ?? 3120,
148
+ },
149
+ };
150
+ // ── 4b. Unified "provider/model" registry selector (OpenCode-style) ──
151
+ // If a `model` selector like "groq/llama-3.3-70b-versatile" is given, resolve
152
+ // it against the built-in provider registry (overlaid with the user's
153
+ // `providers` map) and populate the legacy provider + openai/anthropic block
154
+ // from the result. All downstream code (provider.ts, agent.ts) then works
155
+ // unchanged — it only ever reads config.provider and the two blocks.
156
+ const providers = overrides?.providers ?? file.providers;
157
+ const modelRef = firstDefined(overrides?.model, file.model, process.env.NOTSLEEP_MODEL);
158
+ if ((0, registry_1.isModelRef)(modelRef)) {
159
+ const resolved = (0, registry_1.resolveModelRef)(modelRef, providers);
160
+ config.provider = resolved.type;
161
+ config.model = modelRef;
162
+ config.providers = providers;
163
+ const block = { apiKey: resolved.apiKey, model: resolved.model, baseURL: resolved.baseURL };
164
+ if (resolved.type === 'anthropic') {
165
+ config.anthropic = block;
166
+ }
167
+ else {
168
+ config.openai = block;
169
+ }
170
+ }
171
+ // ── 4c. Optional small model for the agent's internal calls ──
172
+ // A "provider/model" ref resolves via the registry (its own creds); a bare
173
+ // model id reuses the PRIMARY provider's key + baseURL (e.g. primary gpt-4o,
174
+ // small_model "gpt-4o-mini"). Left unset → internal calls use the primary.
175
+ const smallRef = firstDefined(overrides?.smallModelRef, file.small_model, file.smallModel, process.env.NOTSLEEP_SMALL_MODEL);
176
+ if (smallRef) {
177
+ if ((0, registry_1.isModelRef)(smallRef)) {
178
+ const r = (0, registry_1.resolveModelRef)(smallRef, providers);
179
+ config.smallModel = { provider: r.type, apiKey: r.apiKey, model: r.model, baseURL: r.baseURL };
180
+ }
181
+ else {
182
+ const primaryKey = config.provider === 'openai' ? config.openai.apiKey : config.anthropic.apiKey;
183
+ const primaryBase = config.provider === 'openai' ? config.openai.baseURL : config.anthropic.baseURL;
184
+ config.smallModel = {
185
+ provider: config.provider,
186
+ apiKey: primaryKey,
187
+ model: smallRef,
188
+ baseURL: primaryBase,
189
+ };
190
+ }
191
+ }
192
+ // ── Filter warnings: drop "not set" noise for the INACTIVE provider ──
193
+ // (init writes both provider blocks by default; only warn about the one in use.)
194
+ const inactiveKeyField = provider === 'openai' ? 'anthropic.apiKey' : 'openai.apiKey';
195
+ const relevantWarnings = warnings.filter((w) => {
196
+ // Keep all malformed-ref warnings; only suppress "not set" for the inactive provider.
197
+ if (w.startsWith(inactiveKeyField) && w.includes('is not set'))
198
+ return false;
199
+ return true;
200
+ });
201
+ // ── 5. Resolve the context window limit ──
202
+ // Priority: an explicit user value wins. Otherwise auto-detect, preferring
203
+ // LIVE metadata from the models.dev catalog (populated by ensureModelCatalog()
204
+ // before loadConfig in the CLI paths; empty in offline/unit-test contexts, in
205
+ // which case we fall back to the static table in cost.ts). We store 90% of the
206
+ // real window as the limit, leaving headroom for the completion.
207
+ let contextLimitSource = 'explicit';
208
+ if (config.contextWindowLimit <= 0) {
209
+ const modelId = config.provider === 'openai'
210
+ ? config.openai.model
211
+ : config.anthropic.model;
212
+ const providerName = (0, registry_1.isModelRef)(config.model)
213
+ ? (0, registry_1.parseModelRef)(config.model).providerName
214
+ : config.provider;
215
+ const live = (0, modelsdev_1.liveContextLimit)(providerName, modelId);
216
+ if (live !== undefined) {
217
+ config.contextWindowLimit = Math.floor(live * 0.9);
218
+ contextLimitSource = 'catalog';
219
+ }
220
+ else {
221
+ config.contextWindowLimit = (0, cost_1.safeContextLimit)(modelId);
222
+ contextLimitSource = 'static';
223
+ }
224
+ }
225
+ // ── 5b. Fold instruction files into the system prompt ──
226
+ // Explicit `instructions` (relative to the project config) plus auto-loaded
227
+ // AGENTS.md / NOTSLEEP.md from the project root, appended as clearly-labeled
228
+ // context. This is only for the default/base prompt; if the user supplied a
229
+ // fully custom systemPrompt via override we still append project guidance.
230
+ const projectPath = (0, fileconfig_1.findProjectConfig)();
231
+ const projectDir = projectPath ? path.dirname(projectPath) : process.cwd();
232
+ const instr = (0, fileconfig_1.gatherInstructions)(file, projectDir);
233
+ if (instr.text) {
234
+ config.systemPrompt += `\n\n--- PROJECT INSTRUCTIONS ---\n\n${instr.text}`;
235
+ }
236
+ lastConfigSources = {
237
+ fileConfigSources: sources,
238
+ envLoaded,
239
+ warnings: relevantWarnings,
240
+ contextLimitSource,
241
+ instructionFiles: instr.files,
242
+ };
243
+ // ── 6. Validate ──
244
+ // Reject unknown providers early with a clear message. Otherwise an invalid
245
+ // value silently falls through to the anthropic branch and later fails with
246
+ // a confusing "client not initialized" error deep in the run.
247
+ if (config.provider !== 'openai' && config.provider !== 'anthropic') {
248
+ throw new Error(`Unknown provider "${config.provider}". Valid providers are: openai, anthropic.`);
249
+ }
250
+ const activeKey = config.provider === 'openai' ? config.openai?.apiKey : config.anthropic?.apiKey;
251
+ if (!activeKey) {
252
+ if ((0, registry_1.isModelRef)(config.model)) {
253
+ // Registry path: name the provider and how to supply its key.
254
+ const providerName = config.model.slice(0, config.model.indexOf('/'));
255
+ throw new Error(`No API key for provider "${providerName}" (model "${config.model}"). ` +
256
+ `Set its key in the "providers" section of notsleep.json ` +
257
+ `(e.g. "providers": { "${providerName}": { "apiKey": "{env:${providerName.toUpperCase()}_API_KEY}" } }) ` +
258
+ `or export the matching environment variable.`);
259
+ }
260
+ const envVar = config.provider === 'openai' ? 'OPENAI_API_KEY' : 'ANTHROPIC_API_KEY';
261
+ throw new Error(`${envVar} is required when using the ${config.provider} provider. Set it in .env, notsleep.json, or pass it directly. Run "notsleep init" to set up config.`);
262
+ }
263
+ return config;
264
+ }
265
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ProjectContext {
2
+ cwd: string;
3
+ language: string;
4
+ framework: string;
5
+ packageManager: string;
6
+ gitBranch: string | null;
7
+ gitDirty: boolean;
8
+ readme: string | null;
9
+ dependencies: string[];
10
+ fileTree: string;
11
+ configFiles: string[];
12
+ summary: string;
13
+ }
14
+ export declare function detectProjectContext(cwd?: string): ProjectContext;
15
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CA+KjE"}
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // NotSleep - Project Context Auto-Detector
4
+ // ============================================================
5
+ //
6
+ // Scans the current working directory to understand the project:
7
+ // - Git status & branch
8
+ // - package.json / requirements.txt / go.mod etc.
9
+ // - README
10
+ // - File tree (top 3 levels)
11
+ // - Existing config files
12
+ //
13
+ // Produces a context string injected into the system prompt
14
+ // so the agent already knows what it's working with.
15
+ //
16
+ // ============================================================
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.detectProjectContext = detectProjectContext;
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const child_process_1 = require("child_process");
55
+ function detectProjectContext(cwd) {
56
+ const dir = cwd || process.cwd();
57
+ const ctx = {
58
+ cwd: dir,
59
+ language: 'unknown',
60
+ framework: 'unknown',
61
+ packageManager: 'unknown',
62
+ gitBranch: null,
63
+ gitDirty: false,
64
+ readme: null,
65
+ dependencies: [],
66
+ fileTree: '',
67
+ configFiles: [],
68
+ summary: '',
69
+ };
70
+ // ─── Git ──────────────────────────────────────────────
71
+ try {
72
+ ctx.gitBranch = (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', { cwd: dir, stdio: ['pipe', 'pipe', 'pipe'] })
73
+ .toString().trim();
74
+ const status = (0, child_process_1.execSync)('git status --porcelain', { cwd: dir, stdio: ['pipe', 'pipe', 'pipe'] })
75
+ .toString().trim();
76
+ ctx.gitDirty = status.length > 0;
77
+ }
78
+ catch {
79
+ // not a git repo
80
+ }
81
+ // ─── Language / Package Manager Detection ─────────────
82
+ const detectors = [
83
+ {
84
+ file: 'package.json', lang: 'JavaScript/TypeScript', pm: 'npm',
85
+ framework: (pkg) => {
86
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
87
+ if (deps['next'])
88
+ return 'Next.js';
89
+ if (deps['nuxt'])
90
+ return 'Nuxt';
91
+ if (deps['react'])
92
+ return 'React';
93
+ if (deps['vue'])
94
+ return 'Vue';
95
+ if (deps['svelte'])
96
+ return 'Svelte';
97
+ if (deps['express'])
98
+ return 'Express';
99
+ if (deps['fastify'])
100
+ return 'Fastify';
101
+ if (deps['nestjs'] || deps['@nestjs/core'])
102
+ return 'NestJS';
103
+ if (deps['angular'] || deps['@angular/core'])
104
+ return 'Angular';
105
+ return 'Node.js';
106
+ }
107
+ },
108
+ { file: 'requirements.txt', lang: 'Python', pm: 'pip' },
109
+ { file: 'pyproject.toml', lang: 'Python', pm: 'poetry/pip' },
110
+ { file: 'Pipfile', lang: 'Python', pm: 'pipenv' },
111
+ { file: 'go.mod', lang: 'Go', pm: 'go modules' },
112
+ { file: 'Cargo.toml', lang: 'Rust', pm: 'cargo' },
113
+ { file: 'pom.xml', lang: 'Java', pm: 'maven' },
114
+ { file: 'build.gradle', lang: 'Java/Kotlin', pm: 'gradle' },
115
+ { file: 'Gemfile', lang: 'Ruby', pm: 'bundler' },
116
+ { file: 'composer.json', lang: 'PHP', pm: 'composer' },
117
+ { file: 'pubspec.yaml', lang: 'Dart/Flutter', pm: 'pub' },
118
+ ];
119
+ for (const det of detectors) {
120
+ const filePath = path.join(dir, det.file);
121
+ if (fs.existsSync(filePath)) {
122
+ ctx.language = det.lang;
123
+ ctx.packageManager = det.pm;
124
+ // Detect framework from package.json
125
+ if (det.file === 'package.json' && det.framework) {
126
+ try {
127
+ const pkg = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
128
+ ctx.framework = det.framework(pkg);
129
+ // Extract top dependencies
130
+ const deps = Object.keys(pkg.dependencies || {}).slice(0, 15);
131
+ const devDeps = Object.keys(pkg.devDependencies || {}).slice(0, 10);
132
+ ctx.dependencies = [...deps, ...devDeps.map(d => `${d} (dev)`)];
133
+ // Check for yarn/pnpm
134
+ if (fs.existsSync(path.join(dir, 'yarn.lock')))
135
+ ctx.packageManager = 'yarn';
136
+ if (fs.existsSync(path.join(dir, 'pnpm-lock.yaml')))
137
+ ctx.packageManager = 'pnpm';
138
+ if (fs.existsSync(path.join(dir, 'bun.lockb')))
139
+ ctx.packageManager = 'bun';
140
+ }
141
+ catch { /* ignore parse errors */ }
142
+ }
143
+ // Check for TypeScript
144
+ if (fs.existsSync(path.join(dir, 'tsconfig.json'))) {
145
+ ctx.language = 'TypeScript';
146
+ }
147
+ break;
148
+ }
149
+ }
150
+ // ─── README ───────────────────────────────────────────
151
+ const readmeNames = ['README.md', 'readme.md', 'README.txt', 'README'];
152
+ for (const name of readmeNames) {
153
+ const readmePath = path.join(dir, name);
154
+ if (fs.existsSync(readmePath)) {
155
+ try {
156
+ const content = fs.readFileSync(readmePath, 'utf-8');
157
+ // Take first 2000 chars
158
+ ctx.readme = content.substring(0, 2000);
159
+ if (content.length > 2000)
160
+ ctx.readme += '\n... [truncated]';
161
+ }
162
+ catch { /* ignore */ }
163
+ break;
164
+ }
165
+ }
166
+ // ─── Config Files ─────────────────────────────────────
167
+ const configPatterns = [
168
+ '.env', '.env.example', '.gitignore', 'Dockerfile', 'docker-compose.yml',
169
+ 'tsconfig.json', '.eslintrc.js', '.prettierrc', 'jest.config.js',
170
+ 'vite.config.ts', 'next.config.js', 'webpack.config.js',
171
+ '.github/workflows', 'Makefile', 'vercel.json', 'netlify.toml',
172
+ ];
173
+ for (const p of configPatterns) {
174
+ if (fs.existsSync(path.join(dir, p))) {
175
+ ctx.configFiles.push(p);
176
+ }
177
+ }
178
+ // ─── File Tree (top 3 levels) ─────────────────────────
179
+ const treeLines = [];
180
+ const skipDirs = new Set(['node_modules', '.git', 'dist', 'build', '__pycache__', '.next', '.nuxt', 'target', 'vendor', '.venv', 'venv']);
181
+ function walk(d, prefix, depth) {
182
+ if (depth > 3 || treeLines.length > 80)
183
+ return;
184
+ try {
185
+ const entries = fs.readdirSync(d, { withFileTypes: true })
186
+ .filter(e => !e.name.startsWith('.') || e.name === '.env.example' || e.name === '.gitignore')
187
+ .filter(e => !skipDirs.has(e.name))
188
+ .sort((a, b) => {
189
+ // Dirs first
190
+ if (a.isDirectory() && !b.isDirectory())
191
+ return -1;
192
+ if (!a.isDirectory() && b.isDirectory())
193
+ return 1;
194
+ return a.name.localeCompare(b.name);
195
+ });
196
+ for (let i = 0; i < entries.length; i++) {
197
+ if (treeLines.length > 80) {
198
+ treeLines.push(prefix + '... (truncated)');
199
+ return;
200
+ }
201
+ const isLast = i === entries.length - 1;
202
+ const connector = isLast ? '└── ' : '├── ';
203
+ const childPrefix = isLast ? ' ' : '│ ';
204
+ const entry = entries[i];
205
+ treeLines.push(prefix + connector + entry.name + (entry.isDirectory() ? '/' : ''));
206
+ if (entry.isDirectory()) {
207
+ walk(path.join(d, entry.name), prefix + childPrefix, depth + 1);
208
+ }
209
+ }
210
+ }
211
+ catch { /* ignore permission errors */ }
212
+ }
213
+ walk(dir, '', 0);
214
+ ctx.fileTree = treeLines.join('\n');
215
+ // ─── Build Summary ────────────────────────────────────
216
+ const parts = [];
217
+ parts.push(`Working directory: ${dir}`);
218
+ parts.push(`Language: ${ctx.language} | Framework: ${ctx.framework} | Package manager: ${ctx.packageManager}`);
219
+ if (ctx.gitBranch) {
220
+ parts.push(`Git branch: ${ctx.gitBranch}${ctx.gitDirty ? ' (dirty - uncommitted changes)' : ' (clean)'}`);
221
+ }
222
+ if (ctx.configFiles.length > 0) {
223
+ parts.push(`Config files: ${ctx.configFiles.join(', ')}`);
224
+ }
225
+ if (ctx.dependencies.length > 0) {
226
+ parts.push(`Key dependencies: ${ctx.dependencies.join(', ')}`);
227
+ }
228
+ if (ctx.fileTree) {
229
+ parts.push(`\nProject structure:\n${ctx.fileTree}`);
230
+ }
231
+ if (ctx.readme) {
232
+ parts.push(`\nREADME (excerpt):\n${ctx.readme}`);
233
+ }
234
+ ctx.summary = parts.join('\n');
235
+ return ctx;
236
+ }
237
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
package/dist/cost.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ export interface ModelPrice {
2
+ /** USD per 1M input (prompt) tokens */
3
+ input: number;
4
+ /** USD per 1M output (completion) tokens */
5
+ output: number;
6
+ }
7
+ /**
8
+ * Look up the context window size (max input tokens) for a model.
9
+ * Returns the raw model limit; callers should apply a safety margin.
10
+ */
11
+ export declare function contextWindowForModel(model: string): number;
12
+ /**
13
+ * Compute a safe context window limit for the agent, leaving room for
14
+ * the model's output. Uses 90% of the model's context window, capped
15
+ * so we never exceed what the model actually supports.
16
+ */
17
+ export declare function safeContextLimit(model: string): number;
18
+ /** Look up the per-1M price for a model name (case-insensitive substring). */
19
+ export declare function priceForModel(model: string): ModelPrice;
20
+ /**
21
+ * Estimate the USD cost of a single call given its token usage.
22
+ */
23
+ export declare function estimateCost(model: string, promptTokens: number, completionTokens: number): number;
24
+ /** Format a USD amount for display (4 decimals under $1, else 2). */
25
+ export declare function formatUsd(amount: number): string;
26
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB;AAyGD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAMvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAGlG;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhD"}