@jacques-ai/core 0.0.7-alpha.1
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/archive/archive-store.d.ts +166 -0
- package/dist/archive/archive-store.d.ts.map +1 -0
- package/dist/archive/archive-store.js +612 -0
- package/dist/archive/archive-store.js.map +1 -0
- package/dist/archive/bulk-archive.d.ts +63 -0
- package/dist/archive/bulk-archive.d.ts.map +1 -0
- package/dist/archive/bulk-archive.js +315 -0
- package/dist/archive/bulk-archive.js.map +1 -0
- package/dist/archive/filename-utils.d.ts +39 -0
- package/dist/archive/filename-utils.d.ts.map +1 -0
- package/dist/archive/filename-utils.js +78 -0
- package/dist/archive/filename-utils.js.map +1 -0
- package/dist/archive/index.d.ts +21 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +45 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/manifest-extractor.d.ts +40 -0
- package/dist/archive/manifest-extractor.d.ts.map +1 -0
- package/dist/archive/manifest-extractor.js +456 -0
- package/dist/archive/manifest-extractor.js.map +1 -0
- package/dist/archive/migration.d.ts +59 -0
- package/dist/archive/migration.d.ts.map +1 -0
- package/dist/archive/migration.js +172 -0
- package/dist/archive/migration.js.map +1 -0
- package/dist/archive/plan-cataloger.d.ts +24 -0
- package/dist/archive/plan-cataloger.d.ts.map +1 -0
- package/dist/archive/plan-cataloger.js +100 -0
- package/dist/archive/plan-cataloger.js.map +1 -0
- package/dist/archive/plan-extractor.d.ts +84 -0
- package/dist/archive/plan-extractor.d.ts.map +1 -0
- package/dist/archive/plan-extractor.js +371 -0
- package/dist/archive/plan-extractor.js.map +1 -0
- package/dist/archive/search-indexer.d.ts +50 -0
- package/dist/archive/search-indexer.d.ts.map +1 -0
- package/dist/archive/search-indexer.js +294 -0
- package/dist/archive/search-indexer.js.map +1 -0
- package/dist/archive/subagent-store.d.ts +113 -0
- package/dist/archive/subagent-store.d.ts.map +1 -0
- package/dist/archive/subagent-store.js +173 -0
- package/dist/archive/subagent-store.js.map +1 -0
- package/dist/archive/types.d.ts +236 -0
- package/dist/archive/types.d.ts.map +1 -0
- package/dist/archive/types.js +30 -0
- package/dist/archive/types.js.map +1 -0
- package/dist/branding.d.ts +9 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +50 -0
- package/dist/branding.js.map +1 -0
- package/dist/cache/git-utils.d.ts +36 -0
- package/dist/cache/git-utils.d.ts.map +1 -0
- package/dist/cache/git-utils.js +160 -0
- package/dist/cache/git-utils.js.map +1 -0
- package/dist/cache/hidden-projects.d.ts +19 -0
- package/dist/cache/hidden-projects.d.ts.map +1 -0
- package/dist/cache/hidden-projects.js +48 -0
- package/dist/cache/hidden-projects.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +20 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/metadata-extractor.d.ts +62 -0
- package/dist/cache/metadata-extractor.d.ts.map +1 -0
- package/dist/cache/metadata-extractor.js +574 -0
- package/dist/cache/metadata-extractor.js.map +1 -0
- package/dist/cache/mode-detector.d.ts +19 -0
- package/dist/cache/mode-detector.d.ts.map +1 -0
- package/dist/cache/mode-detector.js +161 -0
- package/dist/cache/mode-detector.js.map +1 -0
- package/dist/cache/persistence.d.ts +39 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +98 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/project-discovery.d.ts +41 -0
- package/dist/cache/project-discovery.d.ts.map +1 -0
- package/dist/cache/project-discovery.js +212 -0
- package/dist/cache/project-discovery.js.map +1 -0
- package/dist/cache/session-index.d.ts +258 -0
- package/dist/cache/session-index.d.ts.map +1 -0
- package/dist/cache/session-index.js +1030 -0
- package/dist/cache/session-index.js.map +1 -0
- package/dist/cache/types.d.ts +159 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +29 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/catalog/bulk-extractor.d.ts +18 -0
- package/dist/catalog/bulk-extractor.d.ts.map +1 -0
- package/dist/catalog/bulk-extractor.js +150 -0
- package/dist/catalog/bulk-extractor.js.map +1 -0
- package/dist/catalog/extractor.d.ts +53 -0
- package/dist/catalog/extractor.d.ts.map +1 -0
- package/dist/catalog/extractor.js +522 -0
- package/dist/catalog/extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +10 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +11 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/types.d.ts +134 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +8 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/websocket-client.d.ts +96 -0
- package/dist/client/websocket-client.d.ts.map +1 -0
- package/dist/client/websocket-client.js +222 -0
- package/dist/client/websocket-client.js.map +1 -0
- package/dist/context/index.d.ts +13 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +26 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/indexer.d.ts +73 -0
- package/dist/context/indexer.d.ts.map +1 -0
- package/dist/context/indexer.js +233 -0
- package/dist/context/indexer.js.map +1 -0
- package/dist/context/manager.d.ts +66 -0
- package/dist/context/manager.d.ts.map +1 -0
- package/dist/context/manager.js +310 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/context/types.d.ts +149 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +36 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handoff/catalog.d.ts +54 -0
- package/dist/handoff/catalog.d.ts.map +1 -0
- package/dist/handoff/catalog.js +121 -0
- package/dist/handoff/catalog.js.map +1 -0
- package/dist/handoff/generator.d.ts +107 -0
- package/dist/handoff/generator.d.ts.map +1 -0
- package/dist/handoff/generator.js +603 -0
- package/dist/handoff/generator.js.map +1 -0
- package/dist/handoff/index.d.ts +13 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +12 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/llm-generator.d.ts +77 -0
- package/dist/handoff/llm-generator.d.ts.map +1 -0
- package/dist/handoff/llm-generator.js +513 -0
- package/dist/handoff/llm-generator.js.map +1 -0
- package/dist/handoff/prompts.d.ts +18 -0
- package/dist/handoff/prompts.d.ts.map +1 -0
- package/dist/handoff/prompts.js +22 -0
- package/dist/handoff/prompts.js.map +1 -0
- package/dist/handoff/types.d.ts +28 -0
- package/dist/handoff/types.d.ts.map +1 -0
- package/dist/handoff/types.js +7 -0
- package/dist/handoff/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/claude-operations.d.ts +111 -0
- package/dist/logging/claude-operations.d.ts.map +1 -0
- package/dist/logging/claude-operations.js +132 -0
- package/dist/logging/claude-operations.js.map +1 -0
- package/dist/logging/error-utils.d.ts +18 -0
- package/dist/logging/error-utils.d.ts.map +1 -0
- package/dist/logging/error-utils.js +37 -0
- package/dist/logging/error-utils.js.map +1 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +10 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +25 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +39 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/notifications/constants.d.ts +16 -0
- package/dist/notifications/constants.d.ts.map +1 -0
- package/dist/notifications/constants.js +49 -0
- package/dist/notifications/constants.js.map +1 -0
- package/dist/notifications/index.d.ts +9 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/types.d.ts +28 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +7 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/utils.d.ts +20 -0
- package/dist/notifications/utils.d.ts.map +1 -0
- package/dist/notifications/utils.js +37 -0
- package/dist/notifications/utils.js.map +1 -0
- package/dist/plan/index.d.ts +12 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +15 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/plan-parser.d.ts +33 -0
- package/dist/plan/plan-parser.d.ts.map +1 -0
- package/dist/plan/plan-parser.js +189 -0
- package/dist/plan/plan-parser.js.map +1 -0
- package/dist/plan/progress-computer.d.ts +34 -0
- package/dist/plan/progress-computer.d.ts.map +1 -0
- package/dist/plan/progress-computer.js +211 -0
- package/dist/plan/progress-computer.js.map +1 -0
- package/dist/plan/progress-matcher.d.ts +34 -0
- package/dist/plan/progress-matcher.d.ts.map +1 -0
- package/dist/plan/progress-matcher.js +297 -0
- package/dist/plan/progress-matcher.js.map +1 -0
- package/dist/plan/task-extractor.d.ts +30 -0
- package/dist/plan/task-extractor.d.ts.map +1 -0
- package/dist/plan/task-extractor.js +435 -0
- package/dist/plan/task-extractor.js.map +1 -0
- package/dist/plan/types.d.ts +131 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +8 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/project/aggregator.d.ts +43 -0
- package/dist/project/aggregator.d.ts.map +1 -0
- package/dist/project/aggregator.js +218 -0
- package/dist/project/aggregator.js.map +1 -0
- package/dist/project/index.d.ts +9 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/types.d.ts +65 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +27 -0
- package/dist/project/types.js.map +1 -0
- package/dist/session/detector.d.ts +113 -0
- package/dist/session/detector.d.ts.map +1 -0
- package/dist/session/detector.js +333 -0
- package/dist/session/detector.js.map +1 -0
- package/dist/session/filters.d.ts +32 -0
- package/dist/session/filters.d.ts.map +1 -0
- package/dist/session/filters.js +100 -0
- package/dist/session/filters.js.map +1 -0
- package/dist/session/format-title.d.ts +16 -0
- package/dist/session/format-title.d.ts.map +1 -0
- package/dist/session/format-title.js +54 -0
- package/dist/session/format-title.js.map +1 -0
- package/dist/session/index.d.ts +16 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +10 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/parser.d.ts +264 -0
- package/dist/session/parser.d.ts.map +1 -0
- package/dist/session/parser.js +588 -0
- package/dist/session/parser.js.map +1 -0
- package/dist/session/token-estimator.d.ts +32 -0
- package/dist/session/token-estimator.d.ts.map +1 -0
- package/dist/session/token-estimator.js +139 -0
- package/dist/session/token-estimator.js.map +1 -0
- package/dist/session/transformer.d.ts +126 -0
- package/dist/session/transformer.d.ts.map +1 -0
- package/dist/session/transformer.js +158 -0
- package/dist/session/transformer.js.map +1 -0
- package/dist/setup/hooks-config.d.ts +35 -0
- package/dist/setup/hooks-config.d.ts.map +1 -0
- package/dist/setup/hooks-config.js +107 -0
- package/dist/setup/hooks-config.js.map +1 -0
- package/dist/setup/hooks-symlink.d.ts +17 -0
- package/dist/setup/hooks-symlink.d.ts.map +1 -0
- package/dist/setup/hooks-symlink.js +89 -0
- package/dist/setup/hooks-symlink.js.map +1 -0
- package/dist/setup/index.d.ts +13 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +12 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/prerequisites.d.ts +11 -0
- package/dist/setup/prerequisites.d.ts.map +1 -0
- package/dist/setup/prerequisites.js +72 -0
- package/dist/setup/prerequisites.js.map +1 -0
- package/dist/setup/settings-merge.d.ts +33 -0
- package/dist/setup/settings-merge.d.ts.map +1 -0
- package/dist/setup/settings-merge.js +131 -0
- package/dist/setup/settings-merge.js.map +1 -0
- package/dist/setup/skills-install.d.ts +17 -0
- package/dist/setup/skills-install.d.ts.map +1 -0
- package/dist/setup/skills-install.js +60 -0
- package/dist/setup/skills-install.js.map +1 -0
- package/dist/setup/types.d.ts +39 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +7 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/setup/verification.d.ts +9 -0
- package/dist/setup/verification.d.ts.map +1 -0
- package/dist/setup/verification.js +91 -0
- package/dist/setup/verification.js.map +1 -0
- package/dist/shortcuts/index.d.ts +8 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +6 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/key-utils.d.ts +54 -0
- package/dist/shortcuts/key-utils.d.ts.map +1 -0
- package/dist/shortcuts/key-utils.js +129 -0
- package/dist/shortcuts/key-utils.js.map +1 -0
- package/dist/shortcuts/shortcut-registry.d.ts +37 -0
- package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
- package/dist/shortcuts/shortcut-registry.js +322 -0
- package/dist/shortcuts/shortcut-registry.js.map +1 -0
- package/dist/sources/config.d.ts +91 -0
- package/dist/sources/config.d.ts.map +1 -0
- package/dist/sources/config.js +229 -0
- package/dist/sources/config.js.map +1 -0
- package/dist/sources/googledocs.d.ts +43 -0
- package/dist/sources/googledocs.d.ts.map +1 -0
- package/dist/sources/googledocs.js +298 -0
- package/dist/sources/googledocs.js.map +1 -0
- package/dist/sources/index.d.ts +14 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +19 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/notion.d.ts +35 -0
- package/dist/sources/notion.d.ts.map +1 -0
- package/dist/sources/notion.js +352 -0
- package/dist/sources/notion.js.map +1 -0
- package/dist/sources/obsidian.d.ts +38 -0
- package/dist/sources/obsidian.d.ts.map +1 -0
- package/dist/sources/obsidian.js +228 -0
- package/dist/sources/obsidian.js.map +1 -0
- package/dist/sources/types.d.ts +133 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +19 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/writer.d.ts +86 -0
- package/dist/storage/writer.d.ts.map +1 -0
- package/dist/storage/writer.js +137 -0
- package/dist/storage/writer.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/claude-token.d.ts +49 -0
- package/dist/utils/claude-token.d.ts.map +1 -0
- package/dist/utils/claude-token.js +169 -0
- package/dist/utils/claude-token.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/settings.d.ts +100 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +206 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts task signals from parsed JSONL entries.
|
|
5
|
+
* Handles:
|
|
6
|
+
* - TaskCreate, TaskUpdate, TaskList tool calls
|
|
7
|
+
* - TodoWrite tool calls (legacy)
|
|
8
|
+
* - agent_progress entries (subagent work)
|
|
9
|
+
* - bash_progress entries (command execution)
|
|
10
|
+
* - File heuristics (fallback)
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Extract task signals from parsed JSONL entries.
|
|
14
|
+
*
|
|
15
|
+
* Handles multiple signal sources:
|
|
16
|
+
* 1. TaskCreate/TaskUpdate (current) - Build task state map, emit final states
|
|
17
|
+
* 2. TaskList (current) - Parse task list snapshots for state
|
|
18
|
+
* 3. TodoWrite (legacy) - Extract todos[] array
|
|
19
|
+
* 4. agent_progress - Subagent completion signals
|
|
20
|
+
* 5. bash_progress - Command execution with test/build keywords
|
|
21
|
+
* 6. File heuristic (fallback) - Write/Edit file paths as completed signals
|
|
22
|
+
*/
|
|
23
|
+
export function extractTaskSignals(entries, sessionId) {
|
|
24
|
+
const signals = [];
|
|
25
|
+
// Track TaskCreate/TaskUpdate state
|
|
26
|
+
const taskStates = new Map();
|
|
27
|
+
let hasTaskToolCalls = false;
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
// Handle agent_progress entries
|
|
30
|
+
if (entry.type === "agent_progress") {
|
|
31
|
+
const agentSignal = extractAgentProgressSignal(entry, sessionId);
|
|
32
|
+
if (agentSignal) {
|
|
33
|
+
signals.push(agentSignal);
|
|
34
|
+
}
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// Handle bash_progress entries (test runs, builds)
|
|
38
|
+
if (entry.type === "bash_progress") {
|
|
39
|
+
const bashSignal = extractBashProgressSignal(entry, sessionId);
|
|
40
|
+
if (bashSignal) {
|
|
41
|
+
signals.push(bashSignal);
|
|
42
|
+
}
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Only process tool_call entries from here
|
|
46
|
+
if (entry.type !== "tool_call") {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const toolName = entry.content.toolName;
|
|
50
|
+
const toolInput = entry.content.toolInput;
|
|
51
|
+
if (!toolName) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// Handle TaskCreate
|
|
55
|
+
if (toolName === "TaskCreate" && toolInput) {
|
|
56
|
+
hasTaskToolCalls = true;
|
|
57
|
+
const taskId = extractTaskIdFromResponse(entry, entries);
|
|
58
|
+
const subject = toolInput.subject || "";
|
|
59
|
+
const description = toolInput.description;
|
|
60
|
+
if (taskId && subject) {
|
|
61
|
+
taskStates.set(taskId, {
|
|
62
|
+
id: taskId,
|
|
63
|
+
subject,
|
|
64
|
+
description,
|
|
65
|
+
status: "pending",
|
|
66
|
+
timestamp: entry.timestamp,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Handle TaskUpdate
|
|
71
|
+
if (toolName === "TaskUpdate" && toolInput) {
|
|
72
|
+
hasTaskToolCalls = true;
|
|
73
|
+
const taskId = toolInput.taskId;
|
|
74
|
+
const status = toolInput.status;
|
|
75
|
+
const subject = toolInput.subject;
|
|
76
|
+
if (taskId) {
|
|
77
|
+
const existing = taskStates.get(taskId);
|
|
78
|
+
const newStatus = mapTaskStatus(status);
|
|
79
|
+
if (existing) {
|
|
80
|
+
taskStates.set(taskId, {
|
|
81
|
+
...existing,
|
|
82
|
+
subject: subject || existing.subject,
|
|
83
|
+
status: newStatus && newStatus !== "unknown" ? newStatus : existing.status,
|
|
84
|
+
timestamp: entry.timestamp,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// TaskUpdate without prior TaskCreate (possible if task was created in another session)
|
|
89
|
+
taskStates.set(taskId, {
|
|
90
|
+
id: taskId,
|
|
91
|
+
subject: subject || `Task ${taskId}`,
|
|
92
|
+
status: newStatus && newStatus !== "unknown" ? newStatus : "pending",
|
|
93
|
+
timestamp: entry.timestamp,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Handle TaskList - parse result for task state snapshot
|
|
99
|
+
if (toolName === "TaskList") {
|
|
100
|
+
hasTaskToolCalls = true;
|
|
101
|
+
const taskListSignals = extractTaskListSignals(entry, entries, sessionId);
|
|
102
|
+
signals.push(...taskListSignals);
|
|
103
|
+
}
|
|
104
|
+
// Handle TodoWrite (legacy)
|
|
105
|
+
if (toolName === "TodoWrite" && toolInput) {
|
|
106
|
+
hasTaskToolCalls = true;
|
|
107
|
+
const todos = toolInput.todos;
|
|
108
|
+
if (todos && Array.isArray(todos)) {
|
|
109
|
+
for (const todo of todos) {
|
|
110
|
+
const content = todo.content || "";
|
|
111
|
+
const status = mapTaskStatus(todo.status);
|
|
112
|
+
if (content) {
|
|
113
|
+
signals.push({
|
|
114
|
+
source: "todo_write",
|
|
115
|
+
text: content,
|
|
116
|
+
status: status || "pending",
|
|
117
|
+
timestamp: entry.timestamp,
|
|
118
|
+
taskId: todo.id,
|
|
119
|
+
sessionId,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Convert TaskCreate/TaskUpdate states to signals
|
|
127
|
+
for (const state of taskStates.values()) {
|
|
128
|
+
signals.push({
|
|
129
|
+
source: state.status === "pending" ? "task_create" : "task_update",
|
|
130
|
+
text: state.subject,
|
|
131
|
+
status: state.status,
|
|
132
|
+
timestamp: state.timestamp,
|
|
133
|
+
taskId: state.id,
|
|
134
|
+
sessionId,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// File heuristics: Only if no task tool calls were found
|
|
138
|
+
if (!hasTaskToolCalls) {
|
|
139
|
+
const fileSignals = extractFileHeuristics(entries, sessionId);
|
|
140
|
+
signals.push(...fileSignals);
|
|
141
|
+
}
|
|
142
|
+
return signals;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Map status strings to our status type.
|
|
146
|
+
*/
|
|
147
|
+
function mapTaskStatus(status) {
|
|
148
|
+
if (!status)
|
|
149
|
+
return undefined;
|
|
150
|
+
const normalized = status.toLowerCase();
|
|
151
|
+
if (normalized === "completed" || normalized === "done") {
|
|
152
|
+
return "completed";
|
|
153
|
+
}
|
|
154
|
+
if (normalized === "in_progress" || normalized === "in-progress") {
|
|
155
|
+
return "in_progress";
|
|
156
|
+
}
|
|
157
|
+
if (normalized === "pending" || normalized === "todo") {
|
|
158
|
+
return "pending";
|
|
159
|
+
}
|
|
160
|
+
return "unknown";
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Extract signals from TaskList tool result.
|
|
164
|
+
* TaskList returns a snapshot of all task states in format:
|
|
165
|
+
* "#1 [completed] Subject text"
|
|
166
|
+
* "#2 [in_progress] Another task"
|
|
167
|
+
*/
|
|
168
|
+
function extractTaskListSignals(taskListEntry, allEntries, sessionId) {
|
|
169
|
+
const signals = [];
|
|
170
|
+
// Find the tool result following this TaskList call
|
|
171
|
+
const resultContent = findToolResultContent(taskListEntry, allEntries);
|
|
172
|
+
if (!resultContent) {
|
|
173
|
+
return signals;
|
|
174
|
+
}
|
|
175
|
+
// Parse TaskList output: "#N [status] Subject"
|
|
176
|
+
const taskPattern = /#(\d+)\s+\[(\w+)\]\s+(.+)/g;
|
|
177
|
+
let match;
|
|
178
|
+
while ((match = taskPattern.exec(resultContent)) !== null) {
|
|
179
|
+
const taskId = match[1];
|
|
180
|
+
const statusStr = match[2];
|
|
181
|
+
const subject = match[3].trim();
|
|
182
|
+
const status = mapTaskStatus(statusStr) || "unknown";
|
|
183
|
+
signals.push({
|
|
184
|
+
source: "task_list",
|
|
185
|
+
text: subject,
|
|
186
|
+
status,
|
|
187
|
+
timestamp: taskListEntry.timestamp,
|
|
188
|
+
taskId,
|
|
189
|
+
sessionId,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return signals;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Find the tool result content following a tool call.
|
|
196
|
+
* Looks in subsequent user_message entries for the result.
|
|
197
|
+
*/
|
|
198
|
+
function findToolResultContent(toolCallEntry, allEntries) {
|
|
199
|
+
const callIndex = allEntries.indexOf(toolCallEntry);
|
|
200
|
+
if (callIndex === -1)
|
|
201
|
+
return undefined;
|
|
202
|
+
const toolUseId = toolCallEntry.content.toolUseId;
|
|
203
|
+
// Look for the result in subsequent entries (within a reasonable window)
|
|
204
|
+
for (let i = callIndex + 1; i < Math.min(callIndex + 10, allEntries.length); i++) {
|
|
205
|
+
const entry = allEntries[i];
|
|
206
|
+
// user_message entries can contain tool results
|
|
207
|
+
if (entry.type === "user_message") {
|
|
208
|
+
// Check for structured toolUseResult
|
|
209
|
+
const toolUseResult = entry.content.toolUseResult;
|
|
210
|
+
if (toolUseResult) {
|
|
211
|
+
// Try to get text from the result
|
|
212
|
+
if (typeof toolUseResult.content === "string") {
|
|
213
|
+
return toolUseResult.content;
|
|
214
|
+
}
|
|
215
|
+
if (typeof toolUseResult.text === "string") {
|
|
216
|
+
return toolUseResult.text;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Check for text content that might be the result
|
|
220
|
+
const text = entry.content.text;
|
|
221
|
+
if (text && toolUseId) {
|
|
222
|
+
// If text contains task list format, return it
|
|
223
|
+
if (/#\d+\s+\[\w+\]/.test(text)) {
|
|
224
|
+
return text;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// tool_result entries directly contain the result
|
|
229
|
+
if (entry.type === "tool_result") {
|
|
230
|
+
const content = entry.content.toolResultContent;
|
|
231
|
+
if (content && typeof content === "string") {
|
|
232
|
+
return content;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Extract signal from agent_progress entry (subagent work).
|
|
240
|
+
* Only generates signal for completed agent work.
|
|
241
|
+
*/
|
|
242
|
+
function extractAgentProgressSignal(entry, sessionId) {
|
|
243
|
+
const content = entry.content;
|
|
244
|
+
// Only count completed agent messages (assistant type indicates agent responded)
|
|
245
|
+
if (content.agentMessageType !== "assistant") {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
// Use agent description or first ~100 chars of prompt as signal text
|
|
249
|
+
let text = content.agentDescription || "";
|
|
250
|
+
if (!text && content.agentPrompt) {
|
|
251
|
+
text = content.agentPrompt.slice(0, 100);
|
|
252
|
+
if (content.agentPrompt.length > 100) {
|
|
253
|
+
text += "...";
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (!text) {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
// Include agent type in text for better matching
|
|
260
|
+
if (content.agentType && content.agentType !== "unknown") {
|
|
261
|
+
text = `[${content.agentType}] ${text}`;
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
source: "agent_progress",
|
|
265
|
+
text,
|
|
266
|
+
status: "completed",
|
|
267
|
+
timestamp: entry.timestamp,
|
|
268
|
+
sessionId,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Extract signal from bash_progress entry.
|
|
273
|
+
* Only generates signals for completed commands with relevant keywords.
|
|
274
|
+
*/
|
|
275
|
+
function extractBashProgressSignal(entry, sessionId) {
|
|
276
|
+
const content = entry.content;
|
|
277
|
+
// Need full output to analyze
|
|
278
|
+
const output = content.bashFullOutput || content.bashOutput || "";
|
|
279
|
+
if (!output) {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
// Look for test/build related keywords in output
|
|
283
|
+
const testKeywords = ["test", "spec", "passed", "failed", "PASS", "FAIL", "error", "success"];
|
|
284
|
+
const buildKeywords = ["build", "compile", "bundle", "webpack", "vite", "tsc"];
|
|
285
|
+
const deployKeywords = ["deploy", "publish", "release"];
|
|
286
|
+
const outputLower = output.toLowerCase();
|
|
287
|
+
let signalType = null;
|
|
288
|
+
let status = "completed";
|
|
289
|
+
// Check for test runs
|
|
290
|
+
if (testKeywords.some(kw => outputLower.includes(kw.toLowerCase()))) {
|
|
291
|
+
signalType = "test";
|
|
292
|
+
// Check for failures
|
|
293
|
+
if (/fail|error/i.test(output) && !/0 fail|0 error/i.test(output)) {
|
|
294
|
+
status = "in_progress"; // Tests failed, work not complete
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// Check for builds
|
|
298
|
+
else if (buildKeywords.some(kw => outputLower.includes(kw.toLowerCase()))) {
|
|
299
|
+
signalType = "build";
|
|
300
|
+
if (/error|fail/i.test(output) && !/0 error|0 fail/i.test(output)) {
|
|
301
|
+
status = "in_progress";
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Check for deployments
|
|
305
|
+
else if (deployKeywords.some(kw => outputLower.includes(kw.toLowerCase()))) {
|
|
306
|
+
signalType = "deploy";
|
|
307
|
+
}
|
|
308
|
+
if (!signalType) {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
// Create a descriptive text
|
|
312
|
+
const elapsed = content.bashElapsedSeconds;
|
|
313
|
+
const elapsedStr = elapsed ? ` (${elapsed.toFixed(1)}s)` : "";
|
|
314
|
+
const text = `Ran ${signalType}${elapsedStr}`;
|
|
315
|
+
return {
|
|
316
|
+
source: "bash_progress",
|
|
317
|
+
text,
|
|
318
|
+
status,
|
|
319
|
+
timestamp: entry.timestamp,
|
|
320
|
+
sessionId,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Try to extract task ID from the tool result following a TaskCreate call.
|
|
325
|
+
* Prioritizes structured toolUseResult data over text parsing.
|
|
326
|
+
*/
|
|
327
|
+
function extractTaskIdFromResponse(createEntry, allEntries) {
|
|
328
|
+
const createIndex = allEntries.indexOf(createEntry);
|
|
329
|
+
if (createIndex === -1)
|
|
330
|
+
return undefined;
|
|
331
|
+
const toolUseId = createEntry.content.toolUseId;
|
|
332
|
+
// Look for the next user entry which should contain the tool result
|
|
333
|
+
for (let i = createIndex + 1; i < Math.min(createIndex + 5, allEntries.length); i++) {
|
|
334
|
+
const entry = allEntries[i];
|
|
335
|
+
if (entry.type === "user_message") {
|
|
336
|
+
// Priority 1: Check for toolUseResult.task.id (structured data - most reliable)
|
|
337
|
+
const toolResult = entry.content.toolUseResult;
|
|
338
|
+
if (toolResult?.task?.id) {
|
|
339
|
+
return toolResult.task.id;
|
|
340
|
+
}
|
|
341
|
+
// Priority 2: Check for toolUseResult.taskId directly
|
|
342
|
+
if (toolResult?.taskId) {
|
|
343
|
+
return toolResult.taskId;
|
|
344
|
+
}
|
|
345
|
+
// Priority 3: Check for nested result structure
|
|
346
|
+
if (toolResult && typeof toolResult === "object") {
|
|
347
|
+
// Sometimes the result has a different structure
|
|
348
|
+
const result = toolResult;
|
|
349
|
+
if (result.id && typeof result.id === "string") {
|
|
350
|
+
return result.id;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Priority 4: Fallback to text parsing
|
|
354
|
+
const text = entry.content.text;
|
|
355
|
+
if (text) {
|
|
356
|
+
// Match various patterns: "Task #1 created", "Created task 1", etc.
|
|
357
|
+
const patterns = [
|
|
358
|
+
/Task #(\d+)/i,
|
|
359
|
+
/task\s+(\d+)/i,
|
|
360
|
+
/created.*#(\d+)/i,
|
|
361
|
+
/id[:\s]+(\d+)/i,
|
|
362
|
+
];
|
|
363
|
+
for (const pattern of patterns) {
|
|
364
|
+
const match = text.match(pattern);
|
|
365
|
+
if (match) {
|
|
366
|
+
return match[1];
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Fallback: use a generated ID based on position
|
|
373
|
+
return `auto-${createIndex}`;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Extract file modification signals from Write/Edit tool calls.
|
|
377
|
+
* Used as a fallback when no task tools are present.
|
|
378
|
+
*/
|
|
379
|
+
function extractFileHeuristics(entries, sessionId) {
|
|
380
|
+
const signals = [];
|
|
381
|
+
const seenFiles = new Set();
|
|
382
|
+
for (const entry of entries) {
|
|
383
|
+
if (entry.type !== "tool_call") {
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
const toolName = entry.content.toolName;
|
|
387
|
+
const toolInput = entry.content.toolInput;
|
|
388
|
+
if (!toolInput) {
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
let filePath;
|
|
392
|
+
if (toolName === "Write") {
|
|
393
|
+
filePath = toolInput.file_path;
|
|
394
|
+
}
|
|
395
|
+
else if (toolName === "Edit") {
|
|
396
|
+
filePath = toolInput.file_path;
|
|
397
|
+
}
|
|
398
|
+
if (filePath && !seenFiles.has(filePath)) {
|
|
399
|
+
seenFiles.add(filePath);
|
|
400
|
+
// Extract filename for the signal text
|
|
401
|
+
const filename = filePath.split(/[/\\]/).pop() || filePath;
|
|
402
|
+
signals.push({
|
|
403
|
+
source: "file_heuristic",
|
|
404
|
+
text: `Modified ${filename}`,
|
|
405
|
+
status: "completed",
|
|
406
|
+
timestamp: entry.timestamp,
|
|
407
|
+
filePath,
|
|
408
|
+
sessionId,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return signals;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get all unique file paths modified in the session.
|
|
416
|
+
*/
|
|
417
|
+
export function getModifiedFiles(entries) {
|
|
418
|
+
const files = new Set();
|
|
419
|
+
for (const entry of entries) {
|
|
420
|
+
if (entry.type !== "tool_call")
|
|
421
|
+
continue;
|
|
422
|
+
const toolName = entry.content.toolName;
|
|
423
|
+
const toolInput = entry.content.toolInput;
|
|
424
|
+
if (!toolInput)
|
|
425
|
+
continue;
|
|
426
|
+
if (toolName === "Write" || toolName === "Edit") {
|
|
427
|
+
const filePath = toolInput.file_path;
|
|
428
|
+
if (filePath) {
|
|
429
|
+
files.add(filePath);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return Array.from(files);
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=task-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-extractor.js","sourceRoot":"","sources":["../../src/plan/task-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Progress Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for tracking plan completion status by matching
|
|
5
|
+
* task signals from JSONL transcripts to plan markdown items.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* A single item parsed from plan markdown.
|
|
9
|
+
* Represents trackable items like headings, numbered lists, bullets, and checkboxes.
|
|
10
|
+
*/
|
|
11
|
+
export interface PlanItem {
|
|
12
|
+
/** Unique ID within the plan, e.g. "item-3-2" */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Raw text, stripped of markdown syntax */
|
|
15
|
+
text: string;
|
|
16
|
+
/** Depth level: 0=h1, 1=h2, 2=h3, 3+=list items */
|
|
17
|
+
depth: number;
|
|
18
|
+
/** Item type */
|
|
19
|
+
type: "heading" | "numbered" | "bullet" | "checkbox";
|
|
20
|
+
/** 1-indexed line number in the source markdown */
|
|
21
|
+
lineNumber: number;
|
|
22
|
+
/** Parent item ID, null for top-level items */
|
|
23
|
+
parentId: string | null;
|
|
24
|
+
/** Child item IDs */
|
|
25
|
+
childIds: string[];
|
|
26
|
+
/** For checkbox items, whether it's checked in the source: - [x] */
|
|
27
|
+
isCheckedInSource: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parsed plan structure with metadata.
|
|
31
|
+
*/
|
|
32
|
+
export interface ParsedPlan {
|
|
33
|
+
/** All items in document order */
|
|
34
|
+
items: PlanItem[];
|
|
35
|
+
/** Count of trackable items (excludes pure structural headings) */
|
|
36
|
+
trackableCount: number;
|
|
37
|
+
/** Map of line number to item for fast lookup */
|
|
38
|
+
lineToItem: Map<number, PlanItem>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A task signal extracted from session JSONL.
|
|
42
|
+
* Represents evidence of work on a task.
|
|
43
|
+
*/
|
|
44
|
+
export interface TaskSignal {
|
|
45
|
+
/** How this signal was detected */
|
|
46
|
+
source: "todo_write" | "task_create" | "task_update" | "task_list" | "agent_progress" | "bash_progress" | "file_heuristic";
|
|
47
|
+
/** Task description text */
|
|
48
|
+
text: string;
|
|
49
|
+
/** Task status */
|
|
50
|
+
status: "pending" | "in_progress" | "completed" | "unknown";
|
|
51
|
+
/** ISO timestamp when this signal was recorded */
|
|
52
|
+
timestamp: string;
|
|
53
|
+
/** Task ID from TaskCreate/TaskUpdate tool calls */
|
|
54
|
+
taskId?: string;
|
|
55
|
+
/** File path for file_heuristic signals */
|
|
56
|
+
filePath?: string;
|
|
57
|
+
/** Session ID where this signal was found */
|
|
58
|
+
sessionId: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A match between a task signal and a plan item.
|
|
62
|
+
*/
|
|
63
|
+
export interface PlanItemMatch {
|
|
64
|
+
/** ID of the plan item that was matched */
|
|
65
|
+
planItemId: string;
|
|
66
|
+
/** The signal that matched */
|
|
67
|
+
signal: TaskSignal;
|
|
68
|
+
/** Confidence score 0-1 */
|
|
69
|
+
confidence: number;
|
|
70
|
+
/** How the match was determined */
|
|
71
|
+
matchMethod: "exact_text" | "keyword_overlap" | "file_path" | "substring";
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Status of a plan item based on matched signals.
|
|
75
|
+
*/
|
|
76
|
+
export type PlanItemStatus = "not_started" | "in_progress" | "completed";
|
|
77
|
+
/**
|
|
78
|
+
* Progress status for a single plan item.
|
|
79
|
+
*/
|
|
80
|
+
export interface PlanItemProgress {
|
|
81
|
+
/** Plan item ID */
|
|
82
|
+
planItemId: string;
|
|
83
|
+
/** Computed status */
|
|
84
|
+
status: PlanItemStatus;
|
|
85
|
+
/** Best matching signal, if any */
|
|
86
|
+
bestMatch: PlanItemMatch | null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Summary of plan progress.
|
|
90
|
+
*/
|
|
91
|
+
export interface PlanProgressSummary {
|
|
92
|
+
/** Total trackable items */
|
|
93
|
+
total: number;
|
|
94
|
+
/** Items with completed status */
|
|
95
|
+
completed: number;
|
|
96
|
+
/** Items with in_progress status */
|
|
97
|
+
inProgress: number;
|
|
98
|
+
/** Items with not_started status */
|
|
99
|
+
notStarted: number;
|
|
100
|
+
/** Completion percentage (0-100) */
|
|
101
|
+
percentage: number;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Full progress data for a plan.
|
|
105
|
+
*/
|
|
106
|
+
export interface PlanProgress {
|
|
107
|
+
/** Plan ID (matches PlanEntry.id) */
|
|
108
|
+
planId: string;
|
|
109
|
+
/** ISO timestamp when progress was computed */
|
|
110
|
+
computedAt: string;
|
|
111
|
+
/** Per-item progress status */
|
|
112
|
+
items: PlanItemProgress[];
|
|
113
|
+
/** Summary statistics */
|
|
114
|
+
summary: PlanProgressSummary;
|
|
115
|
+
/** Session IDs that contributed signals */
|
|
116
|
+
sessionIds: string[];
|
|
117
|
+
/** Cache key for invalidation (hash of plan content + session mtimes) */
|
|
118
|
+
cacheKey: string;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Lightweight progress summary for list views.
|
|
122
|
+
*/
|
|
123
|
+
export interface PlanProgressListItem {
|
|
124
|
+
/** Plan ID */
|
|
125
|
+
planId: string;
|
|
126
|
+
/** Completion percentage */
|
|
127
|
+
percentage: number;
|
|
128
|
+
/** Whether progress is still being computed */
|
|
129
|
+
loading: boolean;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plan/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plan/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Aggregator
|
|
3
|
+
*
|
|
4
|
+
* Aggregates data from multiple sources to build project statistics
|
|
5
|
+
* and session lists for the dashboard.
|
|
6
|
+
*
|
|
7
|
+
* Sources:
|
|
8
|
+
* - Live sessions (from WebSocket/Session registry)
|
|
9
|
+
* - Saved sessions (.jacques/index.json)
|
|
10
|
+
* - Archived sessions (~/.jacques/archive/manifests/)
|
|
11
|
+
* - Handoffs (.jacques/handoffs/)
|
|
12
|
+
* - Plans (.jacques/index.json plans array)
|
|
13
|
+
*/
|
|
14
|
+
import type { Session } from "../types.js";
|
|
15
|
+
import type { PlanEntry } from "../context/types.js";
|
|
16
|
+
import type { ProjectStatistics, ProjectSessionItem } from "./types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Aggregate statistics for a project
|
|
19
|
+
*
|
|
20
|
+
* @param projectPath - Full path to the project directory
|
|
21
|
+
* @param liveSessions - Currently active sessions from the server
|
|
22
|
+
*/
|
|
23
|
+
export declare function aggregateProjectStatistics(projectPath: string, liveSessions: Session[]): Promise<ProjectStatistics>;
|
|
24
|
+
/**
|
|
25
|
+
* Build a unified list of sessions for display
|
|
26
|
+
*
|
|
27
|
+
* Combines live, saved, and archived sessions, sorted by date (newest first).
|
|
28
|
+
* Deduplicates sessions that appear in multiple sources.
|
|
29
|
+
*
|
|
30
|
+
* @param projectPath - Full path to the project directory
|
|
31
|
+
* @param liveSessions - Currently active sessions from the server
|
|
32
|
+
* @param focusedSessionId - ID of the currently focused session
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildProjectSessionList(projectPath: string, liveSessions: Session[], focusedSessionId: string | null): Promise<ProjectSessionItem[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Get plans for a project
|
|
37
|
+
*/
|
|
38
|
+
export declare function getProjectPlans(projectPath: string): Promise<PlanEntry[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Read the content of a local plan file from .jacques/
|
|
41
|
+
*/
|
|
42
|
+
export declare function readLocalPlanContent(projectPath: string, plan: PlanEntry): Promise<string | null>;
|
|
43
|
+
//# sourceMappingURL=aggregator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../../src/project/aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA6BxE;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,EAAE,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA2E5B;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,EAAE,EACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA6E/B;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,EAAE,CAAC,CAWtB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB"}
|