opencode-flema-engram-sidebar 0.1.6 → 0.1.8

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 (45) hide show
  1. package/README.md +89 -25
  2. package/dist/adapters/cloud.js +1 -1
  3. package/dist/adapters/cloud.js.map +1 -1
  4. package/dist/adapters/factory.d.ts +2 -0
  5. package/dist/adapters/factory.d.ts.map +1 -1
  6. package/dist/adapters/factory.js +14 -3
  7. package/dist/adapters/factory.js.map +1 -1
  8. package/dist/adapters/local.d.ts.map +1 -1
  9. package/dist/adapters/local.js +5 -4
  10. package/dist/adapters/local.js.map +1 -1
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp/server.js +4 -4
  16. package/dist/mcp/server.js.map +1 -1
  17. package/dist/mcp/tools/get-project-state.d.ts +3 -0
  18. package/dist/mcp/tools/get-project-state.d.ts.map +1 -1
  19. package/dist/mcp/tools/get-project-state.js +11 -6
  20. package/dist/mcp/tools/get-project-state.js.map +1 -1
  21. package/dist/schemas/odd-state.d.ts +401 -0
  22. package/dist/schemas/odd-state.d.ts.map +1 -0
  23. package/dist/schemas/odd-state.js +41 -0
  24. package/dist/schemas/odd-state.js.map +1 -0
  25. package/dist/sidebar/components/odd-progress.d.ts +13 -0
  26. package/dist/sidebar/components/odd-progress.d.ts.map +1 -0
  27. package/dist/sidebar/components/odd-progress.js +26 -0
  28. package/dist/sidebar/components/odd-progress.js.map +1 -0
  29. package/dist/sidebar/hooks/use-engram.d.ts +6 -0
  30. package/dist/sidebar/hooks/use-engram.d.ts.map +1 -1
  31. package/dist/sidebar/hooks/use-engram.js +52 -14
  32. package/dist/sidebar/hooks/use-engram.js.map +1 -1
  33. package/dist/sidebar/plugin.d.ts +9 -1
  34. package/dist/sidebar/plugin.d.ts.map +1 -1
  35. package/dist/sidebar/plugin.js +60 -4
  36. package/dist/sidebar/plugin.js.map +1 -1
  37. package/dist/utils/odd-detector.d.ts +8 -0
  38. package/dist/utils/odd-detector.d.ts.map +1 -0
  39. package/dist/utils/odd-detector.js +137 -0
  40. package/dist/utils/odd-detector.js.map +1 -0
  41. package/dist/utils/timeout.d.ts +4 -0
  42. package/dist/utils/timeout.d.ts.map +1 -0
  43. package/dist/utils/timeout.js +31 -0
  44. package/dist/utils/timeout.js.map +1 -0
  45. package/package.json +5 -4
@@ -0,0 +1,137 @@
1
+ import { oddTaskSchema } from "../schemas/odd-state.js";
2
+ import { engramTimestampSchema } from "../schemas/timestamp.js";
3
+ export function parseODDTopicKey(topicKey) {
4
+ const match = /^odd\/([^/\s]+)\/tasks$/.exec(topicKey);
5
+ return match && match[0] === topicKey ? { featureId: match[1] } : null;
6
+ }
7
+ const TASK_LINE = /^- \[([ x])\] `([^`]+)` \*\*([^*]+)\*\* — (\S.*)$/;
8
+ function orderingTimestamp(original, normalized) {
9
+ // Validation normalizes SQLite timestamps without their fraction; Date.parse
10
+ // also truncates ISO sub-millisecond digits. Keep the original digits separately.
11
+ return {
12
+ wholeSecond: Date.parse(normalized.replace(/\.\d+(?=Z$)/, "")),
13
+ fraction: /\.(\d+)/.exec(original)?.[1] ?? "",
14
+ };
15
+ }
16
+ function compareTimestamps(a, b) {
17
+ if (a.wholeSecond !== b.wholeSecond)
18
+ return a.wholeSecond - b.wholeSecond;
19
+ const precision = Math.max(a.fraction.length, b.fraction.length);
20
+ const left = a.fraction.padEnd(precision, "0");
21
+ const right = b.fraction.padEnd(precision, "0");
22
+ return left === right ? 0 : left > right ? 1 : -1;
23
+ }
24
+ function parseDocument(observation, featureId, provenance) {
25
+ const diagnostics = [];
26
+ const report = (code, message, line) => {
27
+ diagnostics.push({ code, message, provenance, ...(line ? { line } : {}) });
28
+ };
29
+ const tasks = [];
30
+ const ids = new Set();
31
+ const titles = [];
32
+ let sections = 0;
33
+ let inTasks = false;
34
+ let fence;
35
+ for (const [index, raw] of observation.content.split(/\r?\n/).entries()) {
36
+ const line = index + 1;
37
+ const fenceMatch = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(raw);
38
+ if (fence) {
39
+ if (fenceMatch && fenceMatch[1][0] === fence.marker &&
40
+ fenceMatch[1].length >= fence.length && !fenceMatch[2].trim())
41
+ fence = undefined;
42
+ continue;
43
+ }
44
+ if (fenceMatch) {
45
+ fence = { marker: fenceMatch[1][0], length: fenceMatch[1].length };
46
+ continue;
47
+ }
48
+ const heading = /^# ODD Feature: (\S.*)$/.exec(raw);
49
+ if (heading)
50
+ titles.push(heading[1].trim());
51
+ if (/^#{1,2}(?:\s|$)/.test(raw)) {
52
+ inTasks = /^## Tasks\s*$/.test(raw);
53
+ if (inTasks)
54
+ sections++;
55
+ continue;
56
+ }
57
+ if (!inTasks || !/^\s*[-*+]\s+\[/.test(raw))
58
+ continue;
59
+ const match = TASK_LINE.exec(raw);
60
+ const parsed = oddTaskSchema.safeParse(match && {
61
+ id: match[2], status: match[3], title: match[4].trim(),
62
+ });
63
+ if (!match || !parsed.success) {
64
+ report("invalid_task", "Expected a canonical task checklist line with stable ID, status and title.", line);
65
+ continue;
66
+ }
67
+ const task = parsed.data;
68
+ if ((match[1] === "x") !== (task.status === "done" || task.status === "cancelled")) {
69
+ report("checkbox_status_mismatch", "Checkbox must agree with explicit task status.", line);
70
+ }
71
+ if (ids.has(task.id))
72
+ report("duplicate_task_id", `Duplicate task ID: ${task.id}.`, line);
73
+ ids.add(task.id);
74
+ tasks.push(task);
75
+ }
76
+ if (fence)
77
+ report("unclosed_fence", "Markdown fence must be closed.");
78
+ if (titles.length !== 1)
79
+ report("invalid_heading", "Expected exactly one top-level ODD Feature heading.");
80
+ if (sections !== 1)
81
+ report("invalid_tasks_section", "Expected exactly one Tasks section.");
82
+ if (sections === 1 && tasks.length === 0 && diagnostics.length === 0) {
83
+ report("empty_tasks", "Tasks section must contain at least one canonical task.");
84
+ }
85
+ if (diagnostics.length)
86
+ return { diagnostics };
87
+ const progress = {
88
+ total: tasks.length, pending: 0, in_progress: 0, blocked: 0, done: 0, cancelled: 0,
89
+ };
90
+ for (const task of tasks)
91
+ progress[task.status]++;
92
+ return { diagnostics, feature: { version: 1, featureId, title: titles[0], tasks, progress, provenance } };
93
+ }
94
+ /** Derive only from supplied observations; no history fetch, SDD fallback or inferred progress. */
95
+ export function deriveODDState(observations) {
96
+ const diagnostics = [];
97
+ const latest = new Map();
98
+ for (const observation of observations) {
99
+ if (!observation.topic_key.startsWith("odd/"))
100
+ continue;
101
+ const provenance = {
102
+ observationId: observation.id, topicKey: observation.topic_key,
103
+ project: observation.project, updatedAt: observation.updated_at,
104
+ };
105
+ const topic = parseODDTopicKey(observation.topic_key);
106
+ if (!topic) {
107
+ diagnostics.push({ code: "invalid_topic", message: "Expected odd/<feature-id>/tasks.", provenance });
108
+ continue;
109
+ }
110
+ const timestamp = engramTimestampSchema.safeParse(observation.updated_at);
111
+ if (!timestamp.success) {
112
+ diagnostics.push({ code: "invalid_timestamp", message: "Expected a valid Engram timestamp.", provenance });
113
+ continue;
114
+ }
115
+ const parsed = parseDocument(observation, topic.featureId, provenance);
116
+ diagnostics.push(...parsed.diagnostics);
117
+ if (!parsed.feature)
118
+ continue;
119
+ const key = JSON.stringify([observation.project, topic.featureId]);
120
+ const current = latest.get(key);
121
+ const time = orderingTimestamp(observation.updated_at, timestamp.data);
122
+ const comparison = current ? compareTimestamps(time, current.timestamp) : 1;
123
+ if (!current || comparison > 0 ||
124
+ (comparison === 0 && observation.id > current.feature.provenance.observationId)) {
125
+ latest.set(key, { feature: parsed.feature, timestamp: time });
126
+ }
127
+ }
128
+ return {
129
+ bounded: true,
130
+ features: [...latest.values()].map(({ feature }) => feature).sort((a, b) => a.provenance.project.localeCompare(b.provenance.project) || a.featureId.localeCompare(b.featureId)),
131
+ diagnostics: diagnostics.sort((a, b) => a.provenance.project.localeCompare(b.provenance.project) ||
132
+ a.provenance.topicKey.localeCompare(b.provenance.topicKey) ||
133
+ a.provenance.observationId - b.provenance.observationId || (a.line ?? 0) - (b.line ?? 0) ||
134
+ a.code.localeCompare(b.code)),
135
+ };
136
+ }
137
+ //# sourceMappingURL=odd-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odd-detector.js","sourceRoot":"","sources":["../../src/utils/odd-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const MAX_TIMER_DELAY_MS = 2147483647;
2
+ /** Schedule any positive finite delay without triggering the platform timer overflow clamp. */
3
+ export declare function scheduleLongTimeout(callback: () => void, delayMs: number): () => void;
4
+ //# sourceMappingURL=timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,aAAgB,CAAC;AAEhD,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CA4BrF"}
@@ -0,0 +1,31 @@
1
+ export const MAX_TIMER_DELAY_MS = 2_147_483_647;
2
+ /** Schedule any positive finite delay without triggering the platform timer overflow clamp. */
3
+ export function scheduleLongTimeout(callback, delayMs) {
4
+ if (!Number.isFinite(delayMs) || delayMs <= 0) {
5
+ throw new Error(`Invalid delayMs: ${delayMs}`);
6
+ }
7
+ let remainingMs = delayMs;
8
+ let timeoutId;
9
+ let cancelled = false;
10
+ const scheduleNextChunk = () => {
11
+ const chunkMs = Math.min(remainingMs, MAX_TIMER_DELAY_MS);
12
+ timeoutId = setTimeout(() => {
13
+ if (cancelled)
14
+ return;
15
+ const nextRemainingMs = remainingMs - chunkMs;
16
+ if (nextRemainingMs <= 0) {
17
+ callback();
18
+ return;
19
+ }
20
+ remainingMs = nextRemainingMs;
21
+ scheduleNextChunk();
22
+ }, chunkMs);
23
+ };
24
+ scheduleNextChunk();
25
+ return () => {
26
+ cancelled = true;
27
+ if (timeoutId !== undefined)
28
+ clearTimeout(timeoutId);
29
+ };
30
+ }
31
+ //# sourceMappingURL=timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAEhD,+FAA+F;AAC/F,MAAM,UAAU,mBAAmB,CAAC,QAAoB,EAAE,OAAe;IACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,WAAW,GAAG,OAAO,CAAC;IAC1B,IAAI,SAAoD,CAAC;IACzD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC1D,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,IAAI,SAAS;gBAAE,OAAO;YACtB,MAAM,eAAe,GAAG,WAAW,GAAG,OAAO,CAAC;YAC9C,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;gBACzB,QAAQ,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YACD,WAAW,GAAG,eAAe,CAAC;YAC9B,iBAAiB,EAAE,CAAC;QACtB,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC;IAEF,iBAAiB,EAAE,CAAC;IACpB,OAAO,GAAG,EAAE;QACV,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,SAAS,KAAK,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-flema-engram-sidebar",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Local-first OpenCode plugin/sidebar for Engram memory and SDD context, with an optional MCP stdio adapter",
5
5
  "type": "module",
6
6
  "exports": {
@@ -58,7 +58,7 @@
58
58
  "opencode": ">=1.18.25"
59
59
  },
60
60
  "dependencies": {
61
- "@modelcontextprotocol/sdk": "^1.12.1",
61
+ "@modelcontextprotocol/sdk": "^1.31.0",
62
62
  "@opencode-ai/plugin": "^1.18.25",
63
63
  "@opentui/solid": "^0.5.9",
64
64
  "solid-js": "^1.9.12",
@@ -67,8 +67,9 @@
67
67
  },
68
68
  "devDependencies": {
69
69
  "@types/node": "^22.0.0",
70
- "@vitest/coverage-v8": "^3.2.7",
70
+ "@vitest/coverage-v8": "5.0.4",
71
71
  "typescript": "^5.8.0",
72
- "vitest": "^3.2.0"
72
+ "vitest": "5.0.4",
73
+ "yaml": "^2.9.0"
73
74
  }
74
75
  }