ineedcodes 0.1.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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/docs/assets/ineed-logo.svg +161 -0
  4. package/docs/configuration.md +71 -0
  5. package/docs/skills.md +58 -0
  6. package/package.json +41 -0
  7. package/packages/agent/dist/boost.d.ts +34 -0
  8. package/packages/agent/dist/boost.js +138 -0
  9. package/packages/agent/dist/boost.js.map +1 -0
  10. package/packages/agent/dist/events.d.ts +67 -0
  11. package/packages/agent/dist/events.js +16 -0
  12. package/packages/agent/dist/events.js.map +1 -0
  13. package/packages/agent/dist/index.d.ts +6 -0
  14. package/packages/agent/dist/index.js +7 -0
  15. package/packages/agent/dist/index.js.map +1 -0
  16. package/packages/agent/dist/lead-agent.d.ts +85 -0
  17. package/packages/agent/dist/lead-agent.js +235 -0
  18. package/packages/agent/dist/lead-agent.js.map +1 -0
  19. package/packages/agent/dist/orchestrator.d.ts +43 -0
  20. package/packages/agent/dist/orchestrator.js +135 -0
  21. package/packages/agent/dist/orchestrator.js.map +1 -0
  22. package/packages/agent/dist/runtime.d.ts +44 -0
  23. package/packages/agent/dist/runtime.js +265 -0
  24. package/packages/agent/dist/runtime.js.map +1 -0
  25. package/packages/agent/dist/system-prompts.d.ts +24 -0
  26. package/packages/agent/dist/system-prompts.js +91 -0
  27. package/packages/agent/dist/system-prompts.js.map +1 -0
  28. package/packages/agent/package.json +21 -0
  29. package/packages/cli/dist/index.d.ts +3 -0
  30. package/packages/cli/dist/index.js +567 -0
  31. package/packages/cli/dist/index.js.map +1 -0
  32. package/packages/cli/dist/setup.d.ts +37 -0
  33. package/packages/cli/dist/setup.js +240 -0
  34. package/packages/cli/dist/setup.js.map +1 -0
  35. package/packages/cli/dist/tools-setup.d.ts +12 -0
  36. package/packages/cli/dist/tools-setup.js +28 -0
  37. package/packages/cli/dist/tools-setup.js.map +1 -0
  38. package/packages/cli/dist/ui/approval.d.ts +12 -0
  39. package/packages/cli/dist/ui/approval.js +52 -0
  40. package/packages/cli/dist/ui/approval.js.map +1 -0
  41. package/packages/cli/dist/ui/colors.d.ts +14 -0
  42. package/packages/cli/dist/ui/colors.js +21 -0
  43. package/packages/cli/dist/ui/colors.js.map +1 -0
  44. package/packages/cli/dist/ui/prompts.d.ts +46 -0
  45. package/packages/cli/dist/ui/prompts.js +135 -0
  46. package/packages/cli/dist/ui/prompts.js.map +1 -0
  47. package/packages/cli/dist/ui/renderer.d.ts +13 -0
  48. package/packages/cli/dist/ui/renderer.js +95 -0
  49. package/packages/cli/dist/ui/renderer.js.map +1 -0
  50. package/packages/cli/package.json +23 -0
  51. package/packages/core/dist/config/config.d.ts +32 -0
  52. package/packages/core/dist/config/config.js +43 -0
  53. package/packages/core/dist/config/config.js.map +1 -0
  54. package/packages/core/dist/context/engine.d.ts +25 -0
  55. package/packages/core/dist/context/engine.js +98 -0
  56. package/packages/core/dist/context/engine.js.map +1 -0
  57. package/packages/core/dist/index.d.ts +20 -0
  58. package/packages/core/dist/index.js +21 -0
  59. package/packages/core/dist/index.js.map +1 -0
  60. package/packages/core/dist/llm/openai-compatible.d.ts +23 -0
  61. package/packages/core/dist/llm/openai-compatible.js +177 -0
  62. package/packages/core/dist/llm/openai-compatible.js.map +1 -0
  63. package/packages/core/dist/memory/icm-adapter.d.ts +31 -0
  64. package/packages/core/dist/memory/icm-adapter.js +98 -0
  65. package/packages/core/dist/memory/icm-adapter.js.map +1 -0
  66. package/packages/core/dist/permissions/permissions.d.ts +28 -0
  67. package/packages/core/dist/permissions/permissions.js +89 -0
  68. package/packages/core/dist/permissions/permissions.js.map +1 -0
  69. package/packages/core/dist/security/secrets.d.ts +4 -0
  70. package/packages/core/dist/security/secrets.js +43 -0
  71. package/packages/core/dist/security/secrets.js.map +1 -0
  72. package/packages/core/dist/session/store.d.ts +16 -0
  73. package/packages/core/dist/session/store.js +54 -0
  74. package/packages/core/dist/session/store.js.map +1 -0
  75. package/packages/core/dist/shell/process.d.ts +26 -0
  76. package/packages/core/dist/shell/process.js +128 -0
  77. package/packages/core/dist/shell/process.js.map +1 -0
  78. package/packages/core/dist/skills/loader.d.ts +9 -0
  79. package/packages/core/dist/skills/loader.js +163 -0
  80. package/packages/core/dist/skills/loader.js.map +1 -0
  81. package/packages/core/dist/tools/fs.d.ts +10 -0
  82. package/packages/core/dist/tools/fs.js +409 -0
  83. package/packages/core/dist/tools/fs.js.map +1 -0
  84. package/packages/core/dist/tools/git.d.ts +7 -0
  85. package/packages/core/dist/tools/git.js +251 -0
  86. package/packages/core/dist/tools/git.js.map +1 -0
  87. package/packages/core/dist/tools/mcp.d.ts +42 -0
  88. package/packages/core/dist/tools/mcp.js +158 -0
  89. package/packages/core/dist/tools/mcp.js.map +1 -0
  90. package/packages/core/dist/tools/registry.d.ts +21 -0
  91. package/packages/core/dist/tools/registry.js +50 -0
  92. package/packages/core/dist/tools/registry.js.map +1 -0
  93. package/packages/core/dist/tools/search.d.ts +2 -0
  94. package/packages/core/dist/tools/search.js +243 -0
  95. package/packages/core/dist/tools/search.js.map +1 -0
  96. package/packages/core/dist/tools/shell.d.ts +8 -0
  97. package/packages/core/dist/tools/shell.js +164 -0
  98. package/packages/core/dist/tools/shell.js.map +1 -0
  99. package/packages/core/dist/tools/web.d.ts +14 -0
  100. package/packages/core/dist/tools/web.js +125 -0
  101. package/packages/core/dist/tools/web.js.map +1 -0
  102. package/packages/core/dist/types.d.ts +202 -0
  103. package/packages/core/dist/types.js +7 -0
  104. package/packages/core/dist/types.js.map +1 -0
  105. package/packages/core/dist/util/fs.d.ts +5 -0
  106. package/packages/core/dist/util/fs.js +33 -0
  107. package/packages/core/dist/util/fs.js.map +1 -0
  108. package/packages/core/dist/util/shell-quote.d.ts +7 -0
  109. package/packages/core/dist/util/shell-quote.js +20 -0
  110. package/packages/core/dist/util/shell-quote.js.map +1 -0
  111. package/packages/core/dist/workspace/workspace.d.ts +15 -0
  112. package/packages/core/dist/workspace/workspace.js +84 -0
  113. package/packages/core/dist/workspace/workspace.js.map +1 -0
  114. package/packages/core/package.json +21 -0
@@ -0,0 +1,98 @@
1
+ import * as path from 'node:path';
2
+ import * as os from 'node:os';
3
+ import { execShell } from '../shell/process.js';
4
+ import { shellQuote } from '../util/shell-quote.js';
5
+ /** Disabled memory backend: no-ops, never fails. */
6
+ export class OffMemoryProvider {
7
+ id = 'off';
8
+ async recall() {
9
+ return [];
10
+ }
11
+ async remember(content) {
12
+ void content;
13
+ throw new Error('Memory backend is disabled.');
14
+ }
15
+ async forget() {
16
+ return false;
17
+ }
18
+ }
19
+ /**
20
+ * ICM adapter (rtk-ai/icm). Uses the `icm` CLI as the memory engine.
21
+ * Per-project isolation: every project gets its own ICM database under
22
+ * ~/.ineedcodes/projects/<project-id>/memory/ (plan §13).
23
+ */
24
+ export class ICMAdapter {
25
+ databasePath;
26
+ topic;
27
+ id = 'icm';
28
+ constructor(databasePath, topic) {
29
+ this.databasePath = databasePath;
30
+ this.topic = topic;
31
+ }
32
+ static forProject(projectId, projectRoot) {
33
+ const memoryDir = path.join(os.homedir(), '.ineedcodes', 'projects', projectId, 'memory');
34
+ const db = path.join(memoryDir, 'icm.db');
35
+ const topic = path.basename(projectRoot) || 'project';
36
+ return new ICMAdapter(db, topic);
37
+ }
38
+ async icm(args, timeoutMs = 30_000) {
39
+ // ICM creates the DB file, but the parent directory must exist first.
40
+ const { ensureDir } = await import('../util/fs.js');
41
+ const dbDir = this.databasePath.split(path.sep).slice(0, -1).join(path.sep);
42
+ await ensureDir(dbDir);
43
+ const result = await execShell(`icm ${args} --db ${shellQuote(this.databasePath)}${this.topic ? ` --topic ${shellQuote(this.topic)}` : ''}`, dbDir, timeoutMs);
44
+ return result;
45
+ }
46
+ async recall(query, limit = 5) {
47
+ if (!query.trim())
48
+ return [];
49
+ const result = await this.icm(`recall ${shellQuote(query)} --limit ${limit} --read-only`);
50
+ if (result.exitCode !== 0)
51
+ return [];
52
+ return parseRecallOutput(result.stdout);
53
+ }
54
+ async remember(content, tags = []) {
55
+ const keywords = tags.length ? ` -k ${shellQuote(tags.join(','))}` : '';
56
+ const result = await this.icm(`remember ${shellQuote(content)}${keywords}`);
57
+ if (result.exitCode !== 0) {
58
+ throw new Error(`ICM store failed: ${result.stderr.trim() || result.stdout.trim()}`);
59
+ }
60
+ const match = result.stdout.match(/Stored:\s*([A-Za-z0-9]+)/);
61
+ return {
62
+ id: match?.[1] ?? `icm-${Date.now()}`,
63
+ content,
64
+ tags,
65
+ createdAt: new Date().toISOString()
66
+ };
67
+ }
68
+ async forget(id) {
69
+ const result = await this.icm(`forget ${shellQuote(id)}`);
70
+ return result.exitCode === 0;
71
+ }
72
+ }
73
+ export function parseRecallOutput(stdout) {
74
+ const records = [];
75
+ for (const line of stdout.split('\n')) {
76
+ const trimmed = line.trim();
77
+ if (!trimmed || trimmed.startsWith('memories[') || !/^\d/.test(trimmed))
78
+ continue;
79
+ // Format: score,id,topic,importance,weight,summary
80
+ const parts = trimmed.split(',');
81
+ if (parts.length < 6)
82
+ continue;
83
+ records.push({
84
+ id: parts[1].trim(),
85
+ content: parts.slice(5).join(',').trim(),
86
+ tags: [parts[2].trim(), parts[3].trim()],
87
+ createdAt: '',
88
+ score: Number.parseFloat(parts[0] ?? '') || undefined
89
+ });
90
+ }
91
+ return records;
92
+ }
93
+ export function createMemoryProvider(backend, projectId, projectRoot) {
94
+ if (backend === 'off')
95
+ return new OffMemoryProvider();
96
+ return ICMAdapter.forProject(projectId, projectRoot);
97
+ }
98
+ //# sourceMappingURL=icm-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icm-adapter.js","sourceRoot":"","sources":["../../src/memory/icm-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { PermissionCategory, PermissionDecision, PermissionMode } from '../types.js';
2
+ /**
3
+ * Central permission engine. Permission decisions belong in the runtime,
4
+ * not only in the system prompt.
5
+ */
6
+ export declare class PermissionEngine {
7
+ private mode;
8
+ private workspaceRoot;
9
+ private allow;
10
+ private deny;
11
+ private approvals;
12
+ constructor(mode: PermissionMode, workspaceRoot: string, allow?: string[], deny?: string[]);
13
+ get currentMode(): PermissionMode;
14
+ setMode(mode: PermissionMode): void;
15
+ /**
16
+ * Check whether an action needing these categories is allowed.
17
+ * `detail` is a human-readable description used in approval prompts.
18
+ */
19
+ check(categories: PermissionCategory[], detail?: string): Promise<PermissionDecision>;
20
+ private checkOne;
21
+ private workspaceModeCheck;
22
+ private requireApproval;
23
+ /** Mark a category as approved for the rest of the session. */
24
+ approve(category: PermissionCategory): void;
25
+ revoke(category: PermissionCategory): void;
26
+ /** Convenience used by tools to validate a path is within the workspace. */
27
+ isInsideWorkspace(target: string): boolean;
28
+ }
@@ -0,0 +1,89 @@
1
+ import { isInsideRoot } from '../util/fs.js';
2
+ /**
3
+ * Central permission engine. Permission decisions belong in the runtime,
4
+ * not only in the system prompt.
5
+ */
6
+ export class PermissionEngine {
7
+ mode;
8
+ workspaceRoot;
9
+ allow;
10
+ deny;
11
+ approvals = new Map();
12
+ constructor(mode, workspaceRoot, allow = [], deny = []) {
13
+ this.mode = mode;
14
+ this.workspaceRoot = workspaceRoot;
15
+ this.allow = allow;
16
+ this.deny = deny;
17
+ }
18
+ get currentMode() {
19
+ return this.mode;
20
+ }
21
+ setMode(mode) {
22
+ this.mode = mode;
23
+ }
24
+ /**
25
+ * Check whether an action needing these categories is allowed.
26
+ * `detail` is a human-readable description used in approval prompts.
27
+ */
28
+ async check(categories, detail) {
29
+ for (const c of categories) {
30
+ if (this.deny.includes(c)) {
31
+ return { allowed: false, reason: `Permission category "${c}" is denied by configuration.` };
32
+ }
33
+ }
34
+ for (const c of categories) {
35
+ if (this.allow.includes(c))
36
+ continue;
37
+ const decision = this.checkOne(c, detail);
38
+ if (!decision.allowed)
39
+ return decision;
40
+ }
41
+ return { allowed: true };
42
+ }
43
+ checkOne(category, detail) {
44
+ switch (this.mode) {
45
+ case 'autonomous':
46
+ return { allowed: true };
47
+ case 'workspace':
48
+ return this.workspaceModeCheck(category, detail);
49
+ case 'ask':
50
+ return this.requireApproval(category, detail);
51
+ }
52
+ }
53
+ workspaceModeCheck(category, detail) {
54
+ switch (category) {
55
+ // Safe inside the selected workspace: allowed without interruption.
56
+ case 'read':
57
+ case 'write':
58
+ case 'execute':
59
+ case 'network':
60
+ return { allowed: true };
61
+ // High-impact operations always need approval.
62
+ case 'outside_workspace':
63
+ case 'git_remote':
64
+ case 'destructive':
65
+ case 'secret_access':
66
+ return this.requireApproval(category, detail);
67
+ }
68
+ }
69
+ requireApproval(category, detail) {
70
+ if (this.approvals.get(category))
71
+ return { allowed: true };
72
+ return {
73
+ allowed: false,
74
+ reason: `Action needs approval for "${category}"${detail ? `: ${detail}` : ''}. Approve with /permissions or choose the "autonomous" permission mode.`
75
+ };
76
+ }
77
+ /** Mark a category as approved for the rest of the session. */
78
+ approve(category) {
79
+ this.approvals.set(category, true);
80
+ }
81
+ revoke(category) {
82
+ this.approvals.delete(category);
83
+ }
84
+ /** Convenience used by tools to validate a path is within the workspace. */
85
+ isInsideWorkspace(target) {
86
+ return isInsideRoot(this.workspaceRoot, target);
87
+ }
88
+ }
89
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/permissions/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function isLikelySecretFile(filePath: string): boolean;
2
+ export declare function redactSecrets(text: string): string;
3
+ /** Guard used by read tools: refuse to dump secret file contents to the model. */
4
+ export declare function secretFileNotice(filePath: string): string;
@@ -0,0 +1,43 @@
1
+ import * as path from 'node:path';
2
+ /**
3
+ * Detect likely secret files and redact secret-looking values from text
4
+ * before that text reaches the model context or logs.
5
+ */
6
+ const SECRET_FILENAMES = new Set([
7
+ '.env', '.env.local', '.env.production', '.env.development',
8
+ 'id_rsa', 'id_ed25519', 'id_ecdsa',
9
+ 'credentials', 'credentials.json', '.npmrc', '.netrc'
10
+ ]);
11
+ const SECRET_PATTERNS = [
12
+ { name: 'private key', pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g },
13
+ { name: 'aws key', pattern: /AKIA[0-9A-Z]{16}/g },
14
+ { name: 'bearer token', pattern: /\b(?:Bearer|bearer)\s+[A-Za-z0-9\-._~+/]+=*/g },
15
+ { name: 'api key', pattern: /\b(?:api[_-]?key|apikey|token|secret|password)\b\s*[:=]\s*["']?[A-Za-z0-9\-._~+/]{12,}["']?/gi },
16
+ { name: 'github token', pattern: /\bgh[pousr]_[A-Za-z0-9]{36,}\b/g },
17
+ { name: 'openai key', pattern: /\bsk-[A-Za-z0-9\-_]{20,}\b/g },
18
+ { name: 'jwt', pattern: /\beyJ[A-Za-z0-9\-_]{10,}\.[A-Za-z0-9\-_]{10,}\.[A-Za-z0-9\-_]{10,}\b/g }
19
+ ];
20
+ export function isLikelySecretFile(filePath) {
21
+ const base = path.basename(filePath);
22
+ if (SECRET_FILENAMES.has(base))
23
+ return true;
24
+ if (base.startsWith('.env'))
25
+ return true;
26
+ // SSH keys and cloud credential directories.
27
+ if (filePath.includes('/.ssh/') || filePath.includes('/.aws/') || filePath.includes('/.gnupg/'))
28
+ return true;
29
+ return false;
30
+ }
31
+ export function redactSecrets(text) {
32
+ let out = text;
33
+ for (const { pattern } of SECRET_PATTERNS) {
34
+ out = out.replace(pattern, '[REDACTED]');
35
+ }
36
+ return out;
37
+ }
38
+ /** Guard used by read tools: refuse to dump secret file contents to the model. */
39
+ export function secretFileNotice(filePath) {
40
+ return `This file (${filePath}) looks like it contains secrets. Its contents are not shown automatically. ` +
41
+ 'If you truly need it, ask the user to approve secret access explicitly.';
42
+ }
43
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/security/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;GAGG;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB;IAC3D,QAAQ,EAAE,YAAY,EAAE,UAAU;IAClC,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ;CACtD,CAAC,CAAC;AAEH,MAAM,eAAe,GAAwC;IAC3D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,6EAA6E,EAAE;IAC/G,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE;IACjD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,8CAA8C,EAAE;IACjF,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,+FAA+F,EAAE;IAC7H,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iCAAiC,EAAE;IACpE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,6BAA6B,EAAE;IAC9D,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,uEAAuE,EAAE;CAClG,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,6CAA6C;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7G,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,eAAe,EAAE,CAAC;QAC1C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,cAAc,QAAQ,8EAA8E;QACzG,yEAAyE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { SessionState } from '../types.js';
2
+ /**
3
+ * Session persistence. Users can leave and resume work.
4
+ * This is deliberately separate from ICM: sessions are history,
5
+ * memory is durable knowledge.
6
+ */
7
+ export declare class SessionStore {
8
+ private readonly baseDir;
9
+ constructor(baseDir: string);
10
+ static default(): SessionStore;
11
+ private file;
12
+ save(state: SessionState): Promise<void>;
13
+ load(sessionId: string): Promise<SessionState | undefined>;
14
+ listForProject(projectRoot: string, limit?: number): Promise<SessionState[]>;
15
+ newId(): string;
16
+ }
@@ -0,0 +1,54 @@
1
+ import * as path from 'node:path';
2
+ import * as os from 'node:os';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { promises as fs } from 'node:fs';
5
+ import { readJson, writeJson, ensureDir } from '../util/fs.js';
6
+ /**
7
+ * Session persistence. Users can leave and resume work.
8
+ * This is deliberately separate from ICM: sessions are history,
9
+ * memory is durable knowledge.
10
+ */
11
+ export class SessionStore {
12
+ baseDir;
13
+ constructor(baseDir) {
14
+ this.baseDir = baseDir;
15
+ }
16
+ static default() {
17
+ return new SessionStore(path.join(os.homedir(), '.ineedcodes', 'sessions'));
18
+ }
19
+ file(sessionId) {
20
+ return path.join(this.baseDir, sessionId, 'session.json');
21
+ }
22
+ async save(state) {
23
+ state.updatedAt = new Date().toISOString();
24
+ await writeJson(this.file(state.sessionId), state);
25
+ }
26
+ async load(sessionId) {
27
+ return readJson(this.file(sessionId));
28
+ }
29
+ async listForProject(projectRoot, limit = 10) {
30
+ await ensureDir(this.baseDir);
31
+ let entries;
32
+ try {
33
+ entries = await fs.readdir(this.baseDir, { withFileTypes: true });
34
+ }
35
+ catch {
36
+ return [];
37
+ }
38
+ const sessions = [];
39
+ for (const entry of entries) {
40
+ if (!entry.isDirectory())
41
+ continue;
42
+ const state = await this.load(entry.name);
43
+ if (state && state.projectRoot === projectRoot) {
44
+ sessions.push(state);
45
+ }
46
+ }
47
+ sessions.sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : -1));
48
+ return sessions.slice(0, limit);
49
+ }
50
+ newId() {
51
+ return randomUUID();
52
+ }
53
+ }
54
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/D;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEhD,MAAM,CAAC,OAAO;QACZ,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,IAAI,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAmB;QAC5B,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,OAAO,QAAQ,CAAe,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,KAAK,GAAG,EAAE;QAClD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,KAAK;QACH,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { ProcessManagerLike, ShellProcessRecord } from '../types.js';
2
+ /**
3
+ * Tracks long-running shell processes so the agent can start a dev server,
4
+ * check on it, read its output, and stop it: without blocking the loop.
5
+ */
6
+ export declare class ProcessManager implements ProcessManagerLike {
7
+ private processes;
8
+ private children;
9
+ private nextFakePid;
10
+ start(command: string, cwd: string): Promise<ShellProcessRecord>;
11
+ status(pid: number): ShellProcessRecord | undefined;
12
+ list(): ShellProcessRecord[];
13
+ stop(pid: number): boolean;
14
+ /** Kill every tracked child before the runtime shuts down. */
15
+ drain(): void;
16
+ }
17
+ export interface ExecOutcome {
18
+ exitCode: number | null;
19
+ stdout: string;
20
+ stderr: string;
21
+ durationMs: number;
22
+ cwd: string;
23
+ timedOut: boolean;
24
+ }
25
+ /** Run a command to completion with a hard timeout. Output is captured, never fabricated. */
26
+ export declare function execShell(command: string, cwd: string, timeoutMs?: number, maxBuffer?: number): Promise<ExecOutcome>;
@@ -0,0 +1,128 @@
1
+ import { spawn } from 'node:child_process';
2
+ const MAX_BUFFER_PER_STREAM = 512 * 1024;
3
+ /**
4
+ * Tracks long-running shell processes so the agent can start a dev server,
5
+ * check on it, read its output, and stop it: without blocking the loop.
6
+ */
7
+ export class ProcessManager {
8
+ processes = new Map();
9
+ children = new Map();
10
+ nextFakePid = 1;
11
+ async start(command, cwd) {
12
+ const child = spawn(command, {
13
+ cwd,
14
+ shell: true,
15
+ stdio: ['ignore', 'pipe', 'pipe']
16
+ });
17
+ const record = {
18
+ pid: child.pid ?? this.nextFakePid++,
19
+ command,
20
+ cwd,
21
+ stdout: '',
22
+ stderr: '',
23
+ exited: false,
24
+ exitCode: null,
25
+ startedAt: Date.now()
26
+ };
27
+ child.stdout.on('data', (chunk) => {
28
+ record.stdout = appendCapped(record.stdout, chunk.toString('utf8'));
29
+ });
30
+ child.stderr.on('data', (chunk) => {
31
+ record.stderr = appendCapped(record.stderr, chunk.toString('utf8'));
32
+ });
33
+ child.on('error', (err) => {
34
+ record.stderr = appendCapped(record.stderr, `spawn error: ${err.message}\n`);
35
+ });
36
+ child.on('close', (code) => {
37
+ record.exited = true;
38
+ record.exitCode = code;
39
+ this.children.delete(record.pid);
40
+ });
41
+ this.processes.set(record.pid, record);
42
+ this.children.set(record.pid, child);
43
+ return record;
44
+ }
45
+ status(pid) {
46
+ return this.processes.get(pid);
47
+ }
48
+ list() {
49
+ return [...this.processes.values()];
50
+ }
51
+ stop(pid) {
52
+ const child = this.children.get(pid);
53
+ if (!child)
54
+ return false;
55
+ try {
56
+ child.kill('SIGTERM');
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ return true;
62
+ }
63
+ /** Kill every tracked child before the runtime shuts down. */
64
+ drain() {
65
+ for (const child of this.children.values()) {
66
+ try {
67
+ child.kill('SIGTERM');
68
+ }
69
+ catch {
70
+ // best effort
71
+ }
72
+ }
73
+ this.children.clear();
74
+ }
75
+ }
76
+ function appendCapped(current, add) {
77
+ const combined = current + add;
78
+ return combined.length > MAX_BUFFER_PER_STREAM
79
+ ? combined.slice(combined.length - MAX_BUFFER_PER_STREAM)
80
+ : combined;
81
+ }
82
+ /** Run a command to completion with a hard timeout. Output is captured, never fabricated. */
83
+ export function execShell(command, cwd, timeoutMs = 120_000, maxBuffer = 1_048_576) {
84
+ return new Promise((resolve) => {
85
+ const startedAt = Date.now();
86
+ const child = spawn(command, {
87
+ cwd,
88
+ shell: true,
89
+ env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' }
90
+ });
91
+ let stdout = '';
92
+ let stderr = '';
93
+ let timedOut = false;
94
+ let settled = false;
95
+ const timer = setTimeout(() => {
96
+ timedOut = true;
97
+ try {
98
+ child.kill('SIGTERM');
99
+ }
100
+ catch {
101
+ // best effort
102
+ }
103
+ }, timeoutMs);
104
+ const cap = (s) => s.length > maxBuffer ? s.slice(0, maxBuffer) : s;
105
+ child.stdout?.on('data', (c) => { stdout = cap(stdout + c.toString('utf8')); });
106
+ child.stderr?.on('data', (c) => { stderr = cap(stderr + c.toString('utf8')); });
107
+ const finish = (code) => {
108
+ if (settled)
109
+ return;
110
+ settled = true;
111
+ clearTimeout(timer);
112
+ resolve({
113
+ exitCode: code,
114
+ stdout,
115
+ stderr,
116
+ durationMs: Date.now() - startedAt,
117
+ cwd,
118
+ timedOut
119
+ });
120
+ };
121
+ child.on('error', (err) => {
122
+ stderr = cap(stderr + `spawn error: ${err.message}\n`);
123
+ finish(null);
124
+ });
125
+ child.on('close', (code) => finish(code));
126
+ });
127
+ }
128
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/shell/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Skill, SkillScope } from '../types.js';
2
+ export declare class SkillLoader {
3
+ private projectRoot;
4
+ constructor(projectRoot: string);
5
+ list(): Promise<Skill[]>;
6
+ find(name: string): Promise<Skill | undefined>;
7
+ private loadFrom;
8
+ }
9
+ export declare function parseSkillMd(raw: string, scope: SkillScope, source: string): Skill | undefined;