@curie-agent/core 0.2.4 → 0.3.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 (111) hide show
  1. package/LICENSE +179 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/channel-router.js +1 -1
  4. package/dist/src/channel-router.js.map +1 -1
  5. package/dist/src/context.d.ts +11 -0
  6. package/dist/src/context.d.ts.map +1 -0
  7. package/dist/src/context.js +80 -0
  8. package/dist/src/context.js.map +1 -0
  9. package/dist/src/cron-manager.d.ts +27 -8
  10. package/dist/src/cron-manager.d.ts.map +1 -1
  11. package/dist/src/cron-manager.js +121 -33
  12. package/dist/src/cron-manager.js.map +1 -1
  13. package/dist/src/event-bus.d.ts +71 -0
  14. package/dist/src/event-bus.d.ts.map +1 -1
  15. package/dist/src/event-bus.js.map +1 -1
  16. package/dist/src/heartbeat-delivery.d.ts +2 -0
  17. package/dist/src/heartbeat-delivery.d.ts.map +1 -1
  18. package/dist/src/heartbeat-delivery.js +20 -3
  19. package/dist/src/heartbeat-delivery.js.map +1 -1
  20. package/dist/src/heartbeat-executor.d.ts +36 -2
  21. package/dist/src/heartbeat-executor.d.ts.map +1 -1
  22. package/dist/src/heartbeat-executor.js +32 -40
  23. package/dist/src/heartbeat-executor.js.map +1 -1
  24. package/dist/src/identity-files.d.ts +29 -0
  25. package/dist/src/identity-files.d.ts.map +1 -0
  26. package/dist/src/identity-files.js +59 -0
  27. package/dist/src/identity-files.js.map +1 -0
  28. package/dist/src/index.d.ts +19 -4
  29. package/dist/src/index.d.ts.map +1 -1
  30. package/dist/src/index.js +13 -2
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/pricing.d.ts +29 -0
  33. package/dist/src/pricing.d.ts.map +1 -0
  34. package/dist/src/pricing.js +85 -0
  35. package/dist/src/pricing.js.map +1 -0
  36. package/dist/src/safety/command-guard.d.ts.map +1 -1
  37. package/dist/src/safety/command-guard.js +35 -1
  38. package/dist/src/safety/command-guard.js.map +1 -1
  39. package/dist/src/safety/path-guard.d.ts +7 -3
  40. package/dist/src/safety/path-guard.d.ts.map +1 -1
  41. package/dist/src/safety/path-guard.js +14 -5
  42. package/dist/src/safety/path-guard.js.map +1 -1
  43. package/dist/src/safety/snapshot.js +1 -1
  44. package/dist/src/safety/snapshot.js.map +1 -1
  45. package/dist/src/session-store.d.ts +3 -1
  46. package/dist/src/session-store.d.ts.map +1 -1
  47. package/dist/src/session-store.js +24 -1
  48. package/dist/src/session-store.js.map +1 -1
  49. package/dist/src/settings.d.ts +98 -1
  50. package/dist/src/settings.d.ts.map +1 -1
  51. package/dist/src/settings.js +363 -83
  52. package/dist/src/settings.js.map +1 -1
  53. package/dist/src/shell-detect.d.ts +12 -0
  54. package/dist/src/shell-detect.d.ts.map +1 -0
  55. package/dist/src/shell-detect.js +31 -0
  56. package/dist/src/shell-detect.js.map +1 -0
  57. package/dist/src/subagent-executor.d.ts +68 -0
  58. package/dist/src/subagent-executor.d.ts.map +1 -0
  59. package/dist/src/subagent-executor.js +289 -0
  60. package/dist/src/subagent-executor.js.map +1 -0
  61. package/dist/src/task-executor.d.ts +31 -0
  62. package/dist/src/task-executor.d.ts.map +1 -0
  63. package/dist/src/task-executor.js +91 -0
  64. package/dist/src/task-executor.js.map +1 -0
  65. package/dist/src/task-manager.d.ts +83 -0
  66. package/dist/src/task-manager.d.ts.map +1 -0
  67. package/dist/src/task-manager.js +308 -0
  68. package/dist/src/task-manager.js.map +1 -0
  69. package/dist/src/task-migration.d.ts +10 -0
  70. package/dist/src/task-migration.d.ts.map +1 -0
  71. package/dist/src/task-migration.js +144 -0
  72. package/dist/src/task-migration.js.map +1 -0
  73. package/dist/src/task-summary.d.ts +7 -0
  74. package/dist/src/task-summary.d.ts.map +1 -0
  75. package/dist/src/task-summary.js +34 -0
  76. package/dist/src/task-summary.js.map +1 -0
  77. package/dist/src/template-utils.d.ts +16 -0
  78. package/dist/src/template-utils.d.ts.map +1 -0
  79. package/dist/src/template-utils.js +72 -0
  80. package/dist/src/template-utils.js.map +1 -0
  81. package/dist/src/token-monitor.d.ts +50 -0
  82. package/dist/src/token-monitor.d.ts.map +1 -0
  83. package/dist/src/token-monitor.js +119 -0
  84. package/dist/src/token-monitor.js.map +1 -0
  85. package/dist/src/turn-loop.d.ts +10 -1
  86. package/dist/src/turn-loop.d.ts.map +1 -1
  87. package/dist/src/turn-loop.js +152 -23
  88. package/dist/src/turn-loop.js.map +1 -1
  89. package/dist/src/unified-task.d.ts +76 -0
  90. package/dist/src/unified-task.d.ts.map +1 -0
  91. package/dist/src/unified-task.js +196 -0
  92. package/dist/src/unified-task.js.map +1 -0
  93. package/package.json +16 -11
  94. package/templates/AGENTS.md +53 -0
  95. package/templates/HEARTBEAT.md +37 -0
  96. package/templates/MEMORY.md +29 -0
  97. package/templates/SOUL.md +28 -0
  98. package/templates/TOOLS.md +29 -0
  99. package/templates/USER.md +35 -0
  100. package/templates/WIKI.md +146 -0
  101. package/templates/settings.json +90 -0
  102. package/templates/skills/deep-research/SKILL.md +273 -0
  103. package/templates/skills/deep-research/references/report-structure.md +149 -0
  104. package/templates/skills/deep-research/references/topic-guides.md +151 -0
  105. package/templates/skills/planning/SKILL.md +222 -0
  106. package/templates/skills/planning/references/business.md +82 -0
  107. package/templates/skills/planning/references/creative.md +111 -0
  108. package/templates/skills/planning/references/events.md +109 -0
  109. package/templates/skills/planning/references/personal.md +107 -0
  110. package/templates/skills/planning/references/templates.md +279 -0
  111. package/templates/skills/wiki/SKILL.md +70 -0
@@ -1,6 +1,6 @@
1
1
  import { type ReasoningEffort, type ProviderStream, type Tool } from './turn-loop.js';
2
2
  import type { CurieSettings } from './settings.js';
3
- import type { ScheduleType } from './cron-manager.js';
3
+ import type { ScheduleType } from './unified-task.js';
4
4
  export interface HeartbeatExecutorConfig {
5
5
  provider: ProviderStream;
6
6
  model: string;
@@ -12,17 +12,50 @@ export interface HeartbeatExecutorConfig {
12
12
  maxTurns?: number;
13
13
  /** Which HEARTBEAT.md section to execute (times|daily|weekly|monthly). */
14
14
  scheduleType?: ScheduleType;
15
+ /** System prompt for the heartbeat turn loop. */
16
+ system?: string;
15
17
  }
16
18
  export interface HeartbeatResult {
17
19
  sessionId: string;
18
20
  text: string;
19
21
  toolCalls: number;
22
+ maxTurns?: number;
23
+ reason: string;
20
24
  usage: {
21
25
  inputTokens: number;
22
26
  outputTokens: number;
23
27
  };
24
28
  errors: string[];
25
29
  }
30
+ export interface BatchResult {
31
+ text: string;
32
+ toolCalls: number;
33
+ sessionId: string;
34
+ reason: string;
35
+ errors: string[];
36
+ }
37
+ /**
38
+ * Wraps TurnLoop with yolo (auto-approve) mode and collects
39
+ * text output, tool call count, and errors via EventBus subscriptions.
40
+ */
41
+ export declare class BatchTurnLoop {
42
+ private turnLoop;
43
+ private collectedText;
44
+ private toolCallCount;
45
+ private errors;
46
+ constructor(config: {
47
+ provider: ProviderStream;
48
+ model: string;
49
+ tools: Tool[];
50
+ cwd: string;
51
+ settings: CurieSettings;
52
+ effort?: ReasoningEffort;
53
+ maxTurns?: number;
54
+ system?: string;
55
+ type?: string;
56
+ });
57
+ run(prompt: string): Promise<BatchResult>;
58
+ }
26
59
  export declare class HeartbeatExecutor {
27
60
  private config;
28
61
  private heartbeatDir;
@@ -30,6 +63,7 @@ export declare class HeartbeatExecutor {
30
63
  execute(): Promise<HeartbeatResult>;
31
64
  private readHeartbeatMd;
32
65
  private gatherContext;
33
- private buildPrompt;
66
+ private buildSystemPrompt;
67
+ private buildUserInstruction;
34
68
  }
35
69
  //# sourceMappingURL=heartbeat-executor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-executor.d.ts","sourceRoot":"","sources":["../../src/heartbeat-executor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA8FD,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,YAAY,CAAS;gBAET,MAAM,EAAE,uBAAuB;IAI7C,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IA+BzC,OAAO,CAAC,eAAe;YAQT,aAAa;IAoC3B,OAAO,CAAC,WAAW;CA6BpB"}
1
+ {"version":3,"file":"heartbeat-executor.d.ts","sourceRoot":"","sources":["../../src/heartbeat-executor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAY,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE;QAClB,QAAQ,EAAE,cAAc,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,IAAI,EAAE,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,aAAa,CAAC;QACxB,MAAM,CAAC,EAAE,eAAe,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IAgBK,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAwBhD;AA2BD,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,YAAY,CAAS;gBAET,MAAM,EAAE,uBAAuB;IAI7C,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAqCzC,OAAO,CAAC,eAAe;YAQT,aAAa;IAmC3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,oBAAoB;CAM7B"}
@@ -2,26 +2,29 @@ import { homedir } from 'node:os';
2
2
  import { join } from 'node:path';
3
3
  import { readFileSync, existsSync } from 'node:fs';
4
4
  import { TurnLoop } from './turn-loop.js';
5
+ import { readTaskSummary } from './task-summary.js';
5
6
  /**
6
7
  * Wraps TurnLoop with yolo (auto-approve) mode and collects
7
8
  * text output, tool call count, and errors via EventBus subscriptions.
8
9
  */
9
- class BatchTurnLoop {
10
+ export class BatchTurnLoop {
10
11
  turnLoop;
11
12
  collectedText = '';
12
13
  toolCallCount = 0;
13
14
  errors = [];
14
15
  constructor(config) {
16
+ const approvalMode = config.settings.heartbeat?.mode || 'yolo';
15
17
  this.turnLoop = new TurnLoop({
16
18
  provider: config.provider,
17
19
  model: config.model,
18
20
  tools: config.tools,
19
21
  cwd: config.cwd,
20
22
  settings: config.settings,
21
- approvalMode: 'yolo',
23
+ approvalMode,
22
24
  effort: config.effort,
23
25
  maxTurns: config.maxTurns,
24
26
  system: config.system,
27
+ type: config.type || 'heartbeat',
25
28
  });
26
29
  }
27
30
  async run(prompt) {
@@ -59,7 +62,7 @@ AI AGENT INSTRUCTIONS: This file dictates your periodic proactive routine. Execu
59
62
 
60
63
  ## Data Ingestion & State Check
61
64
  Scan and load the current state of:
62
- - TODO.md: Parse active tasks
65
+ - tasks.json (or todo.json): Parse active tasks in the current project
63
66
  - Short-Term Memory: Ingest recent daily logs from ~/.curie-agent/memory/
64
67
 
65
68
  ## Synthesis & Insight Generation
@@ -72,7 +75,7 @@ Cross-reference ingested data to formulate proactive insights (1-3 concise, acti
72
75
  ## User Output (The Heartbeat Brief)
73
76
  Generate a strictly formatted status report:
74
77
  - Insights: [Brief bullet points]
75
- - Proposed Actions: [Tasks ready to be added to TODO.md]
78
+ - Proposed Actions: [Tasks ready to be added to tasks.json]
76
79
  - System Status: [Confirmation of updates]`;
77
80
  export class HeartbeatExecutor {
78
81
  config;
@@ -84,10 +87,12 @@ export class HeartbeatExecutor {
84
87
  async execute() {
85
88
  // 1. Read HEARTBEAT.md instructions
86
89
  const heartbeatProtocol = this.readHeartbeatMd();
87
- // 2. Gather context
90
+ // 2. Gather context (MEMORY.md, USER.md, tasks summary — no AGENTS.md dup)
88
91
  const context = await this.gatherContext();
89
- // 3. Build prompt with schedule-type header
90
- const prompt = this.buildPrompt(heartbeatProtocol, context, this.config.scheduleType);
92
+ // 3. Build system prompt with protocol + context; user gets minimal instruction
93
+ const fullSystem = this.buildSystemPrompt(heartbeatProtocol, context);
94
+ const baseSystem = this.config.system || 'You are running a Heartbeat cycle.';
95
+ const userInstruction = this.buildUserInstruction(this.config.scheduleType);
91
96
  // 4. Run batch turn loop
92
97
  const batchResult = await new BatchTurnLoop({
93
98
  provider: this.config.provider,
@@ -97,12 +102,16 @@ export class HeartbeatExecutor {
97
102
  settings: this.config.settings,
98
103
  effort: this.config.effort,
99
104
  maxTurns: this.config.maxTurns ?? 30,
100
- system: `You are running a Heartbeat cycle. Follow the instructions in the prompt carefully. Use tools to gather data, analyze, and produce the final Heartbeat Brief.`,
101
- }).run(prompt);
105
+ // baseSystem (AGENTS.md + skills) is enriched by withDateContext() in TurnLoop
106
+ system: fullSystem ? `${baseSystem}\n\n${fullSystem}` : baseSystem,
107
+ }).run(userInstruction);
108
+ const maxTurns = this.config.maxTurns ?? 30;
102
109
  return {
103
110
  sessionId: batchResult.sessionId,
104
111
  text: batchResult.text,
105
112
  toolCalls: batchResult.toolCalls,
113
+ maxTurns,
114
+ reason: batchResult.reason,
106
115
  usage: { inputTokens: 0, outputTokens: 0 },
107
116
  errors: batchResult.errors,
108
117
  };
@@ -126,15 +135,16 @@ export class HeartbeatExecutor {
126
135
  if (existsSync(userPath)) {
127
136
  sections.push('=== USER.md ===\n' + readFileSync(userPath, 'utf-8'));
128
137
  }
129
- // Gather AGENTS.md
130
- const agentsPath = join(this.heartbeatDir, 'AGENTS.md');
131
- if (existsSync(agentsPath)) {
132
- sections.push('=== AGENTS.md ===\n' + readFileSync(agentsPath, 'utf-8'));
138
+ // Gather project tasks/todo file from cwd (try unified format first, fall back to legacy)
139
+ const taskPath = join(this.config.cwd, 'tasks.json');
140
+ if (!existsSync(taskPath)) {
141
+ const todoPath = join(this.config.cwd, 'todo.json');
142
+ if (existsSync(todoPath)) {
143
+ sections.push('=== Project Tasks ===\n' + readTaskSummary(todoPath));
144
+ }
133
145
  }
134
- // Gather TODO.md from cwd
135
- const todoPath = join(this.config.cwd, 'TODO.md');
136
- if (existsSync(todoPath)) {
137
- sections.push('=== TODO.md ===\n' + readFileSync(todoPath, 'utf-8'));
146
+ else {
147
+ sections.push('=== Project Tasks ===\n' + readTaskSummary(taskPath));
138
148
  }
139
149
  // Gather daily memory logs (last 3)
140
150
  const memoryDir = join(this.heartbeatDir, 'memory');
@@ -143,32 +153,14 @@ export class HeartbeatExecutor {
143
153
  }
144
154
  return sections.join('\n\n');
145
155
  }
146
- buildPrompt(protocol, context, scheduleType) {
156
+ buildSystemPrompt(protocol, context) {
157
+ return ['=== HEARTBEAT PROTOCOL ===', protocol, '', '=== GATHERED CONTEXT ===', context].join('\n');
158
+ }
159
+ buildUserInstruction(scheduleType) {
147
160
  const scheduleHint = scheduleType
148
161
  ? `Execute the **${scheduleType}** section of the HEARTBEAT protocol.\n`
149
162
  : '';
150
- const now = new Date().toLocaleString('en-US', {
151
- weekday: 'long',
152
- year: 'numeric',
153
- month: 'long',
154
- day: 'numeric',
155
- hour: '2-digit',
156
- minute: '2-digit',
157
- second: '2-digit',
158
- hour12: false,
159
- });
160
- return [
161
- '=== HEARTBEAT PROTOCOL ===',
162
- protocol,
163
- '',
164
- '=== GATHERED CONTEXT ===',
165
- context,
166
- '',
167
- '=== CURRENT TIME ===',
168
- now,
169
- '',
170
- `${scheduleHint}Please now execute the Heartbeat protocol using the gathered context. Produce the final Heartbeat Brief as specified in the protocol.`,
171
- ].join('\n');
163
+ return `${scheduleHint}Please now execute the Heartbeat protocol using the gathered context. Produce the final Heartbeat Brief as specified in the protocol.`;
172
164
  }
173
165
  }
174
166
  //# sourceMappingURL=heartbeat-executor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-executor.js","sourceRoot":"","sources":["../../src/heartbeat-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat-executor.js","sourceRoot":"","sources":["../../src/heartbeat-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type ProviderName = 'anthropic' | 'openai' | 'local' | 'openrouter' | 'ollama';
2
+ export interface InitData {
3
+ provider: ProviderName | null;
4
+ apiKey: string | null;
5
+ model: string | null;
6
+ soul: {
7
+ name: string;
8
+ vibe: string;
9
+ };
10
+ user: {
11
+ name: string;
12
+ timezone: string;
13
+ languages: string;
14
+ };
15
+ agentsAccepted: boolean;
16
+ }
17
+ /**
18
+ * Create identity files by copying bundled templates from disk and interpolating
19
+ * user-specific placeholders ({{SOUL_NAME}}, {{USER_NAME}}, etc.).
20
+ */
21
+ export declare function createIdentityFilesFromTemplates(data: InitData, templatesDir: string): void;
22
+ /**
23
+ * Full init: create identity files from templates + copy bundled skills.
24
+ * Throws if templates directory cannot be resolved.
25
+ */
26
+ export declare function createIdentityFilesAuto(data: InitData): void;
27
+ /** @deprecated Use createIdentityFilesAuto() instead. */
28
+ export declare function createIdentityFiles(data: InitData): void;
29
+ //# sourceMappingURL=identity-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-files.d.ts","sourceRoot":"","sources":["../../src/identity-files.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEtF,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,cAAc,EAAE,OAAO,CAAC;CACzB;AAiBD;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAwB3F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAO5D;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAExD"}
@@ -0,0 +1,59 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { getCurieDir, copyTemplateFile, copyInitSkills, resolveTemplatesDir } from './template-utils.js';
5
+ function CurieDir() {
6
+ return path.join(os.homedir(), '.curie-agent');
7
+ }
8
+ function writeCurieFile(name, content) {
9
+ const dir = CurieDir();
10
+ if (!fs.existsSync(dir)) {
11
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
12
+ }
13
+ fs.writeFileSync(path.join(dir, name), content, 'utf-8');
14
+ }
15
+ /** Template files that should be copied from disk with interpolation. */
16
+ const TEMPLATE_FILES = ['AGENTS.md', 'SOUL.md', 'USER.md', 'MEMORY.md', 'TOOLS.md', 'HEARTBEAT.md'];
17
+ /**
18
+ * Create identity files by copying bundled templates from disk and interpolating
19
+ * user-specific placeholders ({{SOUL_NAME}}, {{USER_NAME}}, etc.).
20
+ */
21
+ export function createIdentityFilesFromTemplates(data, templatesDir) {
22
+ const targetDir = getCurieDir();
23
+ const timestamp = new Date().toISOString();
24
+ const dateStr = timestamp.split('T')[0] ?? '';
25
+ const templateData = {
26
+ SOUL_NAME: data.soul.name || 'Curie',
27
+ SOUL_VIBE: data.soul.vibe || 'AI coding assistant — sharp, resourceful, gets things done',
28
+ USER_NAME: data.user.name || '(Your name)',
29
+ USER_TIMEZONE: data.user.timezone || '(UTC)',
30
+ USER_LANGUAGES: data.user.languages || 'TypeScript, Python',
31
+ TIMESTAMP: dateStr,
32
+ };
33
+ for (const file of TEMPLATE_FILES) {
34
+ copyTemplateFile(templatesDir, file, targetDir, templateData);
35
+ }
36
+ // tasks.json — always create fresh
37
+ writeCurieFile('tasks.json', JSON.stringify({
38
+ $schema: 'tasks.schema.json',
39
+ version: 1,
40
+ tasks: [],
41
+ }, null, 2));
42
+ }
43
+ /**
44
+ * Full init: create identity files from templates + copy bundled skills.
45
+ * Throws if templates directory cannot be resolved.
46
+ */
47
+ export function createIdentityFilesAuto(data) {
48
+ const templatesDir = resolveTemplatesDir();
49
+ if (!templatesDir) {
50
+ throw new Error('Failed to resolve templates directory. Identity files cannot be created without bundled templates.');
51
+ }
52
+ createIdentityFilesFromTemplates(data, templatesDir);
53
+ copyInitSkills(templatesDir);
54
+ }
55
+ /** @deprecated Use createIdentityFilesAuto() instead. */
56
+ export function createIdentityFiles(data) {
57
+ createIdentityFilesAuto(data);
58
+ }
59
+ //# sourceMappingURL=identity-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-files.js","sourceRoot":"","sources":["../../src/identity-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAazG,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,yEAAyE;AACzE,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAEpG;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,IAAc,EAAE,YAAoB;IACnF,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9C,MAAM,YAAY,GAAG;QACnB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO;QACpC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,4DAA4D;QACzF,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,aAAa;QAC1C,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO;QAC5C,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,oBAAoB;QAC3D,SAAS,EAAE,OAAO;KACnB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,gBAAgB,CAAC,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC;IAED,mCAAmC;IACnC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;QAC1C,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,EAAE;KACV,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAc;IACpD,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC,CAAC;IACxH,CAAC;IACD,gCAAgC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACrD,cAAc,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -5,11 +5,15 @@ export type { SessionInfo, SessionFile } from './session-store.js';
5
5
  export { PermissionEngine } from './permission.js';
6
6
  export type { ApprovalMode, PermissionRule, PermissionResult, PermissionDecision } from './permission.js';
7
7
  export { TurnLoop } from './turn-loop.js';
8
- export type { TurnLoopConfig, TurnLoopResult, ReasoningEffort, Message, AssistantBlock } from './turn-loop.js';
8
+ export type { TurnLoopConfig, TurnLoopResult, ReasoningEffort, Message, AssistantBlock, ProviderStream, Tool, ProviderEvent } from './turn-loop.js';
9
9
  export { SettingsManager } from './settings.js';
10
10
  export type { CurieSettings } from './settings.js';
11
11
  export { DEFAULT_SETTINGS } from './settings.js';
12
- export { CronManager } from './cron-manager.js';
12
+ export { TaskManager } from './task-manager.js';
13
+ export type { UnifiedTask, TasksFile, ScheduleType, TaskMode, TaskStatus, TaskPriority, TaskScope } from './unified-task.js';
14
+ export { scheduleLabel, createTaskDefaults, generateTaskId, taskTimestamp } from './unified-task.js';
15
+ export { migrateTasks } from './task-migration.js';
16
+ export { readTaskSummary } from './task-summary.js';
13
17
  export { parseReminderTime } from './reminder-parser.js';
14
18
  export { TelegramGateway } from './telegram-gateway.js';
15
19
  export type { TelegramMessageContext } from './telegram-gateway.js';
@@ -19,8 +23,19 @@ export { ChannelRouter } from './channel-router.js';
19
23
  export type { RouteResult } from './channel-router.js';
20
24
  export { HeartbeatExecutor } from './heartbeat-executor.js';
21
25
  export type { HeartbeatExecutorConfig, HeartbeatResult } from './heartbeat-executor.js';
22
- export type { ScheduleType, CronTask } from './cron-manager.js';
23
- export { pickNextSchedule, scheduleLabel } from './cron-manager.js';
26
+ export { pickNextSchedule, computeNextFire } from './unified-task.js';
24
27
  export { HeartbeatDelivery } from './heartbeat-delivery.js';
25
28
  export type { HeartbeatDeliveryConfig } from './heartbeat-delivery.js';
29
+ export { BatchTurnLoop } from './heartbeat-executor.js';
30
+ export type { BatchResult } from './heartbeat-executor.js';
31
+ export { SubagentExecutor } from './subagent-executor.js';
32
+ export type { SubagentConfig, SubagentHandle } from './subagent-executor.js';
33
+ export { TokenMonitor, parseTieredPricing, selectTier, estimateCost, type PriceTier } from './token-monitor.js';
34
+ export type { TokenMonitorConfig, TokenEvent } from './token-monitor.js';
35
+ export { withDateContext, formatDate } from './context.js';
36
+ export { listSnapshots, revertTo, createSnapshot } from './safety/snapshot.js';
37
+ export { isPathAllowed, resolveSafePath, parseAllowlist, curieAgentDir } from './safety/path-guard.js';
38
+ export { createIdentityFiles, createIdentityFilesFromTemplates, createIdentityFilesAuto } from './identity-files.js';
39
+ export type { InitData, ProviderName } from './identity-files.js';
40
+ export { copyInitSkills, interpolateTemplate, copyTemplateFile, copyDirectoryRecursive, getCurieDir, resolveTemplatesDir } from './template-utils.js';
26
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxF,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -4,12 +4,23 @@ export { PermissionEngine } from './permission.js';
4
4
  export { TurnLoop } from './turn-loop.js';
5
5
  export { SettingsManager } from './settings.js';
6
6
  export { DEFAULT_SETTINGS } from './settings.js';
7
- export { CronManager } from './cron-manager.js';
7
+ export { TaskManager } from './task-manager.js';
8
+ export { scheduleLabel, createTaskDefaults, generateTaskId, taskTimestamp } from './unified-task.js';
9
+ export { migrateTasks } from './task-migration.js';
10
+ export { readTaskSummary } from './task-summary.js';
8
11
  export { parseReminderTime } from './reminder-parser.js';
9
12
  export { TelegramGateway } from './telegram-gateway.js';
10
13
  export { ChannelRegistry } from './channel-registry.js';
11
14
  export { ChannelRouter } from './channel-router.js';
12
15
  export { HeartbeatExecutor } from './heartbeat-executor.js';
13
- export { pickNextSchedule, scheduleLabel } from './cron-manager.js';
16
+ export { pickNextSchedule, computeNextFire } from './unified-task.js';
14
17
  export { HeartbeatDelivery } from './heartbeat-delivery.js';
18
+ export { BatchTurnLoop } from './heartbeat-executor.js';
19
+ export { SubagentExecutor } from './subagent-executor.js';
20
+ export { TokenMonitor, parseTieredPricing, selectTier, estimateCost } from './token-monitor.js';
21
+ export { withDateContext, formatDate } from './context.js';
22
+ export { listSnapshots, revertTo, createSnapshot } from './safety/snapshot.js';
23
+ export { isPathAllowed, resolveSafePath, parseAllowlist, curieAgentDir } from './safety/path-guard.js';
24
+ export { createIdentityFiles, createIdentityFilesFromTemplates, createIdentityFilesAuto } from './identity-files.js';
25
+ export { copyInitSkills, interpolateTemplate, copyTemplateFile, copyDirectoryRecursive, getCurieDir, resolveTemplatesDir } from './template-utils.js';
15
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAkB,MAAM,oBAAoB,CAAC;AAEhH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAErH,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface PriceTier {
2
+ threshold?: number;
3
+ in: number;
4
+ out: number;
5
+ }
6
+ /**
7
+ * Parse a MODEL_COST string into structured tiers.
8
+ *
9
+ * Flat format: "0.25;1.50" → single tier with no threshold.
10
+ * Tiered format: "0.25;1.50|200000<1.0;4.0" → base tier + one or more thresholded tiers.
11
+ *
12
+ * Tiers are separated by '|'. Each tiered segment uses "threshold<input;output>".
13
+ * Returns empty array if the string is malformed.
14
+ */
15
+ export declare function parseTieredPricing(cost: string): PriceTier[];
16
+ /**
17
+ * Select the pricing tier applicable for a given total token count.
18
+ * Walks tiers top-to-bottom; the highest threshold that totalTokens >= threshold wins.
19
+ * Falls back to the base tier (index 0) if no threshold is exceeded.
20
+ */
21
+ export declare function selectTier(tiers: PriceTier[], totalTokens: number): [number, number];
22
+ /**
23
+ * Estimate the USD cost of a token exchange given model and optional custom pricing.
24
+ *
25
+ * Uses custom pricing (flat or tiered) when provided, otherwise falls back
26
+ * to hardcoded Claude model rates.
27
+ */
28
+ export declare function estimateCost(model: string, inputTokens: number, outputTokens: number, customCost?: string): number;
29
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/pricing.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA8B5D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQpF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAmBR"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Parse a MODEL_COST string into structured tiers.
3
+ *
4
+ * Flat format: "0.25;1.50" → single tier with no threshold.
5
+ * Tiered format: "0.25;1.50|200000<1.0;4.0" → base tier + one or more thresholded tiers.
6
+ *
7
+ * Tiers are separated by '|'. Each tiered segment uses "threshold<input;output>".
8
+ * Returns empty array if the string is malformed.
9
+ */
10
+ export function parseTieredPricing(cost) {
11
+ // If no tier delimiter '|', treat as flat pricing (backward compatible)
12
+ if (!cost.includes('|')) {
13
+ const [inStr = '', outStr = ''] = cost.split(';');
14
+ const inC = parseFloat(inStr);
15
+ const outC = parseFloat(outStr);
16
+ if (!isNaN(inC) && !isNaN(outC))
17
+ return [{ in: inC, out: outC }];
18
+ return [];
19
+ }
20
+ const rawTiers = cost.split('|').map(s => s.trim());
21
+ const tiers = [];
22
+ const [inStr = '', outStr = ''] = rawTiers[0]?.split(';') ?? ['', ''];
23
+ const baseIn = parseFloat(inStr);
24
+ const baseOut = parseFloat(outStr);
25
+ if (isNaN(baseIn) || isNaN(baseOut))
26
+ return [];
27
+ tiers.push({ in: baseIn, out: baseOut });
28
+ for (let i = 1; i < rawTiers.length; i++) {
29
+ const tier = rawTiers[i];
30
+ // Tiered segment: "threshold<input;output>"
31
+ const pipeIdx = tier.indexOf('<');
32
+ if (pipeIdx === -1)
33
+ break;
34
+ const threshold = parseInt(tier.substring(0, pipeIdx).trim(), 10);
35
+ const rest = tier.substring(pipeIdx + 1).trim();
36
+ const [tierInStr = '', tierOutStr = ''] = rest.split(';');
37
+ const tierIn = parseFloat(tierInStr);
38
+ const tierOut = parseFloat(tierOutStr);
39
+ if (isNaN(threshold) || isNaN(tierIn) || isNaN(tierOut))
40
+ break;
41
+ tiers.push({ threshold, in: tierIn, out: tierOut });
42
+ }
43
+ return tiers;
44
+ }
45
+ /**
46
+ * Select the pricing tier applicable for a given total token count.
47
+ * Walks tiers top-to-bottom; the highest threshold that totalTokens >= threshold wins.
48
+ * Falls back to the base tier (index 0) if no threshold is exceeded.
49
+ */
50
+ export function selectTier(tiers, totalTokens) {
51
+ let result = [tiers[0]?.in ?? 0, tiers[0]?.out ?? 0];
52
+ for (const tier of tiers) {
53
+ if (tier.threshold !== undefined && totalTokens >= tier.threshold) {
54
+ result = [tier.in, tier.out];
55
+ }
56
+ }
57
+ return result;
58
+ }
59
+ /**
60
+ * Estimate the USD cost of a token exchange given model and optional custom pricing.
61
+ *
62
+ * Uses custom pricing (flat or tiered) when provided, otherwise falls back
63
+ * to hardcoded Claude model rates.
64
+ */
65
+ export function estimateCost(model, inputTokens, outputTokens, customCost) {
66
+ if (customCost) {
67
+ const tiers = parseTieredPricing(customCost);
68
+ if (tiers.length > 0) {
69
+ const [inC, outC] = selectTier(tiers, inputTokens + outputTokens);
70
+ if (!isNaN(inC) && !isNaN(outC)) {
71
+ return (inputTokens * inC + outputTokens * outC) / 1_000_000;
72
+ }
73
+ }
74
+ }
75
+ // Rough per-million-token pricing in USD; fall back to Sonnet rates.
76
+ const pricing = {
77
+ 'claude-opus': { in: 15, out: 75 },
78
+ 'claude-sonnet': { in: 3, out: 15 },
79
+ 'claude-haiku': { in: 0.8, out: 4 },
80
+ };
81
+ const key = Object.keys(pricing).find(k => model.includes(k)) || 'claude-sonnet';
82
+ const p = pricing[key];
83
+ return (inputTokens * p.in + outputTokens * p.out) / 1_000_000;
84
+ }
85
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/pricing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command-guard.d.ts","sourceRoot":"","sources":["../../../src/safety/command-guard.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyFD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAgB9D"}
1
+ {"version":3,"file":"command-guard.d.ts","sourceRoot":"","sources":["../../../src/safety/command-guard.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2HD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAgB9D"}
@@ -40,9 +40,22 @@ const HARD_DENY_PATTERNS = [
40
40
  reason: 'sudo escalation combined with destructive command',
41
41
  },
42
42
  {
43
- regex: /(?:cat|grep|less|more|head|tail)\s+.*\/\.curie-agent\/settings\.json/i,
43
+ regex: /(?:cat|grep|less|more|head|tail)\s+.*\.curie-settings\.json/i,
44
44
  reason: 'reading curie-agent settings file (contains API keys and secrets)',
45
45
  },
46
+ // PowerShell equivalents
47
+ {
48
+ regex: /Remove-Item\s+.*(?:-Recurse|-Force).*(?:-Force|-Recurse)\s+[\/\\C-Z:]/i,
49
+ reason: 'PowerShell Remove-Item: recursive force delete of root or drive path',
50
+ },
51
+ {
52
+ regex: /Get-Content\s+.*\.curie-settings\.json/i,
53
+ reason: 'PowerShell: reading curie-agent settings file (contains API keys and secrets)',
54
+ },
55
+ {
56
+ regex: /Set-Content\s+.*\\\\\.\\PhysicalDrive/i,
57
+ reason: 'PowerShell: raw disk write to physical drive',
58
+ },
46
59
  ];
47
60
  const ASK_PATTERNS = [
48
61
  {
@@ -77,6 +90,27 @@ const ASK_PATTERNS = [
77
90
  regex: /(?:grep|cat)\s+.*\/\.env\b/i,
78
91
  reason: 'env file read: accessing .env file contents',
79
92
  },
93
+ // PowerShell equivalents
94
+ {
95
+ regex: /Invoke-Expression\s*\(?\s*(?:Invoke-WebRequest|iwr|curl|wget)\b/i,
96
+ reason: 'PowerShell: remote code execution via Invoke-Expression + web download',
97
+ },
98
+ {
99
+ regex: /\biex\s*\(?\s*(?:iwr|curl|wget)\b/i,
100
+ reason: 'PowerShell: remote code execution via iex alias',
101
+ },
102
+ {
103
+ regex: /Start-Process\s+.*-Verb\s+RunAs\b/i,
104
+ reason: 'PowerShell: UAC elevation request (sudo equivalent)',
105
+ },
106
+ {
107
+ regex: /Get-Content\s+.*\.env\b/i,
108
+ reason: 'PowerShell: env file read via Get-Content',
109
+ },
110
+ {
111
+ regex: /Get-Content\s+.*(?:\.ssh[\/\\]|\.aws[\/\\]|id_rsa|credentials\.json)/i,
112
+ reason: 'PowerShell: credential file read via Get-Content',
113
+ },
80
114
  ];
81
115
  export function classifyCommand(command) {
82
116
  const normalized = command.replace(/\s+/g, ' ').trim();