@crewx/sdk 0.9.0-rc.65 → 0.9.0-rc.67
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/dist/config/global-settings.d.ts +14 -0
- package/dist/esm/index.js +99 -92
- package/dist/esm/plugins/index.js +118 -111
- package/dist/esm/repository/index.js +141 -119
- package/dist/facade/Crewx.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +100 -93
- package/dist/local-server/base-url.d.ts +18 -0
- package/dist/local-server/index.d.ts +8 -0
- package/dist/local-server/opencode.d.ts +8 -0
- package/dist/local-server/probe.d.ts +3 -0
- package/dist/local-server/runtime.d.ts +26 -0
- package/dist/local-server/types.d.ts +43 -0
- package/dist/migrations/0016_fuzzy_hemingway.sql +14 -0
- package/dist/migrations/meta/0016_snapshot.json +2419 -0
- package/dist/migrations/meta/_journal.json +7 -0
- package/dist/plugins/index.js +118 -111
- package/dist/repository/db.d.ts +8 -0
- package/dist/repository/index.d.ts +7 -2
- package/dist/repository/index.js +141 -119
- package/dist/repository/task-log-migration.d.ts +74 -0
- package/dist/repository/task-log.repository.d.ts +44 -0
- package/dist/repository/task.repository.d.ts +6 -0
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/task-log-events.d.ts +119 -0
- package/dist/schema/tasks.d.ts +53 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export type TaskLogMigrationMode = 'dry-run' | 'apply' | 'verify';
|
|
2
|
+
export declare const TASK_LOG_MIGRATION_TERMINAL_STATUSES: readonly ["success", "failed", "completed"];
|
|
3
|
+
export declare const TASK_LOG_MIGRATION_MIN_FREE_SPACE_BYTES: number;
|
|
4
|
+
export declare const TASK_LOG_MIGRATION_EVENT_ROW_BYTES = 256;
|
|
5
|
+
export type TaskLogVerificationIssueKind = 'malformed-blob' | 'mixed-source' | 'seq-gap' | 'duplicate-seq' | 'orphan-event' | 'count-mismatch' | 'source-invariant' | 'invalid-event';
|
|
6
|
+
export type TaskLogMigrationFailureKind = 'malformed' | 'mixed-source' | 'metadata' | 'invalid-source';
|
|
7
|
+
export interface TaskLogMigrationOptions {
|
|
8
|
+
mode: TaskLogMigrationMode;
|
|
9
|
+
dbPath?: string;
|
|
10
|
+
batchTasks?: number;
|
|
11
|
+
backupPath?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TaskLogMigrationFailure {
|
|
14
|
+
taskId: string;
|
|
15
|
+
reason: string;
|
|
16
|
+
kind?: TaskLogMigrationFailureKind;
|
|
17
|
+
}
|
|
18
|
+
export interface TaskLogVerificationIssue {
|
|
19
|
+
taskId: string | null;
|
|
20
|
+
kind: TaskLogVerificationIssueKind;
|
|
21
|
+
reason: string;
|
|
22
|
+
expected?: number;
|
|
23
|
+
actual?: number;
|
|
24
|
+
seq?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface TaskLogVerificationReport {
|
|
27
|
+
checkedTasks: number;
|
|
28
|
+
eventSourceTasks: number;
|
|
29
|
+
blobSourceTasks: number;
|
|
30
|
+
eventCount: number;
|
|
31
|
+
orphanEventCount: number;
|
|
32
|
+
failedTasks: number;
|
|
33
|
+
issues: TaskLogVerificationIssue[];
|
|
34
|
+
}
|
|
35
|
+
export interface TaskLogMigrationReport {
|
|
36
|
+
mode: TaskLogMigrationMode;
|
|
37
|
+
ok: boolean;
|
|
38
|
+
dbPath: string;
|
|
39
|
+
backupPath?: string;
|
|
40
|
+
backupMethod?: 'sqlite-online-backup';
|
|
41
|
+
blockedReason?: string;
|
|
42
|
+
activeTaskCount: number;
|
|
43
|
+
taskCount: number;
|
|
44
|
+
candidateTaskCount: number;
|
|
45
|
+
eligibleTaskCount: number;
|
|
46
|
+
statusCounts: Record<string, number>;
|
|
47
|
+
deferredTaskCount: number;
|
|
48
|
+
deferredStatusCounts: Record<string, number>;
|
|
49
|
+
entryCount: number;
|
|
50
|
+
sourceBytes: number;
|
|
51
|
+
estimatedFreeSpaceBytes: number;
|
|
52
|
+
requiredFreeSpaceBytes: number;
|
|
53
|
+
availableFreeSpaceBytes: number;
|
|
54
|
+
minimumFreeSpaceReserveBytes: number;
|
|
55
|
+
freeSpaceGatePassed: boolean;
|
|
56
|
+
migratedTasks: number;
|
|
57
|
+
migratedEntries: number;
|
|
58
|
+
skippedTasks: number;
|
|
59
|
+
failedTasks: number;
|
|
60
|
+
malformedRows: TaskLogMigrationFailure[];
|
|
61
|
+
failures: TaskLogMigrationFailure[];
|
|
62
|
+
logicalSourceBytesRemoved: number;
|
|
63
|
+
warnings: string[];
|
|
64
|
+
remainingTaskCount: number;
|
|
65
|
+
verification?: TaskLogVerificationReport;
|
|
66
|
+
}
|
|
67
|
+
export declare function resolveTaskLogMigrationDbPath(dbPath?: string): string;
|
|
68
|
+
export declare function hasSufficientTaskLogMigrationFreeSpace(availableFreeSpaceBytes: number, estimatedFreeSpaceBytes: number): boolean;
|
|
69
|
+
export interface TaskLogWalCheckpointConnection {
|
|
70
|
+
pragma(pragma: string): unknown;
|
|
71
|
+
}
|
|
72
|
+
export declare function tryCheckpointTaskLogWal(db: TaskLogWalCheckpointConnection): string | undefined;
|
|
73
|
+
export declare function runTaskLogMigration(options: TaskLogMigrationOptions): Promise<TaskLogMigrationReport>;
|
|
74
|
+
export declare function taskLogBackupName(backupPath: string): string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { BaseSqliteRepository } from './base-sqlite-repository.js';
|
|
2
|
+
export type TaskLogStorage = 'blob' | 'events';
|
|
3
|
+
export interface TaskLogEntry {
|
|
4
|
+
timestamp: string;
|
|
5
|
+
level: string;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export type RawTaskLogEntry = TaskLogEntry;
|
|
9
|
+
export type TaskLogRawEntry = TaskLogEntry;
|
|
10
|
+
export interface TaskLogState {
|
|
11
|
+
taskId: string;
|
|
12
|
+
source: TaskLogStorage;
|
|
13
|
+
revision: number;
|
|
14
|
+
lastSeq: number;
|
|
15
|
+
}
|
|
16
|
+
export interface TaskLogReadResult extends TaskLogState {
|
|
17
|
+
entries: TaskLogEntry[];
|
|
18
|
+
}
|
|
19
|
+
export interface TaskLogRepositoryContract {
|
|
20
|
+
appendLog(taskId: string, entry: TaskLogEntry): TaskLogState;
|
|
21
|
+
appendLogs(taskId: string, entries: readonly TaskLogEntry[]): TaskLogState;
|
|
22
|
+
readLogs(taskId: string): TaskLogReadResult | undefined;
|
|
23
|
+
readLogsTail(taskId: string, limit: number): TaskLogReadResult | undefined;
|
|
24
|
+
getLogState(taskId: string): TaskLogState | undefined;
|
|
25
|
+
}
|
|
26
|
+
export declare class TaskLogRepository extends BaseSqliteRepository implements TaskLogRepositoryContract {
|
|
27
|
+
private readonly dbPath?;
|
|
28
|
+
constructor(opts?: {
|
|
29
|
+
dbPath?: string;
|
|
30
|
+
dbRoot?: string;
|
|
31
|
+
});
|
|
32
|
+
resolveDbPath(): string;
|
|
33
|
+
private openHandle;
|
|
34
|
+
private findStateRow;
|
|
35
|
+
private findStateRowInTransaction;
|
|
36
|
+
private requireStateRowInTransaction;
|
|
37
|
+
appendLog(taskId: string, entry: TaskLogEntry): TaskLogState;
|
|
38
|
+
appendLogs(taskId: string, entries: readonly TaskLogEntry[]): TaskLogState;
|
|
39
|
+
getLogState(taskId: string): TaskLogState | undefined;
|
|
40
|
+
readLogs(taskId: string): TaskLogReadResult | undefined;
|
|
41
|
+
readLogsTail(taskId: string, limit: number): TaskLogReadResult | undefined;
|
|
42
|
+
readTail(taskId: string, limit: number): TaskLogReadResult | undefined;
|
|
43
|
+
private readLogsInternal;
|
|
44
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseSqliteRepository } from './base-sqlite-repository.js';
|
|
2
2
|
import { tasks } from '../schema/index.js';
|
|
3
|
+
import type { TaskLogEntry, TaskLogReadResult, TaskLogState } from './task-log.repository.js';
|
|
3
4
|
export type TaskRow = typeof tasks.$inferSelect;
|
|
4
5
|
export type NewTask = typeof tasks.$inferInsert;
|
|
5
6
|
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'>;
|
|
@@ -88,6 +89,7 @@ export interface ThreadChain {
|
|
|
88
89
|
export declare const PID_NULL_REAP_GRACE_MS: number;
|
|
89
90
|
export declare class TaskRepository extends BaseSqliteRepository {
|
|
90
91
|
private readonly dbPath?;
|
|
92
|
+
private readonly taskLogRepository;
|
|
91
93
|
private readonly pidNullObservedSince;
|
|
92
94
|
constructor(opts?: {
|
|
93
95
|
dbPath?: string;
|
|
@@ -138,6 +140,10 @@ export declare class TaskRepository extends BaseSqliteRepository {
|
|
|
138
140
|
level: string;
|
|
139
141
|
message: string;
|
|
140
142
|
}): void;
|
|
143
|
+
appendLogs(taskId: string, entries: readonly TaskLogEntry[]): void;
|
|
144
|
+
readLogs(taskId: string): TaskLogReadResult | undefined;
|
|
145
|
+
readLogsTail(taskId: string, limit: number): TaskLogReadResult | undefined;
|
|
146
|
+
getLogState(taskId: string): TaskLogState | undefined;
|
|
141
147
|
getRunningTasks(): TaskRow[];
|
|
142
148
|
getAllTasks(): TaskRow[];
|
|
143
149
|
getTask(id: string): TaskRow | undefined;
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export declare const task_log_events: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
2
|
+
name: "task_log_events";
|
|
3
|
+
schema: undefined;
|
|
4
|
+
columns: {
|
|
5
|
+
id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
6
|
+
name: "id";
|
|
7
|
+
tableName: "task_log_events";
|
|
8
|
+
dataType: "number";
|
|
9
|
+
columnType: "SQLiteInteger";
|
|
10
|
+
data: number;
|
|
11
|
+
driverParam: number;
|
|
12
|
+
notNull: true;
|
|
13
|
+
hasDefault: true;
|
|
14
|
+
isPrimaryKey: true;
|
|
15
|
+
isAutoincrement: false;
|
|
16
|
+
hasRuntimeDefault: false;
|
|
17
|
+
enumValues: undefined;
|
|
18
|
+
baseColumn: never;
|
|
19
|
+
identity: undefined;
|
|
20
|
+
generated: undefined;
|
|
21
|
+
}, {}, {}>;
|
|
22
|
+
task_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
23
|
+
name: "task_id";
|
|
24
|
+
tableName: "task_log_events";
|
|
25
|
+
dataType: "string";
|
|
26
|
+
columnType: "SQLiteText";
|
|
27
|
+
data: string;
|
|
28
|
+
driverParam: string;
|
|
29
|
+
notNull: true;
|
|
30
|
+
hasDefault: false;
|
|
31
|
+
isPrimaryKey: false;
|
|
32
|
+
isAutoincrement: false;
|
|
33
|
+
hasRuntimeDefault: false;
|
|
34
|
+
enumValues: [string, ...string[]];
|
|
35
|
+
baseColumn: never;
|
|
36
|
+
identity: undefined;
|
|
37
|
+
generated: undefined;
|
|
38
|
+
}, {}, {
|
|
39
|
+
length: number | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
seq: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
42
|
+
name: "seq";
|
|
43
|
+
tableName: "task_log_events";
|
|
44
|
+
dataType: "number";
|
|
45
|
+
columnType: "SQLiteInteger";
|
|
46
|
+
data: number;
|
|
47
|
+
driverParam: number;
|
|
48
|
+
notNull: true;
|
|
49
|
+
hasDefault: false;
|
|
50
|
+
isPrimaryKey: false;
|
|
51
|
+
isAutoincrement: false;
|
|
52
|
+
hasRuntimeDefault: false;
|
|
53
|
+
enumValues: undefined;
|
|
54
|
+
baseColumn: never;
|
|
55
|
+
identity: undefined;
|
|
56
|
+
generated: undefined;
|
|
57
|
+
}, {}, {}>;
|
|
58
|
+
timestamp: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
59
|
+
name: "timestamp";
|
|
60
|
+
tableName: "task_log_events";
|
|
61
|
+
dataType: "string";
|
|
62
|
+
columnType: "SQLiteText";
|
|
63
|
+
data: string;
|
|
64
|
+
driverParam: string;
|
|
65
|
+
notNull: true;
|
|
66
|
+
hasDefault: false;
|
|
67
|
+
isPrimaryKey: false;
|
|
68
|
+
isAutoincrement: false;
|
|
69
|
+
hasRuntimeDefault: false;
|
|
70
|
+
enumValues: [string, ...string[]];
|
|
71
|
+
baseColumn: never;
|
|
72
|
+
identity: undefined;
|
|
73
|
+
generated: undefined;
|
|
74
|
+
}, {}, {
|
|
75
|
+
length: number | undefined;
|
|
76
|
+
}>;
|
|
77
|
+
level: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
78
|
+
name: "level";
|
|
79
|
+
tableName: "task_log_events";
|
|
80
|
+
dataType: "string";
|
|
81
|
+
columnType: "SQLiteText";
|
|
82
|
+
data: string;
|
|
83
|
+
driverParam: string;
|
|
84
|
+
notNull: true;
|
|
85
|
+
hasDefault: false;
|
|
86
|
+
isPrimaryKey: false;
|
|
87
|
+
isAutoincrement: false;
|
|
88
|
+
hasRuntimeDefault: false;
|
|
89
|
+
enumValues: [string, ...string[]];
|
|
90
|
+
baseColumn: never;
|
|
91
|
+
identity: undefined;
|
|
92
|
+
generated: undefined;
|
|
93
|
+
}, {}, {
|
|
94
|
+
length: number | undefined;
|
|
95
|
+
}>;
|
|
96
|
+
message: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
97
|
+
name: "message";
|
|
98
|
+
tableName: "task_log_events";
|
|
99
|
+
dataType: "string";
|
|
100
|
+
columnType: "SQLiteText";
|
|
101
|
+
data: string;
|
|
102
|
+
driverParam: string;
|
|
103
|
+
notNull: true;
|
|
104
|
+
hasDefault: false;
|
|
105
|
+
isPrimaryKey: false;
|
|
106
|
+
isAutoincrement: false;
|
|
107
|
+
hasRuntimeDefault: false;
|
|
108
|
+
enumValues: [string, ...string[]];
|
|
109
|
+
baseColumn: never;
|
|
110
|
+
identity: undefined;
|
|
111
|
+
generated: undefined;
|
|
112
|
+
}, {}, {
|
|
113
|
+
length: number | undefined;
|
|
114
|
+
}>;
|
|
115
|
+
};
|
|
116
|
+
dialect: "sqlite";
|
|
117
|
+
}>;
|
|
118
|
+
export type TaskLogEvent = typeof task_log_events.$inferSelect;
|
|
119
|
+
export type NewTaskLogEvent = typeof task_log_events.$inferInsert;
|
package/dist/schema/tasks.d.ts
CHANGED
|
@@ -522,6 +522,59 @@ export declare const tasks: import("drizzle-orm/sqlite-core").SQLiteTableWithCol
|
|
|
522
522
|
}, {}, {
|
|
523
523
|
length: number | undefined;
|
|
524
524
|
}>;
|
|
525
|
+
log_storage: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
526
|
+
name: "log_storage";
|
|
527
|
+
tableName: "tasks";
|
|
528
|
+
dataType: "string";
|
|
529
|
+
columnType: "SQLiteText";
|
|
530
|
+
data: "blob" | "events";
|
|
531
|
+
driverParam: string;
|
|
532
|
+
notNull: true;
|
|
533
|
+
hasDefault: true;
|
|
534
|
+
isPrimaryKey: false;
|
|
535
|
+
isAutoincrement: false;
|
|
536
|
+
hasRuntimeDefault: false;
|
|
537
|
+
enumValues: ["blob", "events"];
|
|
538
|
+
baseColumn: never;
|
|
539
|
+
identity: undefined;
|
|
540
|
+
generated: undefined;
|
|
541
|
+
}, {}, {
|
|
542
|
+
length: number | undefined;
|
|
543
|
+
}>;
|
|
544
|
+
last_log_seq: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
545
|
+
name: "last_log_seq";
|
|
546
|
+
tableName: "tasks";
|
|
547
|
+
dataType: "number";
|
|
548
|
+
columnType: "SQLiteInteger";
|
|
549
|
+
data: number;
|
|
550
|
+
driverParam: number;
|
|
551
|
+
notNull: true;
|
|
552
|
+
hasDefault: true;
|
|
553
|
+
isPrimaryKey: false;
|
|
554
|
+
isAutoincrement: false;
|
|
555
|
+
hasRuntimeDefault: false;
|
|
556
|
+
enumValues: undefined;
|
|
557
|
+
baseColumn: never;
|
|
558
|
+
identity: undefined;
|
|
559
|
+
generated: undefined;
|
|
560
|
+
}, {}, {}>;
|
|
561
|
+
log_revision: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
562
|
+
name: "log_revision";
|
|
563
|
+
tableName: "tasks";
|
|
564
|
+
dataType: "number";
|
|
565
|
+
columnType: "SQLiteInteger";
|
|
566
|
+
data: number;
|
|
567
|
+
driverParam: number;
|
|
568
|
+
notNull: true;
|
|
569
|
+
hasDefault: true;
|
|
570
|
+
isPrimaryKey: false;
|
|
571
|
+
isAutoincrement: false;
|
|
572
|
+
hasRuntimeDefault: false;
|
|
573
|
+
enumValues: undefined;
|
|
574
|
+
baseColumn: never;
|
|
575
|
+
identity: undefined;
|
|
576
|
+
generated: undefined;
|
|
577
|
+
}, {}, {}>;
|
|
525
578
|
thread_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
526
579
|
name: "thread_id";
|
|
527
580
|
tableName: "tasks";
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1729,6 +1729,7 @@ export interface CrewxOptions {
|
|
|
1729
1729
|
remoteFactory?: (configPath: string) => Promise<import('../facade/Crewx').Crewx>;
|
|
1730
1730
|
includeBuiltIns?: boolean;
|
|
1731
1731
|
additionalArgsProvider?: import('../provider/bridge').AdditionalArgsProvider;
|
|
1732
|
+
globalSettings?: import('../config/global-settings').GlobalSettingsStore;
|
|
1732
1733
|
}
|
|
1733
1734
|
export type ContextMode = 'full' | 'instruction-only';
|
|
1734
1735
|
export interface QueryOptions {
|