@hasna/todos 0.11.14 → 0.11.15

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 (148) hide show
  1. package/dist/cli/brains.d.ts +3 -0
  2. package/dist/cli/brains.d.ts.map +1 -0
  3. package/dist/cli/commands/dispatch.d.ts +3 -0
  4. package/dist/cli/commands/dispatch.d.ts.map +1 -0
  5. package/dist/cli/components/App.d.ts +2 -0
  6. package/dist/cli/components/App.d.ts.map +1 -0
  7. package/dist/cli/components/Dashboard.d.ts +7 -0
  8. package/dist/cli/components/Dashboard.d.ts.map +1 -0
  9. package/dist/cli/components/Header.d.ts +8 -0
  10. package/dist/cli/components/Header.d.ts.map +1 -0
  11. package/dist/cli/components/ProjectList.d.ts +8 -0
  12. package/dist/cli/components/ProjectList.d.ts.map +1 -0
  13. package/dist/cli/components/SearchView.d.ts +10 -0
  14. package/dist/cli/components/SearchView.d.ts.map +1 -0
  15. package/dist/cli/components/TaskDetail.d.ts +7 -0
  16. package/dist/cli/components/TaskDetail.d.ts.map +1 -0
  17. package/dist/cli/components/TaskForm.d.ts +15 -0
  18. package/dist/cli/components/TaskForm.d.ts.map +1 -0
  19. package/dist/cli/components/TaskList.d.ts +8 -0
  20. package/dist/cli/components/TaskList.d.ts.map +1 -0
  21. package/dist/cli/index.d.ts +3 -0
  22. package/dist/cli/index.d.ts.map +1 -0
  23. package/dist/cli/index.js +4357 -4351
  24. package/dist/db/agent-metrics.d.ts +34 -0
  25. package/dist/db/agent-metrics.d.ts.map +1 -0
  26. package/dist/db/agents.d.ts +82 -0
  27. package/dist/db/agents.d.ts.map +1 -0
  28. package/dist/db/audit.d.ts +52 -0
  29. package/dist/db/audit.d.ts.map +1 -0
  30. package/dist/db/budgets.d.ts +27 -0
  31. package/dist/db/budgets.d.ts.map +1 -0
  32. package/dist/db/builtin-templates.d.ts +22 -0
  33. package/dist/db/builtin-templates.d.ts.map +1 -0
  34. package/dist/db/checklists.d.ts +13 -0
  35. package/dist/db/checklists.d.ts.map +1 -0
  36. package/dist/db/comments.d.ts +8 -0
  37. package/dist/db/comments.d.ts.map +1 -0
  38. package/dist/db/database.d.ts +12 -0
  39. package/dist/db/database.d.ts.map +1 -0
  40. package/dist/db/dispatches.d.ts +15 -0
  41. package/dist/db/dispatches.d.ts.map +1 -0
  42. package/dist/db/file-locks.d.ts +43 -0
  43. package/dist/db/file-locks.d.ts.map +1 -0
  44. package/dist/db/handoffs.d.ts +25 -0
  45. package/dist/db/handoffs.d.ts.map +1 -0
  46. package/dist/db/kg.d.ts +70 -0
  47. package/dist/db/kg.d.ts.map +1 -0
  48. package/dist/db/locks.d.ts +14 -0
  49. package/dist/db/locks.d.ts.map +1 -0
  50. package/dist/db/orgs.d.ts +13 -0
  51. package/dist/db/orgs.d.ts.map +1 -0
  52. package/dist/db/patrol.d.ts +35 -0
  53. package/dist/db/patrol.d.ts.map +1 -0
  54. package/dist/db/pg-migrate.d.ts +14 -0
  55. package/dist/db/pg-migrate.d.ts.map +1 -0
  56. package/dist/db/pg-migrations.d.ts +8 -0
  57. package/dist/db/pg-migrations.d.ts.map +1 -0
  58. package/dist/db/plans.d.ts +8 -0
  59. package/dist/db/plans.d.ts.map +1 -0
  60. package/dist/db/project-agent-roles.d.ts +34 -0
  61. package/dist/db/project-agent-roles.d.ts.map +1 -0
  62. package/dist/db/projects.d.ts +16 -0
  63. package/dist/db/projects.d.ts.map +1 -0
  64. package/dist/db/schema.d.ts +6 -0
  65. package/dist/db/schema.d.ts.map +1 -0
  66. package/dist/db/sessions.d.ts +8 -0
  67. package/dist/db/sessions.d.ts.map +1 -0
  68. package/dist/db/snapshots.d.ts +37 -0
  69. package/dist/db/snapshots.d.ts.map +1 -0
  70. package/dist/db/task-claim.d.ts +7 -0
  71. package/dist/db/task-claim.d.ts.map +1 -0
  72. package/dist/db/task-commits.d.ts +31 -0
  73. package/dist/db/task-commits.d.ts.map +1 -0
  74. package/dist/db/task-files.d.ts +74 -0
  75. package/dist/db/task-files.d.ts.map +1 -0
  76. package/dist/db/task-lists.d.ts +10 -0
  77. package/dist/db/task-lists.d.ts.map +1 -0
  78. package/dist/db/task-relationships.d.ts +36 -0
  79. package/dist/db/task-relationships.d.ts.map +1 -0
  80. package/dist/db/task-workflow.d.ts +7 -0
  81. package/dist/db/task-workflow.d.ts.map +1 -0
  82. package/dist/db/tasks.d.ts +215 -0
  83. package/dist/db/tasks.d.ts.map +1 -0
  84. package/dist/db/templates.d.ts +98 -0
  85. package/dist/db/templates.d.ts.map +1 -0
  86. package/dist/db/traces.d.ts +38 -0
  87. package/dist/db/traces.d.ts.map +1 -0
  88. package/dist/db/webhooks.d.ts +19 -0
  89. package/dist/db/webhooks.d.ts.map +1 -0
  90. package/dist/index.d.ts +71 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +146 -140
  93. package/dist/lib/agent-tasks.d.ts +11 -0
  94. package/dist/lib/agent-tasks.d.ts.map +1 -0
  95. package/dist/lib/auto-assign.d.ts +25 -0
  96. package/dist/lib/auto-assign.d.ts.map +1 -0
  97. package/dist/lib/burndown.d.ts +18 -0
  98. package/dist/lib/burndown.d.ts.map +1 -0
  99. package/dist/lib/claude-tasks.d.ts +20 -0
  100. package/dist/lib/claude-tasks.d.ts.map +1 -0
  101. package/dist/lib/completion-guard.d.ts +17 -0
  102. package/dist/lib/completion-guard.d.ts.map +1 -0
  103. package/dist/lib/config.d.ts +44 -0
  104. package/dist/lib/config.d.ts.map +1 -0
  105. package/dist/lib/dispatch-formatter.d.ts +21 -0
  106. package/dist/lib/dispatch-formatter.d.ts.map +1 -0
  107. package/dist/lib/dispatch.d.ts +28 -0
  108. package/dist/lib/dispatch.d.ts.map +1 -0
  109. package/dist/lib/extract.d.ts +51 -0
  110. package/dist/lib/extract.d.ts.map +1 -0
  111. package/dist/lib/gatherer.d.ts +16 -0
  112. package/dist/lib/gatherer.d.ts.map +1 -0
  113. package/dist/lib/github.d.ts +25 -0
  114. package/dist/lib/github.d.ts.map +1 -0
  115. package/dist/lib/model-config.d.ts +14 -0
  116. package/dist/lib/model-config.d.ts.map +1 -0
  117. package/dist/lib/recurrence.d.ts +10 -0
  118. package/dist/lib/recurrence.d.ts.map +1 -0
  119. package/dist/lib/search.d.ts +17 -0
  120. package/dist/lib/search.d.ts.map +1 -0
  121. package/dist/lib/sync-types.d.ts +16 -0
  122. package/dist/lib/sync-types.d.ts.map +1 -0
  123. package/dist/lib/sync-utils.d.ts +12 -0
  124. package/dist/lib/sync-utils.d.ts.map +1 -0
  125. package/dist/lib/sync.d.ts +9 -0
  126. package/dist/lib/sync.d.ts.map +1 -0
  127. package/dist/lib/tmux.d.ts +28 -0
  128. package/dist/lib/tmux.d.ts.map +1 -0
  129. package/dist/mcp/index.d.ts +3 -0
  130. package/dist/mcp/index.d.ts.map +1 -0
  131. package/dist/mcp/index.js +1177 -1181
  132. package/dist/mcp/tools/agents.d.ts +16 -0
  133. package/dist/mcp/tools/agents.d.ts.map +1 -0
  134. package/dist/mcp/tools/dispatch.d.ts +9 -0
  135. package/dist/mcp/tools/dispatch.d.ts.map +1 -0
  136. package/dist/mcp/tools/templates.d.ts +9 -0
  137. package/dist/mcp/tools/templates.d.ts.map +1 -0
  138. package/dist/mcp/tools/webhooks.d.ts +8 -0
  139. package/dist/mcp/tools/webhooks.d.ts.map +1 -0
  140. package/dist/sdk.d.ts +186 -0
  141. package/dist/sdk.d.ts.map +1 -0
  142. package/dist/server/index.d.ts +9 -0
  143. package/dist/server/index.d.ts.map +1 -0
  144. package/dist/server/serve.d.ts +10 -0
  145. package/dist/server/serve.d.ts.map +1 -0
  146. package/dist/types/index.d.ts +663 -0
  147. package/dist/types/index.d.ts.map +1 -0
  148. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ import type { Database } from "bun:sqlite";
2
+ export interface AgentMetrics {
3
+ agent_id: string;
4
+ agent_name: string;
5
+ tasks_completed: number;
6
+ tasks_failed: number;
7
+ tasks_in_progress: number;
8
+ completion_rate: number;
9
+ avg_completion_minutes: number | null;
10
+ avg_confidence: number | null;
11
+ review_score_avg: number | null;
12
+ composite_score: number;
13
+ }
14
+ export interface LeaderboardEntry extends AgentMetrics {
15
+ rank: number;
16
+ }
17
+ /**
18
+ * Compute metrics for a single agent from task data.
19
+ */
20
+ export declare function getAgentMetrics(agentId: string, opts?: {
21
+ project_id?: string;
22
+ }, db?: Database): AgentMetrics | null;
23
+ /**
24
+ * Get leaderboard: all agents ranked by composite score.
25
+ */
26
+ export declare function getLeaderboard(opts?: {
27
+ project_id?: string;
28
+ limit?: number;
29
+ }, db?: Database): LeaderboardEntry[];
30
+ /**
31
+ * Score a task completion (store review score in metadata).
32
+ */
33
+ export declare function scoreTask(taskId: string, score: number, reviewerId?: string, db?: Database): void;
34
+ //# sourceMappingURL=agent-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-metrics.d.ts","sourceRoot":"","sources":["../../src/db/agent-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,CAgGnH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,gBAAgB,EAAE,CAmBhH;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAajG"}
@@ -0,0 +1,82 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { Agent, AgentConflictError, RegisterAgentInput } from "../types/index.js";
3
+ /**
4
+ * Auto-release stale agents: clears session_id for agents whose last_seen_at
5
+ * is beyond the active window. Enabled via TODOS_AGENT_AUTO_RELEASE=true.
6
+ */
7
+ export declare function autoReleaseStaleAgents(db?: Database): number;
8
+ /**
9
+ * Returns names from the pool that are not currently held by an active agent.
10
+ * Active = last_seen_at within the configured stale window.
11
+ */
12
+ export declare function getAvailableNamesFromPool(pool: string[], db: Database): string[];
13
+ /**
14
+ * Register an agent. Returns the agent or a conflict descriptor.
15
+ *
16
+ * Conflict rules:
17
+ * - Name free → create, bind session_id if provided
18
+ * - Name taken, same session_id → heartbeat, return agent ✓
19
+ * - Name taken, different session_id, agent ACTIVE → CONFLICT error (unless force: true)
20
+ * - Name taken, different session_id, agent STALE → takeover, update session_id
21
+ * - Name taken, no session_id provided, agent ACTIVE with session → CONFLICT error (tightened)
22
+ * - Name taken, no session_id provided, agent has no session or is stale → heartbeat + return
23
+ * - force: true → skip active-agent check and take over regardless
24
+ */
25
+ export declare function registerAgent(input: RegisterAgentInput, db?: Database): Agent | AgentConflictError;
26
+ export declare function isAgentConflict(result: Agent | AgentConflictError): result is AgentConflictError;
27
+ /**
28
+ * Release an agent — explicit logout. Clears session_id and sets last_seen_at to epoch
29
+ * so the name is immediately available for other agents.
30
+ *
31
+ * If session_id is provided, only release if it matches (prevents other sessions from
32
+ * releasing your agent).
33
+ */
34
+ export declare function releaseAgent(id: string, session_id?: string, db?: Database): boolean;
35
+ export declare function getAgent(id: string, db?: Database): Agent | null;
36
+ export declare function getAgentByName(name: string, db?: Database): Agent | null;
37
+ export declare function listAgents(opts?: {
38
+ include_archived?: boolean;
39
+ } | Database, db?: Database): Agent[];
40
+ export declare function updateAgentActivity(id: string, db?: Database): void;
41
+ export declare function updateAgent(id: string, input: {
42
+ name?: string;
43
+ description?: string;
44
+ role?: string;
45
+ title?: string;
46
+ level?: string;
47
+ permissions?: string[];
48
+ capabilities?: string[];
49
+ reports_to?: string | null;
50
+ org_id?: string | null;
51
+ metadata?: Record<string, unknown>;
52
+ }, db?: Database): Agent;
53
+ /** Soft-delete: archives the agent instead of removing it. Tasks referencing this agent are preserved. */
54
+ export declare function deleteAgent(id: string, db?: Database): boolean;
55
+ /** Archive an agent (soft delete). */
56
+ export declare function archiveAgent(id: string, db?: Database): Agent | null;
57
+ /** Restore an archived agent. */
58
+ export declare function unarchiveAgent(id: string, db?: Database): Agent | null;
59
+ /** Get direct reports of an agent. */
60
+ export declare function getDirectReports(agentId: string, db?: Database): Agent[];
61
+ /** Get the full org tree starting from top-level agents (reports_to IS NULL). */
62
+ export declare function getOrgChart(db?: Database): OrgNode[];
63
+ export interface OrgNode {
64
+ agent: Agent;
65
+ reports: OrgNode[];
66
+ }
67
+ /**
68
+ * Match agent capabilities against required capabilities (task tags).
69
+ * Returns a score from 0.0 (no match) to 1.0 (perfect match).
70
+ */
71
+ export declare function matchCapabilities(agentCapabilities: string[], requiredCapabilities: string[]): number;
72
+ /**
73
+ * Get agents that match the given capabilities, sorted by match score.
74
+ */
75
+ export declare function getCapableAgents(capabilities: string[], opts?: {
76
+ min_score?: number;
77
+ limit?: number;
78
+ }, db?: Database): {
79
+ agent: Agent;
80
+ score: number;
81
+ }[];
82
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/db/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { TaskHistory } from "../types/index.js";
3
+ export declare function logTaskChange(taskId: string, action: string, field?: string, oldValue?: string | null, newValue?: string | null, agentId?: string | null, db?: Database): TaskHistory;
4
+ export declare function getTaskHistory(taskId: string, db?: Database): TaskHistory[];
5
+ export declare function getRecentActivity(limit?: number, db?: Database): TaskHistory[];
6
+ export interface RecapSummary {
7
+ hours: number;
8
+ since: string;
9
+ completed: {
10
+ id: string;
11
+ short_id: string | null;
12
+ title: string;
13
+ assigned_to: string | null;
14
+ completed_at: string | null;
15
+ duration_minutes: number | null;
16
+ }[];
17
+ created: {
18
+ id: string;
19
+ short_id: string | null;
20
+ title: string;
21
+ agent_id: string | null;
22
+ created_at: string;
23
+ }[];
24
+ in_progress: {
25
+ id: string;
26
+ short_id: string | null;
27
+ title: string;
28
+ assigned_to: string | null;
29
+ started_at: string | null;
30
+ }[];
31
+ blocked: {
32
+ id: string;
33
+ short_id: string | null;
34
+ title: string;
35
+ assigned_to: string | null;
36
+ }[];
37
+ stale: {
38
+ id: string;
39
+ short_id: string | null;
40
+ title: string;
41
+ assigned_to: string | null;
42
+ updated_at: string;
43
+ }[];
44
+ agents: {
45
+ name: string;
46
+ completed_count: number;
47
+ in_progress_count: number;
48
+ last_seen_at: string;
49
+ }[];
50
+ }
51
+ export declare function getRecap(hours?: number, projectId?: string, db?: Database): RecapSummary;
52
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/db/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EACvB,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,CAUb;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,EAAE,CAG3E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,SAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,EAAE,CAG1E;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;IAC9J,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/G,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;IAC7H,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;IAC9F,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChH,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtG;AAED,wBAAgB,QAAQ,CAAC,KAAK,SAAI,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,YAAY,CAoDnF"}
@@ -0,0 +1,27 @@
1
+ import type { Database } from "bun:sqlite";
2
+ export interface AgentBudget {
3
+ agent_id: string;
4
+ max_concurrent: number;
5
+ max_cost_usd: number | null;
6
+ max_task_minutes: number | null;
7
+ period_hours: number;
8
+ created_at: string;
9
+ updated_at: string;
10
+ }
11
+ export interface BudgetCheck {
12
+ allowed: boolean;
13
+ reason?: string;
14
+ current_concurrent: number;
15
+ max_concurrent: number;
16
+ current_cost_usd?: number;
17
+ max_cost_usd?: number;
18
+ }
19
+ export declare function setBudget(agentId: string, opts: {
20
+ max_concurrent?: number;
21
+ max_cost_usd?: number | null;
22
+ max_task_minutes?: number | null;
23
+ period_hours?: number;
24
+ }, db?: Database): AgentBudget;
25
+ export declare function getBudget(agentId: string, db?: Database): AgentBudget | null;
26
+ export declare function checkBudget(agentId: string, db?: Database): BudgetCheck;
27
+ //# sourceMappingURL=budgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/db/budgets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EACxH,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,CAgBb;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI,CAG5E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,CAuBvE"}
@@ -0,0 +1,22 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { TemplateVariable, TemplateTaskInput } from "../types/index.js";
3
+ export interface BuiltinTemplate {
4
+ name: string;
5
+ description: string;
6
+ variables: TemplateVariable[];
7
+ tasks: (TemplateTaskInput & {
8
+ position: number;
9
+ depends_on_positions?: number[];
10
+ })[];
11
+ }
12
+ export declare const BUILTIN_TEMPLATES: BuiltinTemplate[];
13
+ /**
14
+ * Initialize built-in templates. Skips any template whose name already exists.
15
+ * Returns the count of templates created.
16
+ */
17
+ export declare function initBuiltinTemplates(db?: Database): {
18
+ created: number;
19
+ skipped: number;
20
+ names: string[];
21
+ };
22
+ //# sourceMappingURL=builtin-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-templates.d.ts","sourceRoot":"","sources":["../../src/db/builtin-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI7E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,EAAE,CAAC,iBAAiB,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,EAAE,CAAC;CACtF;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAkE9C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAuCzG"}
@@ -0,0 +1,13 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { ChecklistItem, CreateChecklistItemInput } from "../types/index.js";
3
+ export declare function getChecklist(taskId: string, db?: Database): ChecklistItem[];
4
+ export declare function addChecklistItem(input: CreateChecklistItemInput, db?: Database): ChecklistItem;
5
+ export declare function checkChecklistItem(id: string, checked: boolean, db?: Database): ChecklistItem | null;
6
+ export declare function updateChecklistItemText(id: string, text: string, db?: Database): ChecklistItem | null;
7
+ export declare function removeChecklistItem(id: string, db?: Database): boolean;
8
+ export declare function clearChecklist(taskId: string, db?: Database): number;
9
+ export declare function getChecklistStats(taskId: string, db?: Database): {
10
+ total: number;
11
+ checked: number;
12
+ };
13
+ //# sourceMappingURL=checklists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checklists.d.ts","sourceRoot":"","sources":["../../src/db/checklists.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAoB,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAOnG,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,aAAa,EAAE,CAM3E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,aAAa,CAoB9F;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,CASpG;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,CASrG;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAItE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAIpE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAMnG"}
@@ -0,0 +1,8 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { CreateCommentInput, TaskComment } from "../types/index.js";
3
+ export declare function addComment(input: CreateCommentInput, db?: Database): TaskComment;
4
+ export declare function logProgress(taskId: string, message: string, pct?: number, agentId?: string, db?: Database): TaskComment;
5
+ export declare function getComment(id: string, db?: Database): TaskComment | null;
6
+ export declare function listComments(taskId: string, db?: Database): TaskComment[];
7
+ export declare function deleteComment(id: string, db?: Database): boolean;
8
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/db/comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKzE,wBAAgB,UAAU,CACxB,KAAK,EAAE,kBAAkB,EACzB,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,CA2Bb;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,CAEb;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI,CAKxE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,EAAE,CAOzE;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAIhE"}
@@ -0,0 +1,12 @@
1
+ import { Database } from "bun:sqlite";
2
+ export declare const LOCK_EXPIRY_MINUTES = 30;
3
+ export declare function getDatabase(dbPath?: string): Database;
4
+ export declare function closeDatabase(): void;
5
+ export declare function resetDatabase(): void;
6
+ export declare function now(): string;
7
+ export declare function uuid(): string;
8
+ export declare function isLockExpired(lockedAt: string | null): boolean;
9
+ export declare function lockExpiryCutoff(nowMs?: number): string;
10
+ export declare function clearExpiredLocks(db: Database): void;
11
+ export declare function resolvePartialId(db: Database, table: string, partialId: string): string | null;
12
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKtC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA0EtC,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAkBrD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAK9D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAa,GAAG,MAAM,CAG3D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGpD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsC9F"}
@@ -0,0 +1,15 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { CreateDispatchInput, Dispatch, DispatchLog, DispatchStatus, ListDispatchesFilter } from "../types/index.ts";
3
+ export declare function createDispatch(input: CreateDispatchInput, db?: Database): Dispatch;
4
+ export declare function getDispatch(id: string, db?: Database): Dispatch;
5
+ export declare function listDispatches(filter?: ListDispatchesFilter, db?: Database): Dispatch[];
6
+ export declare function cancelDispatch(id: string, db?: Database): Dispatch;
7
+ export declare function updateDispatchStatus(id: string, status: DispatchStatus, opts?: {
8
+ error?: string;
9
+ sent_at?: string;
10
+ }, db?: Database): void;
11
+ export declare function createDispatchLog(log: Omit<DispatchLog, "id" | "created_at">, db?: Database): DispatchLog;
12
+ export declare function listDispatchLogs(dispatchId: string, db?: Database): DispatchLog[];
13
+ /** Return all dispatches that are ready to fire (pending + due). */
14
+ export declare function getDueDispatches(db?: Database): Dispatch[];
15
+ //# sourceMappingURL=dispatches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatches.d.ts","sourceRoot":"","sources":["../../src/db/dispatches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EACV,mBAAmB,EACnB,QAAQ,EACR,WAAW,EAEX,cAAc,EACd,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAiB3B,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAwBlF;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAK/D;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,oBAAyB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAoB3F;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAYlE;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,EAC/C,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAMN;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,YAAY,CAAC,EAC3C,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,CAYb;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,EAAE,CAKjF;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAW1D"}
@@ -0,0 +1,43 @@
1
+ import type { Database } from "bun:sqlite";
2
+ export declare const FILE_LOCK_DEFAULT_TTL_SECONDS: number;
3
+ export interface FileLock {
4
+ id: string;
5
+ path: string;
6
+ agent_id: string;
7
+ task_id: string | null;
8
+ expires_at: string;
9
+ created_at: string;
10
+ }
11
+ export interface LockFileInput {
12
+ path: string;
13
+ agent_id: string;
14
+ task_id?: string;
15
+ /** TTL in seconds (default: 1800 = 30 min) */
16
+ ttl_seconds?: number;
17
+ }
18
+ /** Clean up expired locks. Called automatically on read operations. */
19
+ export declare function cleanExpiredFileLocks(db?: Database): number;
20
+ /**
21
+ * Acquire an exclusive lock on a file path.
22
+ * - If no lock exists (or existing lock is expired), lock is granted.
23
+ * - If same agent already holds the lock, the TTL is refreshed.
24
+ * - If another agent holds an active lock, throws LockError.
25
+ */
26
+ export declare function lockFile(input: LockFileInput, db?: Database): FileLock;
27
+ /**
28
+ * Release a file lock. Only the lock holder can release it.
29
+ * Returns true if released, false if not found or wrong agent.
30
+ */
31
+ export declare function unlockFile(path: string, agentId: string, db?: Database): boolean;
32
+ /**
33
+ * Check who holds a lock on a file path.
34
+ * Returns null if unlocked or expired.
35
+ */
36
+ export declare function checkFileLock(path: string, db?: Database): FileLock | null;
37
+ /**
38
+ * List all active (non-expired) file locks, optionally filtered by agent.
39
+ */
40
+ export declare function listFileLocks(agentId?: string, db?: Database): FileLock[];
41
+ /** Force-release a lock regardless of which agent holds it (admin operation). */
42
+ export declare function forceUnlockFile(path: string, db?: Database): boolean;
43
+ //# sourceMappingURL=file-locks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-locks.d.ts","sourceRoot":"","sources":["../../src/db/file-locks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,eAAO,MAAM,6BAA6B,QAAU,CAAC;AAErD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAI3D;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CA8BtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAQhF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAI1E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAOzE;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAIpE"}
@@ -0,0 +1,25 @@
1
+ import type { Database } from "bun:sqlite";
2
+ export interface Handoff {
3
+ id: string;
4
+ agent_id: string | null;
5
+ project_id: string | null;
6
+ summary: string;
7
+ completed: string[] | null;
8
+ in_progress: string[] | null;
9
+ blockers: string[] | null;
10
+ next_steps: string[] | null;
11
+ created_at: string;
12
+ }
13
+ export interface CreateHandoffInput {
14
+ agent_id?: string;
15
+ project_id?: string;
16
+ summary: string;
17
+ completed?: string[];
18
+ in_progress?: string[];
19
+ blockers?: string[];
20
+ next_steps?: string[];
21
+ }
22
+ export declare function createHandoff(input: CreateHandoffInput, db?: Database): Handoff;
23
+ export declare function listHandoffs(projectId?: string, limit?: number, db?: Database): Handoff[];
24
+ export declare function getLatestHandoff(agentId?: string, projectId?: string, db?: Database): Handoff | null;
25
+ //# sourceMappingURL=handoffs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoffs.d.ts","sourceRoot":"","sources":["../../src/db/handoffs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CA0B/E;AAYD,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAMrF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CASpG"}
@@ -0,0 +1,70 @@
1
+ import type { Database } from "bun:sqlite";
2
+ export interface KgEdge {
3
+ id: string;
4
+ source_id: string;
5
+ source_type: string;
6
+ target_id: string;
7
+ target_type: string;
8
+ relation_type: string;
9
+ weight: number;
10
+ metadata: Record<string, unknown>;
11
+ created_at: string;
12
+ }
13
+ /**
14
+ * Sync all existing relationships into kg_edges.
15
+ * Idempotent — uses INSERT OR IGNORE with composite unique constraint.
16
+ */
17
+ export declare function syncKgEdges(db?: Database): {
18
+ synced: number;
19
+ };
20
+ /**
21
+ * Get all entities related to a given entity.
22
+ */
23
+ export declare function getRelated(entityId: string, opts?: {
24
+ relation_type?: string;
25
+ entity_type?: string;
26
+ direction?: "outgoing" | "incoming" | "both";
27
+ limit?: number;
28
+ }, db?: Database): KgEdge[];
29
+ /**
30
+ * Find path between two entities using recursive CTE (BFS).
31
+ * Returns the edges forming the shortest path, or empty if no path exists.
32
+ */
33
+ export declare function findPath(sourceId: string, targetId: string, opts?: {
34
+ max_depth?: number;
35
+ relation_types?: string[];
36
+ }, db?: Database): KgEdge[][];
37
+ /**
38
+ * Get impact analysis: what entities are affected if a given entity changes.
39
+ * Traverses outgoing edges recursively.
40
+ */
41
+ export declare function getImpactAnalysis(entityId: string, opts?: {
42
+ max_depth?: number;
43
+ relation_types?: string[];
44
+ }, db?: Database): {
45
+ entity_id: string;
46
+ entity_type: string;
47
+ depth: number;
48
+ relation: string;
49
+ }[];
50
+ /**
51
+ * Get critical path: tasks that block the most downstream work.
52
+ * Returns tasks sorted by how many other tasks they transitively block.
53
+ */
54
+ export declare function getCriticalPath(opts?: {
55
+ project_id?: string;
56
+ limit?: number;
57
+ }, db?: Database): {
58
+ task_id: string;
59
+ blocking_count: number;
60
+ depth: number;
61
+ }[];
62
+ /**
63
+ * Add a single edge to the knowledge graph.
64
+ */
65
+ export declare function addKgEdge(sourceId: string, sourceType: string, targetId: string, targetType: string, relationType: string, weight?: number, metadata?: Record<string, unknown>, db?: Database): KgEdge;
66
+ /**
67
+ * Remove edges matching criteria.
68
+ */
69
+ export declare function removeKgEdges(sourceId: string, targetId: string, relationType?: string, db?: Database): number;
70
+ //# sourceMappingURL=kg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kg.d.ts","sourceRoot":"","sources":["../../src/db/kg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAqBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAoE7D;AAqBD;;GAEG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACrH,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,EAAE,CAgCV;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EACxD,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,EAAE,EAAE,CA4CZ;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EACxD,EAAE,CAAC,EAAE,QAAQ,GACZ;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAuC/E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,EAAE,CAAC,EAAE,QAAQ,GACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CA2D9D;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EACpC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EACpC,YAAY,EAAE,MAAM,EACpB,MAAM,SAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,EACrB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAYR"}
@@ -0,0 +1,14 @@
1
+ import type { Database } from "bun:sqlite";
2
+ export interface ResourceLock {
3
+ resource_type: string;
4
+ resource_id: string;
5
+ agent_id: string;
6
+ lock_type: string;
7
+ locked_at: string;
8
+ expires_at: string;
9
+ }
10
+ export declare function acquireLock(resourceType: string, resourceId: string, agentId: string, lockType?: "advisory" | "exclusive", expiryMs?: number, db?: Database): boolean;
11
+ export declare function releaseLock(resourceType: string, resourceId: string, agentId: string, db?: Database): boolean;
12
+ export declare function checkLock(resourceType: string, resourceId: string, db?: Database): ResourceLock | null;
13
+ export declare function cleanExpiredLocks(db?: Database): number;
14
+ //# sourceMappingURL=locks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../src/db/locks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,UAAU,GAAG,WAAwB,EAC/C,QAAQ,GAAE,MAAsB,EAChC,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CA+BT;AAED,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAOT;AAED,wBAAgB,SAAS,CACvB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,GAAG,IAAI,CAMrB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAOvD"}
@@ -0,0 +1,13 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { Org, CreateOrgInput } from "../types/index.js";
3
+ export declare function createOrg(input: CreateOrgInput, db?: Database): Org;
4
+ export declare function getOrg(id: string, db?: Database): Org | null;
5
+ export declare function getOrgByName(name: string, db?: Database): Org | null;
6
+ export declare function listOrgs(db?: Database): Org[];
7
+ export declare function updateOrg(id: string, input: {
8
+ name?: string;
9
+ description?: string;
10
+ metadata?: Record<string, unknown>;
11
+ }, db?: Database): Org;
12
+ export declare function deleteOrg(id: string, db?: Database): boolean;
13
+ //# sourceMappingURL=orgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../src/db/orgs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAO7D,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CASnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,GAAG,IAAI,CAI5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,GAAG,IAAI,CAIpE;AAED,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,EAAE,CAG7C;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,GAAG,CAY5I;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAG5D"}
@@ -0,0 +1,35 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { Task } from "../types/index.js";
3
+ export interface PatrolIssue {
4
+ type: "stuck" | "low_confidence" | "orphaned" | "needs_review" | "zombie_blocked";
5
+ task_id: string;
6
+ task_title: string;
7
+ severity: "low" | "medium" | "high" | "critical";
8
+ detail: string;
9
+ }
10
+ export interface PatrolResult {
11
+ issues: PatrolIssue[];
12
+ total_issues: number;
13
+ scanned_at: string;
14
+ }
15
+ /**
16
+ * Patrol tasks for issues:
17
+ * - stuck: in_progress for longer than threshold
18
+ * - low_confidence: completed with confidence below threshold
19
+ * - orphaned: no project, no agent, not completed
20
+ * - needs_review: requires_approval but not approved, and completed
21
+ * - zombie_blocked: pending tasks whose blockers are all failed/cancelled
22
+ */
23
+ export declare function patrolTasks(opts?: {
24
+ stuck_minutes?: number;
25
+ confidence_threshold?: number;
26
+ project_id?: string;
27
+ }, db?: Database): PatrolResult;
28
+ /**
29
+ * Get review queue: tasks that need human/agent review.
30
+ */
31
+ export declare function getReviewQueue(opts?: {
32
+ project_id?: string;
33
+ limit?: number;
34
+ }, db?: Database): Task[];
35
+ //# sourceMappingURL=patrol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patrol.d.ts","sourceRoot":"","sources":["../../src/db/patrol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,mBAAmB,CAAC;AAevD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,IAAI,CAAC,EAAE;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,EACD,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,CAkHd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,EAAE,CAkBR"}
@@ -0,0 +1,14 @@
1
+ export interface PgMigrationResult {
2
+ applied: number[];
3
+ alreadyApplied: number[];
4
+ errors: string[];
5
+ totalMigrations: number;
6
+ }
7
+ /**
8
+ * Apply all pending PostgreSQL migrations to the given database.
9
+ *
10
+ * @param connectionString - PostgreSQL connection string
11
+ * @returns Summary of which migrations were applied / skipped / errored.
12
+ */
13
+ export declare function applyPgMigrations(connectionString: string): Promise<PgMigrationResult>;
14
+ //# sourceMappingURL=pg-migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-migrate.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrate.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAuD5B"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * PostgreSQL migrations for open-todos cloud sync.
3
+ *
4
+ * Equivalent of the SQLite migrations in database.ts, translated for PostgreSQL.
5
+ * Each element is a standalone SQL string that must be executed in order.
6
+ */
7
+ export declare const PG_MIGRATIONS: string[];
8
+ //# sourceMappingURL=pg-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-migrations.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,EAmmBjC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { CreatePlanInput, Plan, UpdatePlanInput } from "../types/index.js";
3
+ export declare function createPlan(input: CreatePlanInput, db?: Database): Plan;
4
+ export declare function getPlan(id: string, db?: Database): Plan | null;
5
+ export declare function listPlans(projectId?: string, db?: Database): Plan[];
6
+ export declare function updatePlan(id: string, input: UpdatePlanInput, db?: Database): Plan;
7
+ export declare function deletePlan(id: string, db?: Database): boolean;
8
+ //# sourceMappingURL=plans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/db/plans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIhF,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAsBtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAI9D;AAED,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAUnE;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAiCN;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAI7D"}