@crewx/sdk 0.9.0-rc.3 → 0.9.0-rc.30

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 (51) hide show
  1. package/dist/config/canonicalize-agent-options.d.ts +16 -0
  2. package/dist/config/models.generated.d.ts +22 -0
  3. package/dist/config/models.remote.d.ts +4 -0
  4. package/dist/config/overdrive.d.ts +24 -0
  5. package/dist/config/pricing.d.ts +8 -8
  6. package/dist/config/pricing.generated.d.ts +2 -0
  7. package/dist/config/pricing.remote.d.ts +4 -0
  8. package/dist/config/pricing.types.d.ts +5 -0
  9. package/dist/config/timeout.config.d.ts +3 -0
  10. package/dist/esm/index.js +123 -81
  11. package/dist/esm/plugins/index.js +119 -72
  12. package/dist/esm/repository/index.js +109 -62
  13. package/dist/esm/testing/index.js +1 -1
  14. package/dist/facade/Crewx.d.ts +5 -0
  15. package/dist/index.browser.d.ts +1 -1
  16. package/dist/index.browser.js +2 -2
  17. package/dist/index.d.ts +11 -4
  18. package/dist/index.js +124 -82
  19. package/dist/migrations/0008_careful_black_bird.sql +17 -0
  20. package/dist/migrations/0009_hot_dark_phoenix.sql +1 -0
  21. package/dist/migrations/0010_analyze_stats.sql +6 -0
  22. package/dist/migrations/0011_far_black_tarantula.sql +1 -0
  23. package/dist/migrations/meta/0008_snapshot.json +1327 -0
  24. package/dist/migrations/meta/0009_snapshot.json +1335 -0
  25. package/dist/migrations/meta/0010_snapshot.json +1335 -0
  26. package/dist/migrations/meta/0011_snapshot.json +1342 -0
  27. package/dist/migrations/meta/_journal.json +28 -0
  28. package/dist/plugins/index.js +119 -72
  29. package/dist/provider/acp/adapters/claude.d.ts +0 -4
  30. package/dist/provider/acp/connection.d.ts +4 -0
  31. package/dist/provider/acp/meta.d.ts +4 -0
  32. package/dist/provider/bridge.d.ts +13 -1
  33. package/dist/provider/cli/adapter.types.d.ts +1 -0
  34. package/dist/provider/cli/adapters/claude.d.ts +0 -1
  35. package/dist/provider/cli/adapters/cli-knob.util.d.ts +2 -0
  36. package/dist/provider/cli/meta.d.ts +10 -2
  37. package/dist/provider/idle-watchdog.d.ts +19 -0
  38. package/dist/provider/models.d.ts +23 -0
  39. package/dist/provider/order.d.ts +1 -0
  40. package/dist/repository/index.d.ts +3 -1
  41. package/dist/repository/index.js +109 -62
  42. package/dist/repository/task.repository.d.ts +34 -0
  43. package/dist/repository/thread.repository.d.ts +16 -2
  44. package/dist/repository/usage-report.repository.d.ts +27 -0
  45. package/dist/schema/index.d.ts +1 -0
  46. package/dist/schema/usage-reports.d.ts +252 -0
  47. package/dist/testing/index.d.ts +2 -0
  48. package/dist/testing/index.js +1 -1
  49. package/dist/types/index.d.ts +7 -0
  50. package/package.json +3 -2
  51. package/templates/agents/default.yaml +7 -0
@@ -2,6 +2,12 @@ import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
2
  import { tasks } from '../schema/index.js';
3
3
  export type TaskRow = typeof tasks.$inferSelect;
4
4
  export type NewTask = typeof tasks.$inferInsert;
5
+ export type TaskListRow = Pick<TaskRow, 'id' | 'thread_id' | 'agent_id' | 'status' | 'parent_task_id' | 'started_at' | 'completed_at' | 'duration_ms' | 'input_tokens' | 'output_tokens' | 'cost_usd' | 'error'>;
6
+ export interface WorkflowCardRow {
7
+ taskId: string;
8
+ workflowRunId?: string;
9
+ raw?: string;
10
+ }
5
11
  export interface AgentUsageRow {
6
12
  agentId: string;
7
13
  workspaceId: string | null;
@@ -32,8 +38,30 @@ export interface ProviderUsageRow {
32
38
  activeDurationMs: number;
33
39
  lastActiveAt: string | null;
34
40
  }
41
+ export interface ModelUsageRow {
42
+ model: string;
43
+ provider: string;
44
+ totalTasks: number;
45
+ inputTokens: number;
46
+ outputTokens: number;
47
+ cachedInputTokens: number;
48
+ costUsd: number;
49
+ totalTokens: number;
50
+ activeDurationMs: number;
51
+ lastActiveAt: string | null;
52
+ }
53
+ export interface ReportTaskRow {
54
+ threadId: string | null;
55
+ agentId: string;
56
+ startedAt: string;
57
+ status: string;
58
+ error: string | null;
59
+ exitCode: number | null;
60
+ }
61
+ export declare const PID_NULL_REAP_GRACE_MS: number;
35
62
  export declare class TaskRepository extends BaseSqliteRepository {
36
63
  private readonly dbPath?;
64
+ private readonly pidNullObservedSince;
37
65
  constructor(opts?: {
38
66
  dbPath?: string;
39
67
  dbRoot?: string;
@@ -89,6 +117,7 @@ export declare class TaskRepository extends BaseSqliteRepository {
89
117
  pid?: number;
90
118
  };
91
119
  reapOrphanedTasks(): number;
120
+ reapRunningWorkflowTasks(graceMs?: number): number;
92
121
  findTaskStatus(taskId: string, workspaceId?: string): TaskRow | undefined;
93
122
  findChildTasks(parentTaskId: string, workspaceId?: string): TaskRow[];
94
123
  getWorkspaceUsageSummary(workspaceId?: string): Array<{
@@ -104,6 +133,9 @@ export declare class TaskRepository extends BaseSqliteRepository {
104
133
  costUsd: number;
105
134
  };
106
135
  findTasksByThread(threadId: string, workspaceId?: string): TaskRow[];
136
+ private parseWorkflowCardMetadata;
137
+ private extractThreadIdFromCommand;
138
+ batchFetchWorkflowCards(threadIds: string[], workspaceId?: string): Map<string, WorkflowCardRow>;
107
139
  findAllTasks(params: {
108
140
  workspaceId?: string;
109
141
  agentId?: string;
@@ -127,4 +159,6 @@ export declare class TaskRepository extends BaseSqliteRepository {
127
159
  markTaskFailed(taskId: string, error: string, workspaceId?: string): void;
128
160
  findTasksByPromptHint(hint: string, workspaceId?: string): TaskRow[];
129
161
  getProviderUsage(from: string, to: string, workspace?: string): ProviderUsageRow[];
162
+ getModelUsage(from: string, to: string, workspace?: string): ModelUsageRow[];
163
+ getTasksForReport(from: string, to: string, workspace?: string): ReportTaskRow[];
130
164
  }
@@ -1,6 +1,6 @@
1
1
  import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
2
  import { threads } from '../schema/index.js';
3
- import type { TaskRow } from './task.repository.js';
3
+ import type { TaskRow, TaskListRow } from './task.repository.js';
4
4
  export type ThreadRow = typeof threads.$inferSelect;
5
5
  export type NewThread = typeof threads.$inferInsert;
6
6
  export declare class ThreadRepository extends BaseSqliteRepository {
@@ -14,6 +14,7 @@ export declare class ThreadRepository extends BaseSqliteRepository {
14
14
  private validateWorkspaceId;
15
15
  private topLevelTaskPredicateSql;
16
16
  findAllThreads(workspaceId?: string): ThreadRow[];
17
+ findThreadsByIdsOrTitles(ids: string[], workspaceId?: string): ThreadRow[];
17
18
  findThreadById(threadId: string, workspaceId?: string): ThreadRow | undefined;
18
19
  threadExists(threadId: string, workspaceId?: string): boolean;
19
20
  aggregateTaskStats(threadId: string, workspaceId?: string): {
@@ -30,7 +31,9 @@ export declare class ThreadRepository extends BaseSqliteRepository {
30
31
  task: TaskRow;
31
32
  children: TaskRow[];
32
33
  } | undefined;
33
- batchFetchTasks(threadIds: string[], workspaceId?: string): Map<string, TaskRow[]>;
34
+ private batchFetchTasksQuery;
35
+ batchFetchTasks(threadIds: string[], workspaceId?: string): Map<string, TaskListRow[]>;
36
+ explainBatchFetchTasksPlan(threadIds: string[], workspaceId?: string): string[];
34
37
  updateThreadTitle(threadId: string, title: string, workspaceId?: string): void;
35
38
  upsertThread(threadId: string, opts: {
36
39
  platform: string;
@@ -63,4 +66,15 @@ export declare class ThreadRepository extends BaseSqliteRepository {
63
66
  toggleStar(threadId: string, workspaceId?: string): {
64
67
  starred: boolean;
65
68
  } | null;
69
+ resolveOverdriveForRequest(threadId: string, workspaceId: string | undefined, action: 'enable-count' | 'enable-latch' | 'disable' | 'use-current', opts?: {
70
+ turns?: number;
71
+ defaultTurns?: number;
72
+ updatedBy?: string;
73
+ consumeCurrent?: boolean;
74
+ }): {
75
+ applied: boolean;
76
+ appliedMode?: 'count' | 'latch';
77
+ state: 'off' | 'count' | 'latch';
78
+ remaining: number;
79
+ } | null;
66
80
  }
@@ -0,0 +1,27 @@
1
+ import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
+ import { usage_reports } from '../schema/index.js';
3
+ export type UsageReportRow = typeof usage_reports.$inferSelect;
4
+ export type NewUsageReport = typeof usage_reports.$inferInsert;
5
+ export interface PublishReportInput {
6
+ id: string;
7
+ workspaceId: string;
8
+ month: string;
9
+ generatedAt: string;
10
+ sourceRange: string;
11
+ tier: string;
12
+ totalTokens: number;
13
+ totalCostUsd: number;
14
+ payload: string;
15
+ }
16
+ export declare class UsageReportRepository extends BaseSqliteRepository {
17
+ private readonly dbPath?;
18
+ constructor(opts?: {
19
+ dbPath?: string;
20
+ dbRoot?: string;
21
+ });
22
+ resolveDbPath(): string;
23
+ private openHandle;
24
+ publish(input: PublishReportInput): UsageReportRow;
25
+ findByMonth(workspaceId: string, month: string): UsageReportRow | undefined;
26
+ listByWorkspace(workspaceId: string): UsageReportRow[];
27
+ }
@@ -6,3 +6,4 @@ export * from './tool-calls.js';
6
6
  export * from './thread-boxes.js';
7
7
  export * from './request-logs.js';
8
8
  export * from './usage-limit-snapshots.js';
9
+ export * from './usage-reports.js';
@@ -0,0 +1,252 @@
1
+ export declare const usage_reports: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
2
+ name: "usage_reports";
3
+ schema: undefined;
4
+ columns: {
5
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
6
+ name: "id";
7
+ tableName: "usage_reports";
8
+ dataType: "string";
9
+ columnType: "SQLiteText";
10
+ data: string;
11
+ driverParam: string;
12
+ notNull: true;
13
+ hasDefault: false;
14
+ isPrimaryKey: true;
15
+ isAutoincrement: false;
16
+ hasRuntimeDefault: false;
17
+ enumValues: [string, ...string[]];
18
+ baseColumn: never;
19
+ identity: undefined;
20
+ generated: undefined;
21
+ }, {}, {
22
+ length: number | undefined;
23
+ }>;
24
+ workspace_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
25
+ name: "workspace_id";
26
+ tableName: "usage_reports";
27
+ dataType: "string";
28
+ columnType: "SQLiteText";
29
+ data: string;
30
+ driverParam: string;
31
+ notNull: true;
32
+ hasDefault: false;
33
+ isPrimaryKey: false;
34
+ isAutoincrement: false;
35
+ hasRuntimeDefault: false;
36
+ enumValues: [string, ...string[]];
37
+ baseColumn: never;
38
+ identity: undefined;
39
+ generated: undefined;
40
+ }, {}, {
41
+ length: number | undefined;
42
+ }>;
43
+ month: import("drizzle-orm/sqlite-core").SQLiteColumn<{
44
+ name: "month";
45
+ tableName: "usage_reports";
46
+ dataType: "string";
47
+ columnType: "SQLiteText";
48
+ data: string;
49
+ driverParam: string;
50
+ notNull: true;
51
+ hasDefault: false;
52
+ isPrimaryKey: false;
53
+ isAutoincrement: false;
54
+ hasRuntimeDefault: false;
55
+ enumValues: [string, ...string[]];
56
+ baseColumn: never;
57
+ identity: undefined;
58
+ generated: undefined;
59
+ }, {}, {
60
+ length: number | undefined;
61
+ }>;
62
+ generated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
63
+ name: "generated_at";
64
+ tableName: "usage_reports";
65
+ dataType: "string";
66
+ columnType: "SQLiteText";
67
+ data: string;
68
+ driverParam: string;
69
+ notNull: true;
70
+ hasDefault: false;
71
+ isPrimaryKey: false;
72
+ isAutoincrement: false;
73
+ hasRuntimeDefault: false;
74
+ enumValues: [string, ...string[]];
75
+ baseColumn: never;
76
+ identity: undefined;
77
+ generated: undefined;
78
+ }, {}, {
79
+ length: number | undefined;
80
+ }>;
81
+ source_range: import("drizzle-orm/sqlite-core").SQLiteColumn<{
82
+ name: "source_range";
83
+ tableName: "usage_reports";
84
+ dataType: "string";
85
+ columnType: "SQLiteText";
86
+ data: string;
87
+ driverParam: string;
88
+ notNull: true;
89
+ hasDefault: false;
90
+ isPrimaryKey: false;
91
+ isAutoincrement: false;
92
+ hasRuntimeDefault: false;
93
+ enumValues: [string, ...string[]];
94
+ baseColumn: never;
95
+ identity: undefined;
96
+ generated: undefined;
97
+ }, {}, {
98
+ length: number | undefined;
99
+ }>;
100
+ tier: import("drizzle-orm/sqlite-core").SQLiteColumn<{
101
+ name: "tier";
102
+ tableName: "usage_reports";
103
+ dataType: "string";
104
+ columnType: "SQLiteText";
105
+ data: string;
106
+ driverParam: string;
107
+ notNull: true;
108
+ hasDefault: false;
109
+ isPrimaryKey: false;
110
+ isAutoincrement: false;
111
+ hasRuntimeDefault: false;
112
+ enumValues: [string, ...string[]];
113
+ baseColumn: never;
114
+ identity: undefined;
115
+ generated: undefined;
116
+ }, {}, {
117
+ length: number | undefined;
118
+ }>;
119
+ total_tokens: import("drizzle-orm/sqlite-core").SQLiteColumn<{
120
+ name: "total_tokens";
121
+ tableName: "usage_reports";
122
+ dataType: "number";
123
+ columnType: "SQLiteInteger";
124
+ data: number;
125
+ driverParam: number;
126
+ notNull: true;
127
+ hasDefault: false;
128
+ isPrimaryKey: false;
129
+ isAutoincrement: false;
130
+ hasRuntimeDefault: false;
131
+ enumValues: undefined;
132
+ baseColumn: never;
133
+ identity: undefined;
134
+ generated: undefined;
135
+ }, {}, {}>;
136
+ total_cost_usd: import("drizzle-orm/sqlite-core").SQLiteColumn<{
137
+ name: "total_cost_usd";
138
+ tableName: "usage_reports";
139
+ dataType: "number";
140
+ columnType: "SQLiteReal";
141
+ data: number;
142
+ driverParam: number;
143
+ notNull: true;
144
+ hasDefault: false;
145
+ isPrimaryKey: false;
146
+ isAutoincrement: false;
147
+ hasRuntimeDefault: false;
148
+ enumValues: undefined;
149
+ baseColumn: never;
150
+ identity: undefined;
151
+ generated: undefined;
152
+ }, {}, {}>;
153
+ payload: import("drizzle-orm/sqlite-core").SQLiteColumn<{
154
+ name: "payload";
155
+ tableName: "usage_reports";
156
+ dataType: "string";
157
+ columnType: "SQLiteText";
158
+ data: string;
159
+ driverParam: string;
160
+ notNull: true;
161
+ hasDefault: false;
162
+ isPrimaryKey: false;
163
+ isAutoincrement: false;
164
+ hasRuntimeDefault: false;
165
+ enumValues: [string, ...string[]];
166
+ baseColumn: never;
167
+ identity: undefined;
168
+ generated: undefined;
169
+ }, {}, {
170
+ length: number | undefined;
171
+ }>;
172
+ payload_hash: import("drizzle-orm/sqlite-core").SQLiteColumn<{
173
+ name: "payload_hash";
174
+ tableName: "usage_reports";
175
+ dataType: "string";
176
+ columnType: "SQLiteText";
177
+ data: string;
178
+ driverParam: string;
179
+ notNull: false;
180
+ hasDefault: false;
181
+ isPrimaryKey: false;
182
+ isAutoincrement: false;
183
+ hasRuntimeDefault: false;
184
+ enumValues: [string, ...string[]];
185
+ baseColumn: never;
186
+ identity: undefined;
187
+ generated: undefined;
188
+ }, {}, {
189
+ length: number | undefined;
190
+ }>;
191
+ signature: import("drizzle-orm/sqlite-core").SQLiteColumn<{
192
+ name: "signature";
193
+ tableName: "usage_reports";
194
+ dataType: "string";
195
+ columnType: "SQLiteText";
196
+ data: string;
197
+ driverParam: string;
198
+ notNull: false;
199
+ hasDefault: false;
200
+ isPrimaryKey: false;
201
+ isAutoincrement: false;
202
+ hasRuntimeDefault: false;
203
+ enumValues: [string, ...string[]];
204
+ baseColumn: never;
205
+ identity: undefined;
206
+ generated: undefined;
207
+ }, {}, {
208
+ length: number | undefined;
209
+ }>;
210
+ signed_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
211
+ name: "signed_at";
212
+ tableName: "usage_reports";
213
+ dataType: "string";
214
+ columnType: "SQLiteText";
215
+ data: string;
216
+ driverParam: string;
217
+ notNull: false;
218
+ hasDefault: false;
219
+ isPrimaryKey: false;
220
+ isAutoincrement: false;
221
+ hasRuntimeDefault: false;
222
+ enumValues: [string, ...string[]];
223
+ baseColumn: never;
224
+ identity: undefined;
225
+ generated: undefined;
226
+ }, {}, {
227
+ length: number | undefined;
228
+ }>;
229
+ issuer: import("drizzle-orm/sqlite-core").SQLiteColumn<{
230
+ name: "issuer";
231
+ tableName: "usage_reports";
232
+ dataType: "string";
233
+ columnType: "SQLiteText";
234
+ data: string;
235
+ driverParam: string;
236
+ notNull: false;
237
+ hasDefault: false;
238
+ isPrimaryKey: false;
239
+ isAutoincrement: false;
240
+ hasRuntimeDefault: false;
241
+ enumValues: [string, ...string[]];
242
+ baseColumn: never;
243
+ identity: undefined;
244
+ generated: undefined;
245
+ }, {}, {
246
+ length: number | undefined;
247
+ }>;
248
+ };
249
+ dialect: "sqlite";
250
+ }>;
251
+ export type UsageReport = typeof usage_reports.$inferSelect;
252
+ export type NewUsageReport = typeof usage_reports.$inferInsert;
@@ -9,3 +9,5 @@ export { createMockAudit } from './mock-audit';
9
9
  export type { MockAudit, AuditEvent } from './mock-audit';
10
10
  export { createMockRouter } from './mock-router';
11
11
  export type { MockRouter, RegisteredRoute } from './mock-router';
12
+ export { clearPricingOverride as resetPricingOverride } from '../config/pricing.js';
13
+ export { clearModelsOverride as resetModelsOverride } from '../provider/models.js';
@@ -1 +1 @@
1
- 'use strict';function m(){let e=[];return {events:e,async log(t,r){e.push({event:t,payload:r});}}}function y(){let e={debug:[],info:[],warn:[],error:[]};return {entries:e,debug(t,r){e.debug.push({msg:t,meta:r});},info(t,r){e.info.push({msg:t,meta:r});},warn(t,r){e.warn.push({msg:t,meta:r});},error(t,r){e.error.push({msg:t,meta:r});}}}function h(){let e=200,t,r,n={},o={status(s){return e=s,o},set(s,i){return n[s]=i,o},send(s){return r=s,o},json(s){return t=s,o},end(){return o},getStatusCode:()=>e,getJsonBody:()=>t,getSentBody:()=>r,getHeaders:()=>({...n})};return o}function R(){let e=[];return {routes:e,registerRoute(r,n,o){e.push({path:r,handler:n,opts:o});},async simulate(r,n,o=Buffer.alloc(0),s={},i={},d={}){let c=e.find(f=>f.path===n);if(!c)return {status:404,body:{error:"Not found"},headers:{}};let p={method:r,url:n,headers:s,body:o,params:i,query:d},u=h();return await c.handler(p,u),{status:u.getStatusCode(),body:u.getJsonBody()??u.getSentBody(),headers:u.getHeaders()}}}}function M(e){let t=new Map,r=n=>n.startsWith(`${e}::`)?n:`${e}::${n}`;return {async get(n){let o=t.get(r(n));return o?o.value:void 0},async set(n,o){t.set(r(n),{value:o});},async delete(n){return t.delete(r(n))},async list(n){let o=n?r(n):`${e}::`,s=[];for(let i of t.keys())i.startsWith(o)&&s.push(i.slice(e.length+2));return s}}}function k(e){return M(e)}function l(){let e=new Map;return {blobs:e,async put(t,r,n){return e.set(t,{data:r,contentType:n}),t},async get(t){let r=e.get(t);return r?r.data:void 0},async delete(t){return e.delete(t)}}}function E(e){let t=e.instanceId??"mock-instance",r=m(),n=y(),o=R(),s=k(t),i=l(),d=[],c=[],p=[],u={run:async()=>({output:""}),...e.agentRunner},f=new AbortController,b=async a=>(d.push(a),{accepted:true}),x=async a=>(c.push(a),{accepted:true}),S=async(a,C)=>{p.push({messageId:a,patch:C});},w=async a=>({userId:a,displayName:a}),A=async()=>{},v=async()=>({messageId:"mock-proactive",sentAt:Date.now()});return {instanceId:t,installationId:e.installationId,config:e.config,capabilities:new Set(e.capabilities??[]),log:n,agentRunner:u,db:s,storage:i,audit:r,abortSignal:e.abortSignal??f.signal,httpRouter:o,router:o,inbound:b,emitEvent:x,updateMessage:S,resolveUser:w,respondSync:A,proactive:v,inboundCalls:d,emittedEvents:c,sentMessages:p}}exports.createMockAudit=m;exports.createMockContext=E;exports.createMockLogger=y;exports.createMockRouter=R;exports.createMockStorage=l;exports.createMockStore=k;
1
+ 'use strict';function m(){let e=[];return {events:e,async log(t,r){e.push({event:t,payload:r});}}}function f(){let e={debug:[],info:[],warn:[],error:[]};return {entries:e,debug(t,r){e.debug.push({msg:t,meta:r});},info(t,r){e.info.push({msg:t,meta:r});},warn(t,r){e.warn.push({msg:t,meta:r});},error(t,r){e.error.push({msg:t,meta:r});}}}function w(){let e=200,t,r,n={},o={status(i){return e=i,o},set(i,d){return n[i]=d,o},send(i){return r=i,o},json(i){return t=i,o},end(){return o},getStatusCode:()=>e,getJsonBody:()=>t,getSentBody:()=>r,getHeaders:()=>({...n})};return o}function h(){let e=[];return {routes:e,registerRoute(r,n,o){e.push({path:r,handler:n,opts:o});},async simulate(r,n,o=Buffer.alloc(0),i={},d={},g={}){let c=e.find(l=>l.path===n);if(!c)return {status:404,body:{error:"Not found"},headers:{}};let p={method:r,url:n,headers:i,body:o,params:d,query:g},u=w();return await c.handler(p,u),{status:u.getStatusCode(),body:u.getJsonBody()??u.getSentBody(),headers:u.getHeaders()}}}}function M(e){let t=new Map,r=n=>n.startsWith(`${e}::`)?n:`${e}::${n}`;return {async get(n){let o=t.get(r(n));return o?o.value:void 0},async set(n,o){t.set(r(n),{value:o});},async delete(n){return t.delete(r(n))},async list(n){let o=n?r(n):`${e}::`,i=[];for(let d of t.keys())d.startsWith(o)&&i.push(d.slice(e.length+2));return i}}}function y(e){return M(e)}function x(){let e=new Map;return {blobs:e,async put(t,r,n){return e.set(t,{data:r,contentType:n}),t},async get(t){let r=e.get(t);return r?r.data:void 0},async delete(t){return e.delete(t)}}}function A(e){let t=e.instanceId??"mock-instance",r=m(),n=f(),o=h(),i=y(t),d=x(),g=[],c=[],p=[],u={run:async()=>({output:""}),...e.agentRunner},l=new AbortController,P=async s=>(g.push(s),{accepted:true}),v=async s=>(c.push(s),{accepted:true}),C=async(s,O)=>{p.push({messageId:s,patch:O});},k=async s=>({userId:s,displayName:s}),E=async()=>{},b=async()=>({messageId:"mock-proactive",sentAt:Date.now()});return {instanceId:t,installationId:e.installationId,config:e.config,capabilities:new Set(e.capabilities??[]),log:n,agentRunner:u,db:i,storage:d,audit:r,abortSignal:e.abortSignal??l.signal,httpRouter:o,router:o,inbound:P,emitEvent:v,updateMessage:C,resolveUser:k,respondSync:E,proactive:b,inboundCalls:g,emittedEvents:c,sentMessages:p}}function L(){}var R={claude:{models:[{id:"claude-fable-5",name:"Claude Fable 5"},{id:"claude-sonnet-5",name:"Claude Sonnet 5"},{id:"claude-opus-4-8[1m]",name:"Claude Opus 4.8 (Extended)"},{id:"claude-opus-4-8",name:"Claude Opus 4.8"},{id:"claude-opus-4-7[1m]",name:"Claude Opus 4.7 (Extended)"},{id:"claude-opus-4-7",name:"Claude Opus 4.7"},{id:"claude-opus-4-6[1m]",name:"Claude Opus 4.6 (Extended)"},{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6[1m]",name:"Claude Sonnet 4.6 (Extended)"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5"}],modes:[{id:"default",name:"Default"},{id:"acceptEdits",name:"Accept Edits"},{id:"plan",name:"Plan"},{id:"auto",name:"Auto"},{id:"dontAsk",name:"Don't Ask"},{id:"bypassPermissions",name:"Bypass Permissions"}],effort:["low","medium","high"],modelOverrides:{"claude-fable-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-opus-4-6":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-haiku-4-5":{effort:[]}}},codex:{models:[{id:"gpt-5.6-sol",name:"GPT-5.6 Sol"},{id:"gpt-5.6-terra",name:"GPT-5.6 Terra"},{id:"gpt-5.6-luna",name:"GPT-5.6 Luna"},{id:"gpt-5.5",name:"GPT-5.5"},{id:"gpt-5.4",name:"GPT-5.4"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex"},{id:"gpt-5.3-codex-spark",name:"GPT-5.3 Codex Spark"}],modes:[{id:"agent",name:"Agent"},{id:"read-only",name:"Read Only"},{id:"plan",name:"Plan"},{id:"agent-full-access",name:"Agent Full Access"},{id:"yolo",name:"YOLO"}],effort:["minimal","low","medium","high"],modelOverrides:{"gpt-5.6-sol":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"xhigh"},"gpt-5.6-terra":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.6-luna":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.5":{effort:["minimal","low","medium","high","xhigh"],defaultEffort:"high"}}},copilot:{models:[{id:"auto",name:"Auto"},{id:"claude-sonnet-5",name:"Claude Sonnet 5"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"gpt-5.5",name:"GPT-5.5"},{id:"gpt-5.4",name:"GPT-5.4"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro"}],modes:[{id:"interactive",name:"Interactive"},{id:"plan",name:"Plan"},{id:"autopilot",name:"Autopilot"}],effort:["none","low","medium","high","xhigh","max"],modelOverrides:{}},antigravity:{models:[{id:"Gemini 3.5 Flash (Medium)",name:"Gemini 3.5 Flash (Medium)"},{id:"Gemini 3.5 Flash (High)",name:"Gemini 3.5 Flash (High)"},{id:"Gemini 3.5 Flash (Low)",name:"Gemini 3.5 Flash (Low)"},{id:"Gemini 3.1 Pro (Low)",name:"Gemini 3.1 Pro (Low)"},{id:"Gemini 3.1 Pro (High)",name:"Gemini 3.1 Pro (High)"},{id:"Claude Sonnet 4.6 (Thinking)",name:"Claude Sonnet 4.6 (Thinking)"},{id:"Claude Opus 4.6 (Thinking)",name:"Claude Opus 4.6 (Thinking)"},{id:"GPT-OSS 120B (Medium)",name:"GPT-OSS 120B (Medium)"}],modes:[],effort:[],modelOverrides:{}}};Object.fromEntries(Object.entries(R).map(([e,t])=>[e,t.models]));function G(){}exports.createMockAudit=m;exports.createMockContext=A;exports.createMockLogger=f;exports.createMockRouter=h;exports.createMockStorage=x;exports.createMockStore=y;exports.resetModelsOverride=G;exports.resetPricingOverride=L;
@@ -1299,6 +1299,7 @@ export interface CrewxOptions {
1299
1299
  };
1300
1300
  remoteFactory?: (configPath: string) => Promise<import('../facade/Crewx').Crewx>;
1301
1301
  includeBuiltIns?: boolean;
1302
+ additionalArgsProvider?: import('../provider/bridge').AdditionalArgsProvider;
1302
1303
  }
1303
1304
  export interface QueryOptions {
1304
1305
  model?: string;
@@ -1306,6 +1307,9 @@ export interface QueryOptions {
1306
1307
  effort?: string;
1307
1308
  context?: string;
1308
1309
  metadata?: Record<string, unknown>;
1310
+ overdrive?: boolean | {
1311
+ mode?: 'count' | 'latch';
1312
+ };
1309
1313
  threadId?: string;
1310
1314
  taskId?: string;
1311
1315
  platform?: Platform;
@@ -1343,6 +1347,9 @@ export interface ExecuteOptions {
1343
1347
  effort?: string;
1344
1348
  context?: string;
1345
1349
  metadata?: Record<string, unknown>;
1350
+ overdrive?: boolean | {
1351
+ mode?: 'count' | 'latch';
1352
+ };
1346
1353
  threadId?: string;
1347
1354
  taskId?: string;
1348
1355
  platform?: Platform;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/sdk",
3
- "version": "0.9.0-rc.3",
3
+ "version": "0.9.0-rc.30",
4
4
  "license": "UNLICENSED",
5
5
  "engines": {
6
6
  "node": ">=20.19.0"
@@ -117,11 +117,12 @@
117
117
  "vitest": "3.2.4"
118
118
  },
119
119
  "scripts": {
120
+ "prebuild": "node scripts/generate-pricing.mjs && node scripts/generate-models.mjs",
120
121
  "build:cjs": "tsup --config tsup.cjs.js",
121
122
  "build:esm": "tsup --config tsup.esm.js",
122
123
  "build:browser": "tsup --config tsup.browser.js",
123
124
  "build:dts": "tsc -p tsconfig.dts.json",
124
- "build": "pnpm run build:cjs && pnpm run build:esm && pnpm run build:browser && pnpm run build:dts && node scripts/copy-migrations.mjs",
125
+ "build": "pnpm run prebuild && pnpm run build:cjs && pnpm run build:esm && pnpm run build:browser && pnpm run build:dts && node scripts/copy-migrations.mjs",
125
126
  "db:generate": "cd ../.. && drizzle-kit generate --config drizzle.config.ts && node packages/sdk/scripts/post-generate.mjs",
126
127
  "db:check": "cd ../.. && drizzle-kit check --config drizzle.config.ts",
127
128
  "test": "vitest run --config ./vitest.config.ts",
@@ -46,6 +46,13 @@ layouts:
46
46
  </dispatched_from>
47
47
  {{/if}}
48
48
 
49
+ {{#if vars.crewx_workspace_path}}
50
+ <current_workspace>
51
+ <path>{{{vars.crewx_workspace_path}}}</path>
52
+ <note>This is the absolute path of the workspace you are currently running in.</note>
53
+ </current_workspace>
54
+ {{/if}}
55
+
49
56
  {{#if agentMetadata.specialties.length}}
50
57
  <specialties>
51
58
  {{#each agentMetadata.specialties}}