duocode 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/.env.example +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +52 -0
  4. package/dist/ast/context.d.ts +16 -0
  5. package/dist/ast/context.js +37 -0
  6. package/dist/ast/context.js.map +1 -0
  7. package/dist/ast/diff.d.ts +27 -0
  8. package/dist/ast/diff.js +44 -0
  9. package/dist/ast/diff.js.map +1 -0
  10. package/dist/ast/locks.d.ts +47 -0
  11. package/dist/ast/locks.js +88 -0
  12. package/dist/ast/locks.js.map +1 -0
  13. package/dist/ast/merge.d.ts +22 -0
  14. package/dist/ast/merge.js +120 -0
  15. package/dist/ast/merge.js.map +1 -0
  16. package/dist/ast/ownership.d.ts +31 -0
  17. package/dist/ast/ownership.js +111 -0
  18. package/dist/ast/ownership.js.map +1 -0
  19. package/dist/ast/parser.d.ts +44 -0
  20. package/dist/ast/parser.js +134 -0
  21. package/dist/ast/parser.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.js +423 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +5 -0
  26. package/dist/commands/doctor.js +63 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/duo.d.ts +9 -0
  29. package/dist/commands/duo.js +285 -0
  30. package/dist/commands/duo.js.map +1 -0
  31. package/dist/commands/github.d.ts +2 -0
  32. package/dist/commands/github.js +85 -0
  33. package/dist/commands/github.js.map +1 -0
  34. package/dist/commands/init.d.ts +2 -0
  35. package/dist/commands/init.js +33 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/negotiation.d.ts +2 -0
  38. package/dist/commands/negotiation.js +160 -0
  39. package/dist/commands/negotiation.js.map +1 -0
  40. package/dist/commands/repl_commands.d.ts +26 -0
  41. package/dist/commands/repl_commands.js +226 -0
  42. package/dist/commands/repl_commands.js.map +1 -0
  43. package/dist/commands/shell.d.ts +1 -0
  44. package/dist/commands/shell.js +110 -0
  45. package/dist/commands/shell.js.map +1 -0
  46. package/dist/commands/start.d.ts +2 -0
  47. package/dist/commands/start.js +231 -0
  48. package/dist/commands/start.js.map +1 -0
  49. package/dist/commands/task.d.ts +2 -0
  50. package/dist/commands/task.js +215 -0
  51. package/dist/commands/task.js.map +1 -0
  52. package/dist/config/loader.d.ts +193 -0
  53. package/dist/config/loader.js +106 -0
  54. package/dist/config/loader.js.map +1 -0
  55. package/dist/context/project_context.d.ts +79 -0
  56. package/dist/context/project_context.js +292 -0
  57. package/dist/context/project_context.js.map +1 -0
  58. package/dist/context/token_budget.d.ts +35 -0
  59. package/dist/context/token_budget.js +81 -0
  60. package/dist/context/token_budget.js.map +1 -0
  61. package/dist/db/queries.d.ts +121 -0
  62. package/dist/db/queries.js +109 -0
  63. package/dist/db/queries.js.map +1 -0
  64. package/dist/db/schema.d.ts +110 -0
  65. package/dist/db/schema.js +346 -0
  66. package/dist/db/schema.js.map +1 -0
  67. package/dist/duo/duo_orchestrator.d.ts +50 -0
  68. package/dist/duo/duo_orchestrator.js +510 -0
  69. package/dist/duo/duo_orchestrator.js.map +1 -0
  70. package/dist/duo/duo_session.d.ts +47 -0
  71. package/dist/duo/duo_session.js +127 -0
  72. package/dist/duo/duo_session.js.map +1 -0
  73. package/dist/duo/duo_types.d.ts +168 -0
  74. package/dist/duo/duo_types.js +53 -0
  75. package/dist/duo/duo_types.js.map +1 -0
  76. package/dist/duo/session_store.d.ts +71 -0
  77. package/dist/duo/session_store.js +177 -0
  78. package/dist/duo/session_store.js.map +1 -0
  79. package/dist/git/worktree.d.ts +21 -0
  80. package/dist/git/worktree.js +86 -0
  81. package/dist/git/worktree.js.map +1 -0
  82. package/dist/github/cache.d.ts +23 -0
  83. package/dist/github/cache.js +67 -0
  84. package/dist/github/cache.js.map +1 -0
  85. package/dist/github/issues.d.ts +17 -0
  86. package/dist/github/issues.js +93 -0
  87. package/dist/github/issues.js.map +1 -0
  88. package/dist/github/mcp_client.d.ts +57 -0
  89. package/dist/github/mcp_client.js +214 -0
  90. package/dist/github/mcp_client.js.map +1 -0
  91. package/dist/github/sync.d.ts +11 -0
  92. package/dist/github/sync.js +65 -0
  93. package/dist/github/sync.js.map +1 -0
  94. package/dist/github/webhook.d.ts +25 -0
  95. package/dist/github/webhook.js +197 -0
  96. package/dist/github/webhook.js.map +1 -0
  97. package/dist/negotiation/index.d.ts +1 -0
  98. package/dist/negotiation/index.js +2 -0
  99. package/dist/negotiation/index.js.map +1 -0
  100. package/dist/negotiation/protocol.d.ts +62 -0
  101. package/dist/negotiation/protocol.js +188 -0
  102. package/dist/negotiation/protocol.js.map +1 -0
  103. package/dist/orchestrator/complexity_scorer.d.ts +2 -0
  104. package/dist/orchestrator/complexity_scorer.js +79 -0
  105. package/dist/orchestrator/complexity_scorer.js.map +1 -0
  106. package/dist/orchestrator/dependency_graph.d.ts +7 -0
  107. package/dist/orchestrator/dependency_graph.js +73 -0
  108. package/dist/orchestrator/dependency_graph.js.map +1 -0
  109. package/dist/orchestrator/intent_parser.d.ts +11 -0
  110. package/dist/orchestrator/intent_parser.js +116 -0
  111. package/dist/orchestrator/intent_parser.js.map +1 -0
  112. package/dist/orchestrator/task_runner.d.ts +56 -0
  113. package/dist/orchestrator/task_runner.js +181 -0
  114. package/dist/orchestrator/task_runner.js.map +1 -0
  115. package/dist/orchestrator/types.d.ts +44 -0
  116. package/dist/orchestrator/types.js +21 -0
  117. package/dist/orchestrator/types.js.map +1 -0
  118. package/dist/providers/anthropic.d.ts +12 -0
  119. package/dist/providers/anthropic.js +258 -0
  120. package/dist/providers/anthropic.js.map +1 -0
  121. package/dist/providers/auction.d.ts +42 -0
  122. package/dist/providers/auction.js +190 -0
  123. package/dist/providers/auction.js.map +1 -0
  124. package/dist/providers/base.d.ts +103 -0
  125. package/dist/providers/base.js +2 -0
  126. package/dist/providers/base.js.map +1 -0
  127. package/dist/providers/cost_tracker.d.ts +45 -0
  128. package/dist/providers/cost_tracker.js +111 -0
  129. package/dist/providers/cost_tracker.js.map +1 -0
  130. package/dist/providers/duo_pair_router.d.ts +11 -0
  131. package/dist/providers/duo_pair_router.js +67 -0
  132. package/dist/providers/duo_pair_router.js.map +1 -0
  133. package/dist/providers/factory.d.ts +7 -0
  134. package/dist/providers/factory.js +130 -0
  135. package/dist/providers/factory.js.map +1 -0
  136. package/dist/providers/grading_rubric.d.ts +37 -0
  137. package/dist/providers/grading_rubric.js +238 -0
  138. package/dist/providers/grading_rubric.js.map +1 -0
  139. package/dist/providers/openai.d.ts +12 -0
  140. package/dist/providers/openai.js +229 -0
  141. package/dist/providers/openai.js.map +1 -0
  142. package/dist/providers/openrouter.d.ts +14 -0
  143. package/dist/providers/openrouter.js +178 -0
  144. package/dist/providers/openrouter.js.map +1 -0
  145. package/dist/providers/performance_tracker.d.ts +21 -0
  146. package/dist/providers/performance_tracker.js +63 -0
  147. package/dist/providers/performance_tracker.js.map +1 -0
  148. package/dist/providers/registry_loader.d.ts +6 -0
  149. package/dist/providers/registry_loader.js +54 -0
  150. package/dist/providers/registry_loader.js.map +1 -0
  151. package/dist/providers/retry.d.ts +66 -0
  152. package/dist/providers/retry.js +203 -0
  153. package/dist/providers/retry.js.map +1 -0
  154. package/dist/providers/role_scorer.d.ts +16 -0
  155. package/dist/providers/role_scorer.js +16 -0
  156. package/dist/providers/role_scorer.js.map +1 -0
  157. package/dist/providers/router.d.ts +84 -0
  158. package/dist/providers/router.js +542 -0
  159. package/dist/providers/router.js.map +1 -0
  160. package/dist/security/credentials.d.ts +6 -0
  161. package/dist/security/credentials.js +16 -0
  162. package/dist/security/credentials.js.map +1 -0
  163. package/dist/setup/browser.d.ts +1 -0
  164. package/dist/setup/browser.js +12 -0
  165. package/dist/setup/browser.js.map +1 -0
  166. package/dist/setup/global_config.d.ts +14 -0
  167. package/dist/setup/global_config.js +54 -0
  168. package/dist/setup/global_config.js.map +1 -0
  169. package/dist/setup/wizard.d.ts +2 -0
  170. package/dist/setup/wizard.js +206 -0
  171. package/dist/setup/wizard.js.map +1 -0
  172. package/dist/tools/agent_loop.d.ts +38 -0
  173. package/dist/tools/agent_loop.js +72 -0
  174. package/dist/tools/agent_loop.js.map +1 -0
  175. package/dist/tools/approval.d.ts +64 -0
  176. package/dist/tools/approval.js +172 -0
  177. package/dist/tools/approval.js.map +1 -0
  178. package/dist/tools/checkpoint.d.ts +65 -0
  179. package/dist/tools/checkpoint.js +342 -0
  180. package/dist/tools/checkpoint.js.map +1 -0
  181. package/dist/tools/definitions.d.ts +13 -0
  182. package/dist/tools/definitions.js +103 -0
  183. package/dist/tools/definitions.js.map +1 -0
  184. package/dist/tools/diff_display.d.ts +46 -0
  185. package/dist/tools/diff_display.js +298 -0
  186. package/dist/tools/diff_display.js.map +1 -0
  187. package/dist/tools/executor.d.ts +12 -0
  188. package/dist/tools/executor.js +340 -0
  189. package/dist/tools/executor.js.map +1 -0
  190. package/dist/tools/permissions.d.ts +17 -0
  191. package/dist/tools/permissions.js +139 -0
  192. package/dist/tools/permissions.js.map +1 -0
  193. package/dist/tools/tool_types.d.ts +48 -0
  194. package/dist/tools/tool_types.js +7 -0
  195. package/dist/tools/tool_types.js.map +1 -0
  196. package/dist/ui/banner.d.ts +4 -0
  197. package/dist/ui/banner.js +104 -0
  198. package/dist/ui/banner.js.map +1 -0
  199. package/dist/ui/callbacks.d.ts +30 -0
  200. package/dist/ui/callbacks.js +132 -0
  201. package/dist/ui/callbacks.js.map +1 -0
  202. package/dist/ui/colors.d.ts +14 -0
  203. package/dist/ui/colors.js +28 -0
  204. package/dist/ui/colors.js.map +1 -0
  205. package/dist/ui/dashboard.d.ts +51 -0
  206. package/dist/ui/dashboard.js +181 -0
  207. package/dist/ui/dashboard.js.map +1 -0
  208. package/dist/ui/leaderboard.d.ts +16 -0
  209. package/dist/ui/leaderboard.js +43 -0
  210. package/dist/ui/leaderboard.js.map +1 -0
  211. package/dist/ui/logger.d.ts +28 -0
  212. package/dist/ui/logger.js +117 -0
  213. package/dist/ui/logger.js.map +1 -0
  214. package/dist/ui/progress.d.ts +16 -0
  215. package/dist/ui/progress.js +62 -0
  216. package/dist/ui/progress.js.map +1 -0
  217. package/dist/ui/tokenizer.d.ts +5 -0
  218. package/dist/ui/tokenizer.js +54 -0
  219. package/dist/ui/tokenizer.js.map +1 -0
  220. package/package.json +63 -0
@@ -0,0 +1,110 @@
1
+ import Database from "better-sqlite3";
2
+ export declare const CURRENT_SCHEMA_VERSION = 7;
3
+ export type TaskPriority = "low" | "medium" | "high" | "critical";
4
+ export type TaskStatus = "pending" | "routed" | "executing" | "reviewing" | "completed" | "failed" | "cancelled";
5
+ export interface TaskRecord {
6
+ id: string;
7
+ title: string;
8
+ description: string;
9
+ priority: TaskPriority;
10
+ requiredCapabilities: string[];
11
+ status: TaskStatus;
12
+ worktreePath: string | null;
13
+ }
14
+ export type NegotiationPhase = "detection" | "analysis" | "auto_resolving" | "debating" | "resolved" | "escalated";
15
+ export type NegotiationMethod = "auto_compose" | "debate_winner" | "escalated";
16
+ export interface NegotiationSessionRecord {
17
+ id: string;
18
+ taskId: string | null;
19
+ filePath: string;
20
+ language: "typescript" | "python" | "go";
21
+ phase: NegotiationPhase;
22
+ conflictCount: number;
23
+ resolutionMethod: NegotiationMethod | null;
24
+ winnerAgentId: string | null;
25
+ confidence: number | null;
26
+ explanation: string | null;
27
+ mergedSource: string | null;
28
+ }
29
+ export interface NegotiationRoundRecord {
30
+ negotiationId: string;
31
+ roundNumber: number;
32
+ leftScore: number;
33
+ rightScore: number;
34
+ consensus: number;
35
+ reasoning: string;
36
+ }
37
+ export interface NegotiationConflictRecord {
38
+ negotiationId: string;
39
+ ownershipPath: string;
40
+ leftType: string;
41
+ rightType: string;
42
+ }
43
+ export interface ProviderUsageRecord {
44
+ requestId: string;
45
+ taskId: string | null;
46
+ provider: "openai" | "anthropic" | "openrouter";
47
+ model: string;
48
+ inputTokens: number;
49
+ outputTokens: number;
50
+ cacheReadInputTokens: number;
51
+ cacheWriteInputTokens: number;
52
+ costUsd: number;
53
+ }
54
+ export interface SharedContextRecord {
55
+ taskId: string;
56
+ filePath: string;
57
+ ownershipPath: string | null;
58
+ publisherAgentId: string;
59
+ content: string;
60
+ visibilityCsv: string;
61
+ }
62
+ export interface NegotiationLearningRecord {
63
+ negotiationId: string;
64
+ taskId: string | null;
65
+ filePath: string;
66
+ resolutionMethod: NegotiationMethod;
67
+ winnerAgentId: string | null;
68
+ confidence: number;
69
+ conflictCount: number;
70
+ roundCount: number;
71
+ consensusTrend: number;
72
+ recommendedAction: string;
73
+ }
74
+ export declare function getSchemaVersion(db: Database.Database): number;
75
+ export declare function migrateDatabase(db: Database.Database): number;
76
+ export declare function initDatabase(dbPath: string): Database.Database;
77
+ export declare function createTask(db: Database.Database, task: TaskRecord): void;
78
+ export declare function createWorktreeRoute(db: Database.Database, taskId: string, branchName: string, worktreePath: string): void;
79
+ export declare function updateTaskStatus(db: Database.Database, taskId: string, status: TaskStatus): void;
80
+ export declare function createNegotiationSession(db: Database.Database, record: NegotiationSessionRecord): void;
81
+ export declare function updateNegotiationSessionResolution(db: Database.Database, record: {
82
+ id: string;
83
+ phase: NegotiationPhase;
84
+ resolutionMethod: NegotiationMethod;
85
+ winnerAgentId: string | null;
86
+ confidence: number;
87
+ explanation: string;
88
+ mergedSource: string;
89
+ }): void;
90
+ export declare function createNegotiationRound(db: Database.Database, record: NegotiationRoundRecord): void;
91
+ export declare function createNegotiationConflict(db: Database.Database, record: NegotiationConflictRecord): void;
92
+ export declare function createProviderUsage(db: Database.Database, record: ProviderUsageRecord): void;
93
+ export declare function upsertAstOwnershipSnapshot(db: Database.Database, filePath: string, commitRef: string, language: "typescript" | "python" | "go", snapshotJson: string): void;
94
+ export declare function getAstOwnershipSnapshot(db: Database.Database, filePath: string, commitRef: string): {
95
+ language: string;
96
+ snapshot_json: string;
97
+ created_at: string;
98
+ } | null;
99
+ export declare function createSharedContext(db: Database.Database, record: SharedContextRecord): void;
100
+ export declare function listSharedContextForAgent(db: Database.Database, taskId: string, agentId: string, filePath?: string): Array<{
101
+ id: number;
102
+ task_id: string;
103
+ file_path: string;
104
+ ownership_path: string | null;
105
+ publisher_agent_id: string;
106
+ content: string;
107
+ visibility_csv: string;
108
+ created_at: string;
109
+ }>;
110
+ export declare function createNegotiationLearning(db: Database.Database, record: NegotiationLearningRecord): void;
@@ -0,0 +1,346 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import Database from "better-sqlite3";
4
+ export const CURRENT_SCHEMA_VERSION = 7;
5
+ const MIGRATIONS = {
6
+ 1: `
7
+ CREATE TABLE IF NOT EXISTS tasks (
8
+ id TEXT PRIMARY KEY,
9
+ title TEXT NOT NULL,
10
+ description TEXT NOT NULL DEFAULT '',
11
+ priority TEXT NOT NULL CHECK(priority IN ('low', 'medium', 'high', 'critical')),
12
+ required_capabilities TEXT NOT NULL DEFAULT '[]',
13
+ status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'routed', 'executing', 'reviewing', 'completed', 'failed', 'cancelled')),
14
+ worktree_path TEXT,
15
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
16
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
17
+ );
18
+
19
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
20
+ CREATE INDEX IF NOT EXISTS idx_tasks_created_at ON tasks(created_at);
21
+
22
+ CREATE TABLE IF NOT EXISTS worktree_routes (
23
+ task_id TEXT PRIMARY KEY REFERENCES tasks(id) ON DELETE CASCADE,
24
+ branch_name TEXT NOT NULL,
25
+ worktree_path TEXT NOT NULL,
26
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
27
+ );
28
+ `,
29
+ 2: `
30
+ CREATE TABLE IF NOT EXISTS negotiation_sessions (
31
+ id TEXT PRIMARY KEY,
32
+ task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
33
+ file_path TEXT NOT NULL,
34
+ language TEXT NOT NULL CHECK(language IN ('typescript', 'python', 'go')),
35
+ phase TEXT NOT NULL CHECK(phase IN ('detection', 'analysis', 'auto_resolving', 'debating', 'resolved', 'escalated')),
36
+ conflict_count INTEGER NOT NULL DEFAULT 0,
37
+ resolution_method TEXT CHECK(resolution_method IN ('auto_compose', 'debate_winner', 'escalated')),
38
+ winner_agent_id TEXT,
39
+ confidence REAL,
40
+ explanation TEXT,
41
+ merged_source TEXT,
42
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
43
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
44
+ );
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_negotiation_sessions_task ON negotiation_sessions(task_id);
47
+ CREATE INDEX IF NOT EXISTS idx_negotiation_sessions_phase ON negotiation_sessions(phase);
48
+
49
+ CREATE TABLE IF NOT EXISTS negotiation_rounds (
50
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
51
+ negotiation_id TEXT NOT NULL REFERENCES negotiation_sessions(id) ON DELETE CASCADE,
52
+ round_number INTEGER NOT NULL,
53
+ left_score REAL NOT NULL,
54
+ right_score REAL NOT NULL,
55
+ consensus REAL NOT NULL,
56
+ reasoning TEXT NOT NULL,
57
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
58
+ UNIQUE(negotiation_id, round_number)
59
+ );
60
+
61
+ CREATE TABLE IF NOT EXISTS negotiation_conflicts (
62
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
63
+ negotiation_id TEXT NOT NULL REFERENCES negotiation_sessions(id) ON DELETE CASCADE,
64
+ ownership_path TEXT NOT NULL,
65
+ left_type TEXT NOT NULL,
66
+ right_type TEXT NOT NULL,
67
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
68
+ );
69
+
70
+ CREATE INDEX IF NOT EXISTS idx_negotiation_conflicts_session ON negotiation_conflicts(negotiation_id);
71
+
72
+ CREATE TABLE IF NOT EXISTS provider_usage (
73
+ request_id TEXT PRIMARY KEY,
74
+ task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
75
+ provider TEXT NOT NULL CHECK(provider IN ('openai', 'anthropic', 'openrouter')),
76
+ model TEXT NOT NULL,
77
+ input_tokens INTEGER NOT NULL DEFAULT 0,
78
+ output_tokens INTEGER NOT NULL DEFAULT 0,
79
+ cache_read_input_tokens INTEGER NOT NULL DEFAULT 0,
80
+ cache_write_input_tokens INTEGER NOT NULL DEFAULT 0,
81
+ cost_usd REAL NOT NULL DEFAULT 0,
82
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
83
+ );
84
+
85
+ CREATE INDEX IF NOT EXISTS idx_provider_usage_task ON provider_usage(task_id);
86
+ CREATE INDEX IF NOT EXISTS idx_provider_usage_model ON provider_usage(model);
87
+ `,
88
+ 3: `
89
+ CREATE TABLE IF NOT EXISTS ast_ownership_snapshots (
90
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
91
+ file_path TEXT NOT NULL,
92
+ commit_ref TEXT NOT NULL,
93
+ language TEXT NOT NULL CHECK(language IN ('typescript', 'python', 'go')),
94
+ snapshot_json TEXT NOT NULL,
95
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
96
+ UNIQUE(file_path, commit_ref)
97
+ );
98
+
99
+ CREATE INDEX IF NOT EXISTS idx_ast_snapshots_file ON ast_ownership_snapshots(file_path);
100
+ CREATE INDEX IF NOT EXISTS idx_ast_snapshots_ref ON ast_ownership_snapshots(commit_ref);
101
+ `,
102
+ 4: `
103
+ CREATE TABLE IF NOT EXISTS shared_context (
104
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
105
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
106
+ file_path TEXT NOT NULL,
107
+ ownership_path TEXT,
108
+ publisher_agent_id TEXT NOT NULL,
109
+ content TEXT NOT NULL,
110
+ visibility_csv TEXT NOT NULL DEFAULT ',*,',
111
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
112
+ );
113
+
114
+ CREATE INDEX IF NOT EXISTS idx_shared_context_task ON shared_context(task_id);
115
+ CREATE INDEX IF NOT EXISTS idx_shared_context_file ON shared_context(file_path);
116
+ CREATE INDEX IF NOT EXISTS idx_shared_context_agent ON shared_context(publisher_agent_id);
117
+ `,
118
+ 5: `
119
+ CREATE TABLE IF NOT EXISTS negotiation_learning (
120
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
121
+ negotiation_id TEXT NOT NULL UNIQUE REFERENCES negotiation_sessions(id) ON DELETE CASCADE,
122
+ task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
123
+ file_path TEXT NOT NULL,
124
+ resolution_method TEXT NOT NULL CHECK(resolution_method IN ('auto_compose', 'debate_winner', 'escalated')),
125
+ winner_agent_id TEXT,
126
+ confidence REAL NOT NULL,
127
+ conflict_count INTEGER NOT NULL DEFAULT 0,
128
+ round_count INTEGER NOT NULL DEFAULT 0,
129
+ consensus_trend REAL NOT NULL DEFAULT 0,
130
+ recommended_action TEXT NOT NULL,
131
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
132
+ );
133
+
134
+ CREATE INDEX IF NOT EXISTS idx_negotiation_learning_task ON negotiation_learning(task_id);
135
+ CREATE INDEX IF NOT EXISTS idx_negotiation_learning_resolution ON negotiation_learning(resolution_method);
136
+ `,
137
+ 6: `
138
+ CREATE TABLE IF NOT EXISTS elo_ratings (
139
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
140
+ model TEXT NOT NULL,
141
+ role TEXT NOT NULL CHECK(role IN ('architect', 'executor')),
142
+ capability_bucket TEXT NOT NULL,
143
+ elo REAL NOT NULL DEFAULT 1500,
144
+ match_count INTEGER NOT NULL DEFAULT 0,
145
+ last_updated TEXT NOT NULL DEFAULT (datetime('now')),
146
+ UNIQUE(model, role, capability_bucket)
147
+ );
148
+
149
+ CREATE INDEX IF NOT EXISTS idx_elo_ratings_model_role ON elo_ratings(model, role);
150
+
151
+ CREATE TABLE IF NOT EXISTS grading_results (
152
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
153
+ task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
154
+ model TEXT NOT NULL,
155
+ role TEXT NOT NULL CHECK(role IN ('architect', 'executor')),
156
+ correctness REAL NOT NULL,
157
+ security REAL NOT NULL,
158
+ efficiency REAL NOT NULL,
159
+ robustness REAL NOT NULL,
160
+ maintainability REAL NOT NULL,
161
+ usability REAL NOT NULL,
162
+ composite_score REAL NOT NULL,
163
+ graded_by TEXT NOT NULL,
164
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
165
+ );
166
+
167
+ CREATE INDEX IF NOT EXISTS idx_grading_results_task ON grading_results(task_id);
168
+ CREATE INDEX IF NOT EXISTS idx_grading_results_model ON grading_results(model);
169
+ `,
170
+ 7: `
171
+ CREATE TABLE IF NOT EXISTS github_pr_sync (
172
+ task_id TEXT PRIMARY KEY,
173
+ pr_number INTEGER NOT NULL,
174
+ pr_state TEXT NOT NULL,
175
+ synced_at TEXT NOT NULL DEFAULT (datetime('now'))
176
+ );
177
+
178
+ CREATE INDEX IF NOT EXISTS idx_github_pr_sync_pr ON github_pr_sync(pr_number);
179
+
180
+ CREATE TABLE IF NOT EXISTS github_issue_tasks (
181
+ issue_number INTEGER PRIMARY KEY,
182
+ task_id TEXT NOT NULL,
183
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
184
+ );
185
+
186
+ CREATE INDEX IF NOT EXISTS idx_github_issue_tasks_task ON github_issue_tasks(task_id);
187
+ `,
188
+ };
189
+ function ensureMetadataTable(db) {
190
+ db.exec(`
191
+ CREATE TABLE IF NOT EXISTS schema_metadata (
192
+ key TEXT PRIMARY KEY,
193
+ value TEXT NOT NULL
194
+ )
195
+ `);
196
+ db.prepare(`INSERT OR IGNORE INTO schema_metadata (key, value) VALUES ('schema_version', '0')`).run();
197
+ }
198
+ export function getSchemaVersion(db) {
199
+ ensureMetadataTable(db);
200
+ const row = db.prepare(`SELECT value FROM schema_metadata WHERE key = 'schema_version'`).get();
201
+ return Number.parseInt(row.value, 10);
202
+ }
203
+ function setSchemaVersion(db, version) {
204
+ db.prepare(`UPDATE schema_metadata SET value = ? WHERE key = 'schema_version'`).run(String(version));
205
+ }
206
+ export function migrateDatabase(db) {
207
+ ensureMetadataTable(db);
208
+ let current = getSchemaVersion(db);
209
+ const tx = db.transaction(() => {
210
+ for (let version = current + 1; version <= CURRENT_SCHEMA_VERSION; version += 1) {
211
+ const sql = MIGRATIONS[version];
212
+ if (!sql) {
213
+ throw new Error(`Missing migration for schema version ${version}`);
214
+ }
215
+ db.exec(sql);
216
+ setSchemaVersion(db, version);
217
+ current = version;
218
+ }
219
+ });
220
+ tx();
221
+ return current;
222
+ }
223
+ export function initDatabase(dbPath) {
224
+ fs.mkdirSync(path.dirname(dbPath), { recursive: true });
225
+ const db = new Database(dbPath);
226
+ db.pragma("journal_mode = WAL");
227
+ db.pragma("foreign_keys = ON");
228
+ migrateDatabase(db);
229
+ return db;
230
+ }
231
+ export function createTask(db, task) {
232
+ const stmt = db.prepare(`
233
+ INSERT INTO tasks (
234
+ id, title, description, priority, required_capabilities, status, worktree_path
235
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)
236
+ `);
237
+ stmt.run(task.id, task.title, task.description, task.priority, JSON.stringify(task.requiredCapabilities), task.status, task.worktreePath);
238
+ }
239
+ export function createWorktreeRoute(db, taskId, branchName, worktreePath) {
240
+ db.prepare(`INSERT INTO worktree_routes (task_id, branch_name, worktree_path) VALUES (?, ?, ?)`).run(taskId, branchName, worktreePath);
241
+ db.prepare(`UPDATE tasks SET worktree_path = ?, status = 'routed', updated_at = datetime('now') WHERE id = ?`).run(worktreePath, taskId);
242
+ }
243
+ export function updateTaskStatus(db, taskId, status) {
244
+ db.prepare(`UPDATE tasks SET status = ?, updated_at = datetime('now') WHERE id = ?`).run(status, taskId);
245
+ }
246
+ export function createNegotiationSession(db, record) {
247
+ db.prepare(`
248
+ INSERT INTO negotiation_sessions (
249
+ id, task_id, file_path, language, phase, conflict_count,
250
+ resolution_method, winner_agent_id, confidence, explanation, merged_source
251
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
252
+ `).run(record.id, record.taskId, record.filePath, record.language, record.phase, record.conflictCount, record.resolutionMethod, record.winnerAgentId, record.confidence, record.explanation, record.mergedSource);
253
+ }
254
+ export function updateNegotiationSessionResolution(db, record) {
255
+ db.prepare(`
256
+ UPDATE negotiation_sessions
257
+ SET
258
+ phase = ?,
259
+ resolution_method = ?,
260
+ winner_agent_id = ?,
261
+ confidence = ?,
262
+ explanation = ?,
263
+ merged_source = ?,
264
+ updated_at = datetime('now')
265
+ WHERE id = ?
266
+ `).run(record.phase, record.resolutionMethod, record.winnerAgentId, record.confidence, record.explanation, record.mergedSource, record.id);
267
+ }
268
+ export function createNegotiationRound(db, record) {
269
+ db.prepare(`
270
+ INSERT INTO negotiation_rounds (
271
+ negotiation_id, round_number, left_score, right_score, consensus, reasoning
272
+ ) VALUES (?, ?, ?, ?, ?, ?)
273
+ `).run(record.negotiationId, record.roundNumber, record.leftScore, record.rightScore, record.consensus, record.reasoning);
274
+ }
275
+ export function createNegotiationConflict(db, record) {
276
+ db.prepare(`
277
+ INSERT INTO negotiation_conflicts (
278
+ negotiation_id, ownership_path, left_type, right_type
279
+ ) VALUES (?, ?, ?, ?)
280
+ `).run(record.negotiationId, record.ownershipPath, record.leftType, record.rightType);
281
+ }
282
+ export function createProviderUsage(db, record) {
283
+ db.prepare(`
284
+ INSERT INTO provider_usage (
285
+ request_id, task_id, provider, model,
286
+ input_tokens, output_tokens, cache_read_input_tokens,
287
+ cache_write_input_tokens, cost_usd
288
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
289
+ `).run(record.requestId, record.taskId, record.provider, record.model, record.inputTokens, record.outputTokens, record.cacheReadInputTokens, record.cacheWriteInputTokens, record.costUsd);
290
+ }
291
+ export function upsertAstOwnershipSnapshot(db, filePath, commitRef, language, snapshotJson) {
292
+ db.prepare(`
293
+ INSERT INTO ast_ownership_snapshots (file_path, commit_ref, language, snapshot_json)
294
+ VALUES (?, ?, ?, ?)
295
+ ON CONFLICT(file_path, commit_ref) DO UPDATE SET
296
+ language = excluded.language,
297
+ snapshot_json = excluded.snapshot_json,
298
+ created_at = datetime('now')
299
+ `).run(filePath, commitRef, language, snapshotJson);
300
+ }
301
+ export function getAstOwnershipSnapshot(db, filePath, commitRef) {
302
+ return db
303
+ .prepare("SELECT language, snapshot_json, created_at FROM ast_ownership_snapshots WHERE file_path = ? AND commit_ref = ?")
304
+ .get(filePath, commitRef);
305
+ }
306
+ export function createSharedContext(db, record) {
307
+ db.prepare(`
308
+ INSERT INTO shared_context (
309
+ task_id, file_path, ownership_path, publisher_agent_id, content, visibility_csv
310
+ ) VALUES (?, ?, ?, ?, ?, ?)
311
+ `).run(record.taskId, record.filePath, record.ownershipPath, record.publisherAgentId, record.content, record.visibilityCsv);
312
+ }
313
+ export function listSharedContextForAgent(db, taskId, agentId, filePath) {
314
+ if (filePath) {
315
+ return db.prepare(`
316
+ SELECT * FROM shared_context
317
+ WHERE task_id = ?
318
+ AND file_path = ?
319
+ AND publisher_agent_id != ?
320
+ AND (
321
+ visibility_csv LIKE '%,*,%'
322
+ OR visibility_csv LIKE ?
323
+ )
324
+ ORDER BY created_at ASC
325
+ `).all(taskId, filePath, agentId, `%,${agentId},%`);
326
+ }
327
+ return db.prepare(`
328
+ SELECT * FROM shared_context
329
+ WHERE task_id = ?
330
+ AND publisher_agent_id != ?
331
+ AND (
332
+ visibility_csv LIKE '%,*,%'
333
+ OR visibility_csv LIKE ?
334
+ )
335
+ ORDER BY created_at ASC
336
+ `).all(taskId, agentId, `%,${agentId},%`);
337
+ }
338
+ export function createNegotiationLearning(db, record) {
339
+ db.prepare(`
340
+ INSERT INTO negotiation_learning (
341
+ negotiation_id, task_id, file_path, resolution_method, winner_agent_id,
342
+ confidence, conflict_count, round_count, consensus_trend, recommended_action
343
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
344
+ `).run(record.negotiationId, record.taskId, record.filePath, record.resolutionMethod, record.winnerAgentId, record.confidence, record.conflictCount, record.roundCount, record.consensusTrend, record.recommendedAction);
345
+ }
346
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { ProviderRouter, CapabilityRouter } from "../providers/router.js";
2
+ import type { CostTracker } from "../providers/cost_tracker.js";
3
+ import { type RetryConfig, type RetryListener } from "../providers/retry.js";
4
+ import type { DuoPairRequest, DuoPairAssignment, DuoPipelineResult, GradingResult, ConfirmationCallback, ArchitectReviewCallback, ModelPickerCallback, ModelPickerOption, DuoRole } from "./duo_types.js";
5
+ import type Database from "better-sqlite3";
6
+ import type { PermissionConfig } from "../tools/permissions.js";
7
+ export declare function printAssignment(assignment: DuoPairAssignment, revised?: boolean): void;
8
+ export declare function printGrading(grading: GradingResult): void;
9
+ export declare function printPhaseHeader(phase: "architect" | "executor", model: string): void;
10
+ export declare function printPhaseDone(phase: "architect" | "executor", durationMs: number, costUsd: number, tokens?: number): void;
11
+ export declare class UserAbortedError extends Error {
12
+ constructor();
13
+ }
14
+ export interface DuoOrchestratorOptions {
15
+ retryConfig?: RetryConfig;
16
+ onRetry?: RetryListener;
17
+ }
18
+ export declare class DuoOrchestrator {
19
+ private readonly providerRouter;
20
+ private readonly capabilityRouter;
21
+ private readonly costTracker;
22
+ private readonly db;
23
+ private readonly pairRouter;
24
+ private readonly gradingRubric;
25
+ private readonly performanceTracker;
26
+ private confirmationCallback?;
27
+ private architectReviewCallback?;
28
+ private modelPickerCallback?;
29
+ private permissionConfig?;
30
+ private readonly retryConfig?;
31
+ private readonly onRetry?;
32
+ constructor(providerRouter: ProviderRouter, capabilityRouter: CapabilityRouter, costTracker: CostTracker, db: Database.Database | null, confirmationCallback?: ConfirmationCallback, options?: DuoOrchestratorOptions);
33
+ /**
34
+ * Notify the retry listener about a failed attempt.
35
+ */
36
+ private notifyRetry;
37
+ /**
38
+ * Stream an LLM call, writing tokens to stdout in real-time.
39
+ * Falls back to non-streaming generate() when the provider router
40
+ * doesn't support streaming (e.g. in tests with mocked routers).
41
+ * Applies retry with exponential backoff if retryConfig is set.
42
+ */
43
+ private streamPhase;
44
+ setConfirmationCallback(cb: ConfirmationCallback | undefined): void;
45
+ setArchitectReviewCallback(cb: ArchitectReviewCallback | undefined): void;
46
+ setModelPickerCallback(cb: ModelPickerCallback | undefined): void;
47
+ setPermissionConfig(config: PermissionConfig | undefined): void;
48
+ buildPickerOptions(role: DuoRole, estimatedInputTokens: number, estimatedOutputTokens: number, currentModel: string): ModelPickerOption[];
49
+ execute(request: DuoPairRequest): Promise<DuoPipelineResult | null>;
50
+ }