@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.
- package/LICENSE +179 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/channel-router.js +1 -1
- package/dist/src/channel-router.js.map +1 -1
- package/dist/src/context.d.ts +11 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +80 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/cron-manager.d.ts +27 -8
- package/dist/src/cron-manager.d.ts.map +1 -1
- package/dist/src/cron-manager.js +121 -33
- package/dist/src/cron-manager.js.map +1 -1
- package/dist/src/event-bus.d.ts +71 -0
- package/dist/src/event-bus.d.ts.map +1 -1
- package/dist/src/event-bus.js.map +1 -1
- package/dist/src/heartbeat-delivery.d.ts +2 -0
- package/dist/src/heartbeat-delivery.d.ts.map +1 -1
- package/dist/src/heartbeat-delivery.js +20 -3
- package/dist/src/heartbeat-delivery.js.map +1 -1
- package/dist/src/heartbeat-executor.d.ts +36 -2
- package/dist/src/heartbeat-executor.d.ts.map +1 -1
- package/dist/src/heartbeat-executor.js +32 -40
- package/dist/src/heartbeat-executor.js.map +1 -1
- package/dist/src/identity-files.d.ts +29 -0
- package/dist/src/identity-files.d.ts.map +1 -0
- package/dist/src/identity-files.js +59 -0
- package/dist/src/identity-files.js.map +1 -0
- package/dist/src/index.d.ts +19 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/pricing.d.ts +29 -0
- package/dist/src/pricing.d.ts.map +1 -0
- package/dist/src/pricing.js +85 -0
- package/dist/src/pricing.js.map +1 -0
- package/dist/src/safety/command-guard.d.ts.map +1 -1
- package/dist/src/safety/command-guard.js +35 -1
- package/dist/src/safety/command-guard.js.map +1 -1
- package/dist/src/safety/path-guard.d.ts +7 -3
- package/dist/src/safety/path-guard.d.ts.map +1 -1
- package/dist/src/safety/path-guard.js +14 -5
- package/dist/src/safety/path-guard.js.map +1 -1
- package/dist/src/safety/snapshot.js +1 -1
- package/dist/src/safety/snapshot.js.map +1 -1
- package/dist/src/session-store.d.ts +3 -1
- package/dist/src/session-store.d.ts.map +1 -1
- package/dist/src/session-store.js +24 -1
- package/dist/src/session-store.js.map +1 -1
- package/dist/src/settings.d.ts +98 -1
- package/dist/src/settings.d.ts.map +1 -1
- package/dist/src/settings.js +363 -83
- package/dist/src/settings.js.map +1 -1
- package/dist/src/shell-detect.d.ts +12 -0
- package/dist/src/shell-detect.d.ts.map +1 -0
- package/dist/src/shell-detect.js +31 -0
- package/dist/src/shell-detect.js.map +1 -0
- package/dist/src/subagent-executor.d.ts +68 -0
- package/dist/src/subagent-executor.d.ts.map +1 -0
- package/dist/src/subagent-executor.js +289 -0
- package/dist/src/subagent-executor.js.map +1 -0
- package/dist/src/task-executor.d.ts +31 -0
- package/dist/src/task-executor.d.ts.map +1 -0
- package/dist/src/task-executor.js +91 -0
- package/dist/src/task-executor.js.map +1 -0
- package/dist/src/task-manager.d.ts +83 -0
- package/dist/src/task-manager.d.ts.map +1 -0
- package/dist/src/task-manager.js +308 -0
- package/dist/src/task-manager.js.map +1 -0
- package/dist/src/task-migration.d.ts +10 -0
- package/dist/src/task-migration.d.ts.map +1 -0
- package/dist/src/task-migration.js +144 -0
- package/dist/src/task-migration.js.map +1 -0
- package/dist/src/task-summary.d.ts +7 -0
- package/dist/src/task-summary.d.ts.map +1 -0
- package/dist/src/task-summary.js +34 -0
- package/dist/src/task-summary.js.map +1 -0
- package/dist/src/template-utils.d.ts +16 -0
- package/dist/src/template-utils.d.ts.map +1 -0
- package/dist/src/template-utils.js +72 -0
- package/dist/src/template-utils.js.map +1 -0
- package/dist/src/token-monitor.d.ts +50 -0
- package/dist/src/token-monitor.d.ts.map +1 -0
- package/dist/src/token-monitor.js +119 -0
- package/dist/src/token-monitor.js.map +1 -0
- package/dist/src/turn-loop.d.ts +10 -1
- package/dist/src/turn-loop.d.ts.map +1 -1
- package/dist/src/turn-loop.js +152 -23
- package/dist/src/turn-loop.js.map +1 -1
- package/dist/src/unified-task.d.ts +76 -0
- package/dist/src/unified-task.d.ts.map +1 -0
- package/dist/src/unified-task.js +196 -0
- package/dist/src/unified-task.js.map +1 -0
- package/package.json +16 -11
- package/templates/AGENTS.md +53 -0
- package/templates/HEARTBEAT.md +37 -0
- package/templates/MEMORY.md +29 -0
- package/templates/SOUL.md +28 -0
- package/templates/TOOLS.md +29 -0
- package/templates/USER.md +35 -0
- package/templates/WIKI.md +146 -0
- package/templates/settings.json +90 -0
- package/templates/skills/deep-research/SKILL.md +273 -0
- package/templates/skills/deep-research/references/report-structure.md +149 -0
- package/templates/skills/deep-research/references/topic-guides.md +151 -0
- package/templates/skills/planning/SKILL.md +222 -0
- package/templates/skills/planning/references/business.md +82 -0
- package/templates/skills/planning/references/creative.md +111 -0
- package/templates/skills/planning/references/events.md +109 -0
- package/templates/skills/planning/references/personal.md +107 -0
- package/templates/skills/planning/references/templates.md +279 -0
- 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 './
|
|
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
|
|
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;
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
|
90
|
-
const
|
|
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
|
-
|
|
101
|
-
|
|
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
|
|
130
|
-
const
|
|
131
|
-
if (existsSync(
|
|
132
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAwD,MAAM,gBAAgB,CAAC;
|
|
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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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,
|
|
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
|
package/dist/src/index.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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
|
|
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();
|