@they-juanreina/compost-cli 0.1.0-rc.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/LICENSE +21 -0
- package/README.md +5 -0
- package/bin/compost.js +7 -0
- package/dist/commands/_stub.d.ts +9 -0
- package/dist/commands/_stub.d.ts.map +1 -0
- package/dist/commands/_stub.js +27 -0
- package/dist/commands/_stub.js.map +1 -0
- package/dist/commands/blame.d.ts +3 -0
- package/dist/commands/blame.d.ts.map +1 -0
- package/dist/commands/blame.js +31 -0
- package/dist/commands/blame.js.map +1 -0
- package/dist/commands/chat.d.ts +8 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +99 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/code.d.ts +3 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/code.js +70 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +76 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +20 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +148 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/endorse.d.ts +3 -0
- package/dist/commands/endorse.d.ts.map +1 -0
- package/dist/commands/endorse.js +31 -0
- package/dist/commands/endorse.js.map +1 -0
- package/dist/commands/evals.d.ts +3 -0
- package/dist/commands/evals.d.ts.map +1 -0
- package/dist/commands/evals.js +54 -0
- package/dist/commands/evals.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +54 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/ingest.d.ts +3 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +26 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +51 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +28 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/models.d.ts +3 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +32 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/query.d.ts +3 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +13 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/reindex.d.ts +3 -0
- package/dist/commands/reindex.d.ts.map +1 -0
- package/dist/commands/reindex.js +53 -0
- package/dist/commands/reindex.js.map +1 -0
- package/dist/commands/rescan.d.ts +3 -0
- package/dist/commands/rescan.d.ts.map +1 -0
- package/dist/commands/rescan.js +60 -0
- package/dist/commands/rescan.js.map +1 -0
- package/dist/commands/saturate.d.ts +3 -0
- package/dist/commands/saturate.d.ts.map +1 -0
- package/dist/commands/saturate.js +35 -0
- package/dist/commands/saturate.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +52 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +9 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +25 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +38 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/snap.d.ts +3 -0
- package/dist/commands/snap.d.ts.map +1 -0
- package/dist/commands/snap.js +27 -0
- package/dist/commands/snap.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +26 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/synthesize.d.ts +3 -0
- package/dist/commands/synthesize.d.ts.map +1 -0
- package/dist/commands/synthesize.js +13 -0
- package/dist/commands/synthesize.js.map +1 -0
- package/dist/commands/tag.d.ts +3 -0
- package/dist/commands/tag.d.ts.map +1 -0
- package/dist/commands/tag.js +46 -0
- package/dist/commands/tag.js.map +1 -0
- package/dist/commands/transcribe.d.ts +3 -0
- package/dist/commands/transcribe.d.ts.map +1 -0
- package/dist/commands/transcribe.js +110 -0
- package/dist/commands/transcribe.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +81 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +50 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +12 -0
- package/dist/errors.js.map +1 -0
- package/dist/exporters/csv.d.ts +8 -0
- package/dist/exporters/csv.d.ts.map +1 -0
- package/dist/exporters/csv.js +44 -0
- package/dist/exporters/csv.js.map +1 -0
- package/dist/exporters/eaf.d.ts +3 -0
- package/dist/exporters/eaf.d.ts.map +1 -0
- package/dist/exporters/eaf.js +91 -0
- package/dist/exporters/eaf.js.map +1 -0
- package/dist/exporters/html.d.ts +8 -0
- package/dist/exporters/html.d.ts.map +1 -0
- package/dist/exporters/html.js +47 -0
- package/dist/exporters/html.js.map +1 -0
- package/dist/exporters/md.d.ts +3 -0
- package/dist/exporters/md.d.ts.map +1 -0
- package/dist/exporters/md.js +43 -0
- package/dist/exporters/md.js.map +1 -0
- package/dist/exporters/pdf.d.ts +9 -0
- package/dist/exporters/pdf.d.ts.map +1 -0
- package/dist/exporters/pdf.js +40 -0
- package/dist/exporters/pdf.js.map +1 -0
- package/dist/exporters/report.d.ts +43 -0
- package/dist/exporters/report.d.ts.map +1 -0
- package/dist/exporters/report.js +49 -0
- package/dist/exporters/report.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy_client.d.ts +38 -0
- package/dist/legacy_client.d.ts.map +1 -0
- package/dist/legacy_client.js +44 -0
- package/dist/legacy_client.js.map +1 -0
- package/dist/lib/answerSchema.d.ts +2 -0
- package/dist/lib/answerSchema.d.ts.map +1 -0
- package/dist/lib/answerSchema.js +27 -0
- package/dist/lib/answerSchema.js.map +1 -0
- package/dist/lib/artifacts.d.ts +64 -0
- package/dist/lib/artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts.js +254 -0
- package/dist/lib/artifacts.js.map +1 -0
- package/dist/lib/blame.d.ts +30 -0
- package/dist/lib/blame.d.ts.map +1 -0
- package/dist/lib/blame.js +164 -0
- package/dist/lib/blame.js.map +1 -0
- package/dist/lib/canonicalSessions.d.ts +24 -0
- package/dist/lib/canonicalSessions.d.ts.map +1 -0
- package/dist/lib/canonicalSessions.js +48 -0
- package/dist/lib/canonicalSessions.js.map +1 -0
- package/dist/lib/chat.d.ts +24 -0
- package/dist/lib/chat.d.ts.map +1 -0
- package/dist/lib/chat.js +50 -0
- package/dist/lib/chat.js.map +1 -0
- package/dist/lib/config.d.ts +45 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +143 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dispatch.d.ts +10 -0
- package/dist/lib/dispatch.d.ts.map +1 -0
- package/dist/lib/dispatch.js +31 -0
- package/dist/lib/dispatch.js.map +1 -0
- package/dist/lib/doctor.d.ts +19 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +43 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/events.d.ts +42 -0
- package/dist/lib/events.d.ts.map +1 -0
- package/dist/lib/events.js +57 -0
- package/dist/lib/events.js.map +1 -0
- package/dist/lib/export.d.ts +14 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +36 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/ingest.d.ts +21 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +68 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/journal.d.ts +23 -0
- package/dist/lib/journal.d.ts.map +1 -0
- package/dist/lib/journal.js +95 -0
- package/dist/lib/journal.js.map +1 -0
- package/dist/lib/migrate.d.ts +29 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +117 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/nativeRuntime.d.ts +46 -0
- package/dist/lib/nativeRuntime.d.ts.map +1 -0
- package/dist/lib/nativeRuntime.js +61 -0
- package/dist/lib/nativeRuntime.js.map +1 -0
- package/dist/lib/provisionNative.d.ts +46 -0
- package/dist/lib/provisionNative.d.ts.map +1 -0
- package/dist/lib/provisionNative.js +105 -0
- package/dist/lib/provisionNative.js.map +1 -0
- package/dist/lib/queue.d.ts +36 -0
- package/dist/lib/queue.d.ts.map +1 -0
- package/dist/lib/queue.js +102 -0
- package/dist/lib/queue.js.map +1 -0
- package/dist/lib/retrieve.d.ts +51 -0
- package/dist/lib/retrieve.d.ts.map +1 -0
- package/dist/lib/retrieve.js +92 -0
- package/dist/lib/retrieve.js.map +1 -0
- package/dist/lib/saturate.d.ts +21 -0
- package/dist/lib/saturate.d.ts.map +1 -0
- package/dist/lib/saturate.js +132 -0
- package/dist/lib/saturate.js.map +1 -0
- package/dist/lib/schemas.generated.d.ts +15 -0
- package/dist/lib/schemas.generated.d.ts.map +1 -0
- package/dist/lib/schemas.generated.js +975 -0
- package/dist/lib/schemas.generated.js.map +1 -0
- package/dist/lib/seed.d.ts +16 -0
- package/dist/lib/seed.d.ts.map +1 -0
- package/dist/lib/seed.js +64 -0
- package/dist/lib/seed.js.map +1 -0
- package/dist/lib/seedResolve.d.ts +6 -0
- package/dist/lib/seedResolve.d.ts.map +1 -0
- package/dist/lib/seedResolve.js +27 -0
- package/dist/lib/seedResolve.js.map +1 -0
- package/dist/lib/session.d.ts +19 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +61 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/setup.d.ts +44 -0
- package/dist/lib/setup.d.ts.map +1 -0
- package/dist/lib/setup.js +249 -0
- package/dist/lib/setup.js.map +1 -0
- package/dist/lib/snap.d.ts +15 -0
- package/dist/lib/snap.d.ts.map +1 -0
- package/dist/lib/snap.js +115 -0
- package/dist/lib/snap.js.map +1 -0
- package/dist/lib/status.d.ts +39 -0
- package/dist/lib/status.d.ts.map +1 -0
- package/dist/lib/status.js +174 -0
- package/dist/lib/status.js.map +1 -0
- package/dist/lib/tagcode.d.ts +26 -0
- package/dist/lib/tagcode.d.ts.map +1 -0
- package/dist/lib/tagcode.js +231 -0
- package/dist/lib/tagcode.js.map +1 -0
- package/dist/lib/templates.d.ts +3 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +21 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/transcribeNative.d.ts +44 -0
- package/dist/lib/transcribeNative.d.ts.map +1 -0
- package/dist/lib/transcribeNative.js +53 -0
- package/dist/lib/transcribeNative.js.map +1 -0
- package/dist/lib/transcript.d.ts +68 -0
- package/dist/lib/transcript.d.ts.map +1 -0
- package/dist/lib/transcript.js +10 -0
- package/dist/lib/transcript.js.map +1 -0
- package/dist/lib/validate.d.ts +16 -0
- package/dist/lib/validate.d.ts.map +1 -0
- package/dist/lib/validate.js +155 -0
- package/dist/lib/validate.js.map +1 -0
- package/dist/llm/adapter.d.ts +33 -0
- package/dist/llm/adapter.d.ts.map +1 -0
- package/dist/llm/adapter.js +106 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/http.d.ts +9 -0
- package/dist/llm/http.d.ts.map +1 -0
- package/dist/llm/http.js +56 -0
- package/dist/llm/http.js.map +1 -0
- package/dist/llm/providers/anthropic.d.ts +14 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +66 -0
- package/dist/llm/providers/anthropic.js.map +1 -0
- package/dist/llm/providers/lmstudio.d.ts +7 -0
- package/dist/llm/providers/lmstudio.d.ts.map +1 -0
- package/dist/llm/providers/lmstudio.js +8 -0
- package/dist/llm/providers/lmstudio.js.map +1 -0
- package/dist/llm/providers/ollama.d.ts +12 -0
- package/dist/llm/providers/ollama.d.ts.map +1 -0
- package/dist/llm/providers/ollama.js +87 -0
- package/dist/llm/providers/ollama.js.map +1 -0
- package/dist/llm/providers/openai.d.ts +7 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +8 -0
- package/dist/llm/providers/openai.js.map +1 -0
- package/dist/llm/providers/openai_compatible.d.ts +18 -0
- package/dist/llm/providers/openai_compatible.d.ts.map +1 -0
- package/dist/llm/providers/openai_compatible.js +70 -0
- package/dist/llm/providers/openai_compatible.js.map +1 -0
- package/dist/llm/types.d.ts +60 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/logging.d.ts +22 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +58 -0
- package/dist/logging.js.map +1 -0
- package/dist/loops/embed_worker.d.ts +44 -0
- package/dist/loops/embed_worker.d.ts.map +1 -0
- package/dist/loops/embed_worker.js +144 -0
- package/dist/loops/embed_worker.js.map +1 -0
- package/dist/loops/eval_grader.d.ts +19 -0
- package/dist/loops/eval_grader.d.ts.map +1 -0
- package/dist/loops/eval_grader.js +22 -0
- package/dist/loops/eval_grader.js.map +1 -0
- package/dist/loops/ingest_watcher.d.ts +17 -0
- package/dist/loops/ingest_watcher.d.ts.map +1 -0
- package/dist/loops/ingest_watcher.js +66 -0
- package/dist/loops/ingest_watcher.js.map +1 -0
- package/dist/loops/legacy_worker.d.ts +26 -0
- package/dist/loops/legacy_worker.d.ts.map +1 -0
- package/dist/loops/legacy_worker.js +102 -0
- package/dist/loops/legacy_worker.js.map +1 -0
- package/dist/loops/supervisor.d.ts +71 -0
- package/dist/loops/supervisor.d.ts.map +1 -0
- package/dist/loops/supervisor.js +122 -0
- package/dist/loops/supervisor.js.map +1 -0
- package/dist/loops/synthesis.d.ts +31 -0
- package/dist/loops/synthesis.d.ts.map +1 -0
- package/dist/loops/synthesis.js +71 -0
- package/dist/loops/synthesis.js.map +1 -0
- package/dist/loops/transcribe_worker.d.ts +22 -0
- package/dist/loops/transcribe_worker.d.ts.map +1 -0
- package/dist/loops/transcribe_worker.js +77 -0
- package/dist/loops/transcribe_worker.js.map +1 -0
- package/dist/output.d.ts +8 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +26 -0
- package/dist/output.js.map +1 -0
- package/dist/render/transcript_md.d.ts +5 -0
- package/dist/render/transcript_md.d.ts.map +1 -0
- package/dist/render/transcript_md.js +14 -0
- package/dist/render/transcript_md.js.map +1 -0
- package/dist/router.d.ts +3 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +68 -0
- package/dist/router.js.map +1 -0
- package/dist/transcriber_client.d.ts +42 -0
- package/dist/transcriber_client.d.ts.map +1 -0
- package/dist/transcriber_client.js +72 -0
- package/dist/transcriber_client.js.map +1 -0
- package/package.json +45 -0
- package/templates/AGENTS.md +25 -0
- package/templates/config.toml +56 -0
- package/templates/sample-seed/codebook/desire-for-manual-override.md +8 -0
- package/templates/sample-seed/codebook/distrust-of-automation.md +8 -0
- package/templates/sample-seed/highlights/H-001.md +9 -0
- package/templates/sample-seed/highlights/H-002.md +9 -0
- package/templates/sample-seed/seed.md +17 -0
- package/templates/sample-seed/sessions/S001/transcript.json +74 -0
- package/templates/sample-seed/synthesis/themes/control-earns-trust.md +13 -0
- package/templates/seed.md +21 -0
package/dist/lib/snap.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { CompostError } from '../errors.js';
|
|
5
|
+
const FRAME_WIDTH = 640;
|
|
6
|
+
const FRAME_HEIGHT = 360;
|
|
7
|
+
/** Parse mm:ss, hh:mm:ss, or raw ms (integer) into milliseconds. */
|
|
8
|
+
export function parseTimestamp(input) {
|
|
9
|
+
const raw = input.trim();
|
|
10
|
+
if (/^\d+$/.test(raw))
|
|
11
|
+
return Number(raw);
|
|
12
|
+
const parts = raw.split(':');
|
|
13
|
+
if (parts.length === 2 || parts.length === 3) {
|
|
14
|
+
const nums = parts.map((p) => {
|
|
15
|
+
if (!/^\d+(\.\d+)?$/.test(p))
|
|
16
|
+
throw new CompostError('INVALID_INPUT', `Bad time component "${p}"`);
|
|
17
|
+
return Number(p);
|
|
18
|
+
});
|
|
19
|
+
let seconds = 0;
|
|
20
|
+
if (nums.length === 3)
|
|
21
|
+
seconds = nums[0] * 3600 + nums[1] * 60 + nums[2];
|
|
22
|
+
else
|
|
23
|
+
seconds = nums[0] * 60 + nums[1];
|
|
24
|
+
return Math.round(seconds * 1000);
|
|
25
|
+
}
|
|
26
|
+
throw new CompostError('INVALID_INPUT', `Unrecognized timestamp "${input}" (use ms, mm:ss, or hh:mm:ss)`);
|
|
27
|
+
}
|
|
28
|
+
function padMs(ms) {
|
|
29
|
+
return String(ms).padStart(9, '0');
|
|
30
|
+
}
|
|
31
|
+
function findSource(sessionDir) {
|
|
32
|
+
if (!existsSync(sessionDir))
|
|
33
|
+
return null;
|
|
34
|
+
const match = readdirSync(sessionDir).find((f) => f.startsWith('source.'));
|
|
35
|
+
return match !== undefined ? join(sessionDir, match) : null;
|
|
36
|
+
}
|
|
37
|
+
function hasVideoStream(path, runner) {
|
|
38
|
+
try {
|
|
39
|
+
const out = runner('ffprobe', [
|
|
40
|
+
'-v',
|
|
41
|
+
'error',
|
|
42
|
+
'-select_streams',
|
|
43
|
+
'v:0',
|
|
44
|
+
'-show_entries',
|
|
45
|
+
'stream=codec_type',
|
|
46
|
+
'-of',
|
|
47
|
+
'csv=p=0',
|
|
48
|
+
path,
|
|
49
|
+
]);
|
|
50
|
+
return out.trim().includes('video');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const defaultRunner = (cmd, args) => execFileSync(cmd, args, { encoding: 'utf8' });
|
|
57
|
+
export function snap(seedPath, sessionId, at, opts = {}) {
|
|
58
|
+
const runner = opts.runner ?? defaultRunner;
|
|
59
|
+
const atMs = parseTimestamp(at);
|
|
60
|
+
const sessionDir = join(seedPath, 'sessions', sessionId);
|
|
61
|
+
const source = findSource(sessionDir);
|
|
62
|
+
if (source === null) {
|
|
63
|
+
throw new CompostError('FILE_NOT_FOUND', `No source media in ${sessionDir}`);
|
|
64
|
+
}
|
|
65
|
+
if (!hasVideoStream(source, runner)) {
|
|
66
|
+
throw new CompostError('INVALID_INPUT', `${source} has no video stream; cannot snap a frame`);
|
|
67
|
+
}
|
|
68
|
+
const rel = `sessions/${sessionId}/frames/${padMs(atMs)}.jpg`;
|
|
69
|
+
const absPath = join(seedPath, rel);
|
|
70
|
+
const frameId = `FR-${padMs(atMs)}`;
|
|
71
|
+
if (existsSync(absPath)) {
|
|
72
|
+
return { session_id: sessionId, frame_id: frameId, at_ms: atMs, path: rel, existed: true };
|
|
73
|
+
}
|
|
74
|
+
mkdirSync(join(sessionDir, 'frames'), { recursive: true });
|
|
75
|
+
runner('ffmpeg', [
|
|
76
|
+
'-y',
|
|
77
|
+
'-ss',
|
|
78
|
+
(atMs / 1000).toFixed(3),
|
|
79
|
+
'-i',
|
|
80
|
+
source,
|
|
81
|
+
'-frames:v',
|
|
82
|
+
'1',
|
|
83
|
+
'-vf',
|
|
84
|
+
`scale=${FRAME_WIDTH}:${FRAME_HEIGHT}`,
|
|
85
|
+
'-q:v',
|
|
86
|
+
'4',
|
|
87
|
+
absPath,
|
|
88
|
+
]);
|
|
89
|
+
if (!existsSync(absPath)) {
|
|
90
|
+
throw new CompostError('IO_ERROR', `ffmpeg did not produce a frame at ${atMs}ms`);
|
|
91
|
+
}
|
|
92
|
+
indexFrame(sessionDir, { id: frameId, at_ms: atMs, path: rel, trigger: 'manual' });
|
|
93
|
+
return { session_id: sessionId, frame_id: frameId, at_ms: atMs, path: rel, existed: false };
|
|
94
|
+
}
|
|
95
|
+
/** Append a frame entry to transcript.json frames[] when present, otherwise to
|
|
96
|
+
* a frames.json sidecar that the transcriber merges on the next run. */
|
|
97
|
+
function indexFrame(sessionDir, entry) {
|
|
98
|
+
const transcriptPath = join(sessionDir, 'transcript.json');
|
|
99
|
+
if (existsSync(transcriptPath)) {
|
|
100
|
+
const t = JSON.parse(readFileSync(transcriptPath, 'utf8'));
|
|
101
|
+
t.frames = t.frames ?? [];
|
|
102
|
+
if (!t.frames.some((f) => f.id === entry.id))
|
|
103
|
+
t.frames.push(entry);
|
|
104
|
+
writeFileSync(transcriptPath, `${JSON.stringify(t, null, 2)}\n`, 'utf8');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const sidecar = join(sessionDir, 'frames.json');
|
|
108
|
+
const frames = existsSync(sidecar)
|
|
109
|
+
? JSON.parse(readFileSync(sidecar, 'utf8'))
|
|
110
|
+
: [];
|
|
111
|
+
if (!frames.some((f) => f.id === entry.id))
|
|
112
|
+
frames.push(entry);
|
|
113
|
+
writeFileSync(sidecar, `${JSON.stringify(frames, null, 2)}\n`, 'utf8');
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=snap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snap.js","sourceRoot":"","sources":["../../src/lib/snap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface SessionCounts {
|
|
2
|
+
total: number;
|
|
3
|
+
transcribed: number;
|
|
4
|
+
queued: number;
|
|
5
|
+
inbox: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SeedCounts {
|
|
8
|
+
sessions: SessionCounts;
|
|
9
|
+
highlights: number;
|
|
10
|
+
codes: number;
|
|
11
|
+
themes: number;
|
|
12
|
+
frames: number;
|
|
13
|
+
insights: number;
|
|
14
|
+
legacy_assets: number;
|
|
15
|
+
}
|
|
16
|
+
export interface SeedStatus {
|
|
17
|
+
name: string;
|
|
18
|
+
path: string;
|
|
19
|
+
status: string | null;
|
|
20
|
+
owners: string[];
|
|
21
|
+
created_at: string | null;
|
|
22
|
+
counts: SeedCounts;
|
|
23
|
+
/** Non-canonical content found under the seed (e.g. legacy folders that
|
|
24
|
+
* survived migration). Empty when the seed is clean. */
|
|
25
|
+
warnings: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface StatusSnapshot {
|
|
28
|
+
schema_version: '1.0';
|
|
29
|
+
generated_at: string;
|
|
30
|
+
root: string;
|
|
31
|
+
seeds: SeedStatus[];
|
|
32
|
+
}
|
|
33
|
+
export interface StatusOptions {
|
|
34
|
+
cwd?: string;
|
|
35
|
+
seed?: string;
|
|
36
|
+
now?: () => Date;
|
|
37
|
+
}
|
|
38
|
+
export declare function gatherStatus(opts?: StatusOptions): StatusSnapshot;
|
|
39
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/lib/status.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,UAAU,CAAA;IAClB;4DACwD;IACxD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,KAAK,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,aAAkB,GAAG,cAAc,CAgCrE"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { CompostError } from '../errors.js';
|
|
4
|
+
import { isCanonicalSession } from './canonicalSessions.js';
|
|
5
|
+
export function gatherStatus(opts = {}) {
|
|
6
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
7
|
+
const now = (opts.now ?? (() => new Date()))();
|
|
8
|
+
const root = resolve(cwd, 'Seeds');
|
|
9
|
+
if (!existsSync(root)) {
|
|
10
|
+
throw new CompostError('NOT_IN_SEED', `No Seeds/ directory at ${root}. Run \`compost init <name>\` first.`);
|
|
11
|
+
}
|
|
12
|
+
const seedNames = readdirSync(root).filter((entry) => {
|
|
13
|
+
if (entry.startsWith('.'))
|
|
14
|
+
return false;
|
|
15
|
+
return statSync(join(root, entry)).isDirectory();
|
|
16
|
+
});
|
|
17
|
+
const filtered = opts.seed !== undefined ? seedNames.filter((n) => n === opts.seed) : seedNames;
|
|
18
|
+
if (opts.seed !== undefined && filtered.length === 0) {
|
|
19
|
+
throw new CompostError('NOT_IN_SEED', `Seed "${opts.seed}" not found under ${root}`);
|
|
20
|
+
}
|
|
21
|
+
filtered.sort();
|
|
22
|
+
const seeds = filtered.map((name) => readSeed(name, join(root, name)));
|
|
23
|
+
return {
|
|
24
|
+
schema_version: '1.0',
|
|
25
|
+
generated_at: now.toISOString(),
|
|
26
|
+
root,
|
|
27
|
+
seeds,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function readSeed(name, path) {
|
|
31
|
+
const frontmatter = readFrontmatter(join(path, 'seed.md'));
|
|
32
|
+
const warnings = [];
|
|
33
|
+
return {
|
|
34
|
+
name,
|
|
35
|
+
path,
|
|
36
|
+
status: frontmatter.status ?? null,
|
|
37
|
+
owners: frontmatter.owners ?? [],
|
|
38
|
+
created_at: frontmatter.created_at ?? null,
|
|
39
|
+
counts: {
|
|
40
|
+
sessions: countSessions(join(path, 'sessions'), warnings),
|
|
41
|
+
highlights: countMarkdown(join(path, 'highlights')),
|
|
42
|
+
codes: countMarkdown(join(path, 'codebook')),
|
|
43
|
+
themes: countMarkdown(join(path, 'synthesis', 'themes')),
|
|
44
|
+
insights: countMarkdown(join(path, 'synthesis', 'insights')),
|
|
45
|
+
frames: countFrames(join(path, 'sessions')),
|
|
46
|
+
legacy_assets: countFiles(join(path, 'legacy')),
|
|
47
|
+
},
|
|
48
|
+
warnings,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function countSessions(sessionsDir, warnings) {
|
|
52
|
+
const counts = { total: 0, transcribed: 0, queued: 0, inbox: 0 };
|
|
53
|
+
if (!existsSync(sessionsDir))
|
|
54
|
+
return counts;
|
|
55
|
+
for (const entry of readdirSync(sessionsDir)) {
|
|
56
|
+
const abs = join(sessionsDir, entry);
|
|
57
|
+
if (!statSync(abs).isDirectory())
|
|
58
|
+
continue;
|
|
59
|
+
if (entry === '_inbox') {
|
|
60
|
+
counts.inbox = readdirSync(abs).filter((f) => !f.startsWith('.')).length;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (!isCanonicalSession(abs, entry)) {
|
|
64
|
+
warnings.push(`sessions/${entry}: not a canonical session shape (skipped)`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
counts.total += 1;
|
|
68
|
+
if (existsSync(join(abs, 'transcript.json')))
|
|
69
|
+
counts.transcribed += 1;
|
|
70
|
+
else
|
|
71
|
+
counts.queued += 1;
|
|
72
|
+
}
|
|
73
|
+
return counts;
|
|
74
|
+
}
|
|
75
|
+
function countMarkdown(dir) {
|
|
76
|
+
if (!existsSync(dir))
|
|
77
|
+
return 0;
|
|
78
|
+
let total = 0;
|
|
79
|
+
for (const entry of readdirSync(dir)) {
|
|
80
|
+
if (entry.startsWith('.'))
|
|
81
|
+
continue;
|
|
82
|
+
const abs = join(dir, entry);
|
|
83
|
+
const s = statSync(abs);
|
|
84
|
+
if (s.isFile() && entry.endsWith('.md') && entry.toLowerCase() !== 'readme.md')
|
|
85
|
+
total += 1;
|
|
86
|
+
else if (s.isDirectory())
|
|
87
|
+
total += countMarkdown(abs);
|
|
88
|
+
}
|
|
89
|
+
return total;
|
|
90
|
+
}
|
|
91
|
+
function countFiles(dir) {
|
|
92
|
+
if (!existsSync(dir))
|
|
93
|
+
return 0;
|
|
94
|
+
let total = 0;
|
|
95
|
+
for (const entry of readdirSync(dir)) {
|
|
96
|
+
if (entry.startsWith('.'))
|
|
97
|
+
continue;
|
|
98
|
+
const abs = join(dir, entry);
|
|
99
|
+
const s = statSync(abs);
|
|
100
|
+
if (s.isFile())
|
|
101
|
+
total += 1;
|
|
102
|
+
else if (s.isDirectory())
|
|
103
|
+
total += countFiles(abs);
|
|
104
|
+
}
|
|
105
|
+
return total;
|
|
106
|
+
}
|
|
107
|
+
function countFrames(sessionsDir) {
|
|
108
|
+
if (!existsSync(sessionsDir))
|
|
109
|
+
return 0;
|
|
110
|
+
let total = 0;
|
|
111
|
+
for (const entry of readdirSync(sessionsDir)) {
|
|
112
|
+
if (entry === '_inbox')
|
|
113
|
+
continue;
|
|
114
|
+
const framesDir = join(sessionsDir, entry, 'frames');
|
|
115
|
+
if (!existsSync(framesDir))
|
|
116
|
+
continue;
|
|
117
|
+
total += readdirSync(framesDir).filter((f) => /\.(jpg|jpeg|png)$/i.test(f)).length;
|
|
118
|
+
}
|
|
119
|
+
return total;
|
|
120
|
+
}
|
|
121
|
+
function readFrontmatter(path) {
|
|
122
|
+
if (!existsSync(path))
|
|
123
|
+
return {};
|
|
124
|
+
const content = readFileSync(path, 'utf8');
|
|
125
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
126
|
+
if (match === null)
|
|
127
|
+
return {};
|
|
128
|
+
return parseSimpleYaml(match[1] ?? '');
|
|
129
|
+
}
|
|
130
|
+
function parseSimpleYaml(yaml) {
|
|
131
|
+
const out = {};
|
|
132
|
+
const lines = yaml.split('\n');
|
|
133
|
+
for (const line of lines) {
|
|
134
|
+
const m = line.match(/^([A-Za-z_][A-Za-z0-9_-]*):\s*(.*)$/);
|
|
135
|
+
if (m === null)
|
|
136
|
+
continue;
|
|
137
|
+
const key = m[1];
|
|
138
|
+
const value = (m[2] ?? '').trim();
|
|
139
|
+
if (key === undefined)
|
|
140
|
+
continue;
|
|
141
|
+
if (key === 'status' && value.length > 0) {
|
|
142
|
+
out.status = stripQuotes(value);
|
|
143
|
+
}
|
|
144
|
+
else if (key === 'created_at' && value.length > 0) {
|
|
145
|
+
out.created_at = stripQuotes(value);
|
|
146
|
+
}
|
|
147
|
+
else if (key === 'owners') {
|
|
148
|
+
out.owners = parseOwners(value);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
function stripQuotes(s) {
|
|
154
|
+
if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
|
|
155
|
+
return s.slice(1, -1);
|
|
156
|
+
}
|
|
157
|
+
return s;
|
|
158
|
+
}
|
|
159
|
+
function parseOwners(value) {
|
|
160
|
+
const trimmed = value.trim();
|
|
161
|
+
if (trimmed.length === 0 || trimmed === '[]')
|
|
162
|
+
return [];
|
|
163
|
+
const inline = trimmed.match(/^\[(.*)\]$/);
|
|
164
|
+
const body = inline?.[1];
|
|
165
|
+
if (body !== undefined) {
|
|
166
|
+
return body
|
|
167
|
+
.split(',')
|
|
168
|
+
.map((part) => stripQuotes(part.trim()))
|
|
169
|
+
.filter((s) => s.length > 0);
|
|
170
|
+
}
|
|
171
|
+
// Flow-style only for v1 — block-style "- name" lists not yet supported.
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/lib/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface TermSuggestion {
|
|
2
|
+
term_id: string;
|
|
3
|
+
phrase: string;
|
|
4
|
+
count: number;
|
|
5
|
+
}
|
|
6
|
+
/** Extract candidate glossary terms: multiword phrases (2-3 tokens) that recur
|
|
7
|
+
* >= minCount times across utterances. Phrases are dropped when ANY token is
|
|
8
|
+
* a stopword (grammatical glue / filler) OR contains a digit (timestamp noise). */
|
|
9
|
+
export declare function suggestTerms(utterances: Array<{
|
|
10
|
+
text: string;
|
|
11
|
+
}>, opts?: {
|
|
12
|
+
minCount?: number;
|
|
13
|
+
}): TermSuggestion[];
|
|
14
|
+
export interface TagResult {
|
|
15
|
+
suggested: TermSuggestion[];
|
|
16
|
+
applied: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Suggest terms; with apply=true, write them to glossary/glossary.md and emit
|
|
19
|
+
* agent create events. */
|
|
20
|
+
export declare function tagSeed(seedPath: string, utterances: Array<{
|
|
21
|
+
text: string;
|
|
22
|
+
}>, opts?: {
|
|
23
|
+
apply?: boolean;
|
|
24
|
+
minCount?: number;
|
|
25
|
+
}): TagResult;
|
|
26
|
+
//# sourceMappingURL=tagcode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tagcode.d.ts","sourceRoot":"","sources":["../../src/lib/tagcode.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAsKD;;mFAEmF;AACnF,wBAAgB,YAAY,CAC1B,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnC,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,cAAc,EAAE,CA0BlB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;0BAC0B;AAC1B,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,SAAS,CA8BX"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { emitAgentCreate, openSeedEvents } from './events.js';
|
|
4
|
+
// `compost tag` / `compost code` (#49): suggest (default) or --apply glossary
|
|
5
|
+
// terms and codes. Term suggestion is a deterministic recurring-noun-phrase
|
|
6
|
+
// extractor; code suggestion reuses the similarity scanner. Suggestions are
|
|
7
|
+
// AI/agent [draft] events until applied/endorsed.
|
|
8
|
+
const AGENT = 'tagger';
|
|
9
|
+
const VERSION = '0.1.0';
|
|
10
|
+
// Function words, modals, pronouns, common conversational fillers (EN + ES) —
|
|
11
|
+
// any phrase touching one of these is dropped. Scoped to grammatical glue and
|
|
12
|
+
// filler; content nouns/verbs/adjectives don't appear here, so legitimate noun
|
|
13
|
+
// phrases ("manual override", "alerta automática") survive (#171). The pre-fix
|
|
14
|
+
// list was 24 tokens and only dropped *all-stopword* phrases, so "you know"
|
|
15
|
+
// (64), "and like" (40), "right like" (38) leaked into glossary suggestions.
|
|
16
|
+
const STOPWORDS = new Set([
|
|
17
|
+
// EN — fillers, modals, pronouns, common helpers
|
|
18
|
+
'the',
|
|
19
|
+
'and',
|
|
20
|
+
'but',
|
|
21
|
+
'for',
|
|
22
|
+
'with',
|
|
23
|
+
'that',
|
|
24
|
+
'this',
|
|
25
|
+
'these',
|
|
26
|
+
'those',
|
|
27
|
+
'you',
|
|
28
|
+
'your',
|
|
29
|
+
'yours',
|
|
30
|
+
'his',
|
|
31
|
+
'her',
|
|
32
|
+
'hers',
|
|
33
|
+
'its',
|
|
34
|
+
'our',
|
|
35
|
+
'ours',
|
|
36
|
+
'they',
|
|
37
|
+
'their',
|
|
38
|
+
'them',
|
|
39
|
+
'theirs',
|
|
40
|
+
'mine',
|
|
41
|
+
'ours',
|
|
42
|
+
'are',
|
|
43
|
+
'was',
|
|
44
|
+
'were',
|
|
45
|
+
'been',
|
|
46
|
+
'being',
|
|
47
|
+
'have',
|
|
48
|
+
'has',
|
|
49
|
+
'had',
|
|
50
|
+
'having',
|
|
51
|
+
'will',
|
|
52
|
+
'would',
|
|
53
|
+
'could',
|
|
54
|
+
'should',
|
|
55
|
+
'can',
|
|
56
|
+
'may',
|
|
57
|
+
'might',
|
|
58
|
+
'must',
|
|
59
|
+
'into',
|
|
60
|
+
'onto',
|
|
61
|
+
'about',
|
|
62
|
+
'from',
|
|
63
|
+
'over',
|
|
64
|
+
'under',
|
|
65
|
+
'after',
|
|
66
|
+
'before',
|
|
67
|
+
'like',
|
|
68
|
+
'just',
|
|
69
|
+
'kind',
|
|
70
|
+
'sort',
|
|
71
|
+
'know',
|
|
72
|
+
'mean',
|
|
73
|
+
'think',
|
|
74
|
+
'say',
|
|
75
|
+
'said',
|
|
76
|
+
'got',
|
|
77
|
+
'get',
|
|
78
|
+
'going',
|
|
79
|
+
'gone',
|
|
80
|
+
'want',
|
|
81
|
+
'need',
|
|
82
|
+
'see',
|
|
83
|
+
'look',
|
|
84
|
+
'take',
|
|
85
|
+
'make',
|
|
86
|
+
'made',
|
|
87
|
+
'come',
|
|
88
|
+
'came',
|
|
89
|
+
'well',
|
|
90
|
+
'okay',
|
|
91
|
+
'right',
|
|
92
|
+
'yeah',
|
|
93
|
+
'really',
|
|
94
|
+
'actually',
|
|
95
|
+
'maybe',
|
|
96
|
+
// ES — equivalents
|
|
97
|
+
'una',
|
|
98
|
+
'unos',
|
|
99
|
+
'unas',
|
|
100
|
+
'los',
|
|
101
|
+
'las',
|
|
102
|
+
'del',
|
|
103
|
+
'por',
|
|
104
|
+
'con',
|
|
105
|
+
'sin',
|
|
106
|
+
'que',
|
|
107
|
+
'qué',
|
|
108
|
+
'para',
|
|
109
|
+
'pero',
|
|
110
|
+
'sino',
|
|
111
|
+
'como',
|
|
112
|
+
'más',
|
|
113
|
+
'muy',
|
|
114
|
+
'sus',
|
|
115
|
+
'les',
|
|
116
|
+
'nos',
|
|
117
|
+
'mis',
|
|
118
|
+
'tus',
|
|
119
|
+
'este',
|
|
120
|
+
'esta',
|
|
121
|
+
'estos',
|
|
122
|
+
'estas',
|
|
123
|
+
'eso',
|
|
124
|
+
'esa',
|
|
125
|
+
'esos',
|
|
126
|
+
'esas',
|
|
127
|
+
'ese',
|
|
128
|
+
'todo',
|
|
129
|
+
'todos',
|
|
130
|
+
'toda',
|
|
131
|
+
'todas',
|
|
132
|
+
'ser',
|
|
133
|
+
'estar',
|
|
134
|
+
'son',
|
|
135
|
+
'soy',
|
|
136
|
+
'eres',
|
|
137
|
+
'era',
|
|
138
|
+
'eran',
|
|
139
|
+
'fue',
|
|
140
|
+
'fueron',
|
|
141
|
+
'está',
|
|
142
|
+
'están',
|
|
143
|
+
'estaba',
|
|
144
|
+
'estaban',
|
|
145
|
+
'hay',
|
|
146
|
+
'había',
|
|
147
|
+
'hubo',
|
|
148
|
+
'haya',
|
|
149
|
+
'voy',
|
|
150
|
+
'vas',
|
|
151
|
+
'vamos',
|
|
152
|
+
'van',
|
|
153
|
+
'sea',
|
|
154
|
+
'sean',
|
|
155
|
+
'pues',
|
|
156
|
+
'bueno',
|
|
157
|
+
'vale',
|
|
158
|
+
'claro',
|
|
159
|
+
'entonces',
|
|
160
|
+
'así',
|
|
161
|
+
'bien',
|
|
162
|
+
'también',
|
|
163
|
+
'tampoco',
|
|
164
|
+
'cuando',
|
|
165
|
+
'donde',
|
|
166
|
+
'cómo',
|
|
167
|
+
]);
|
|
168
|
+
// Pre-fix, "hour minutes seconds1"(78) topped the list — utterance text leaked
|
|
169
|
+
// raw `.srt`-style timecodes. Any candidate token containing a digit is
|
|
170
|
+
// suppressed: that's never a content noun phrase.
|
|
171
|
+
const TOKEN_HAS_DIGIT_RE = /\d/;
|
|
172
|
+
/** Extract candidate glossary terms: multiword phrases (2-3 tokens) that recur
|
|
173
|
+
* >= minCount times across utterances. Phrases are dropped when ANY token is
|
|
174
|
+
* a stopword (grammatical glue / filler) OR contains a digit (timestamp noise). */
|
|
175
|
+
export function suggestTerms(utterances, opts = {}) {
|
|
176
|
+
const minCount = opts.minCount ?? 2;
|
|
177
|
+
const counts = new Map();
|
|
178
|
+
for (const u of utterances) {
|
|
179
|
+
const tokens = u.text
|
|
180
|
+
.toLowerCase()
|
|
181
|
+
.replace(/[^\p{L}\p{N}\s]/gu, ' ')
|
|
182
|
+
.split(/\s+/)
|
|
183
|
+
.filter((t) => t.length > 2);
|
|
184
|
+
for (let n = 2; n <= 3; n++) {
|
|
185
|
+
for (let i = 0; i + n <= tokens.length; i++) {
|
|
186
|
+
const gram = tokens.slice(i, i + n);
|
|
187
|
+
// Drop the candidate when ANY token is a stopword or has a digit —
|
|
188
|
+
// pre-fix this was `every` (drop only when ALL tokens were stopwords),
|
|
189
|
+
// which let "you know" / "and like" through because of the non-stopword
|
|
190
|
+
// partner. Content noun phrases never contain function words or digits.
|
|
191
|
+
if (gram.some((t) => STOPWORDS.has(t) || TOKEN_HAS_DIGIT_RE.test(t)))
|
|
192
|
+
continue;
|
|
193
|
+
const phrase = gram.join(' ');
|
|
194
|
+
counts.set(phrase, (counts.get(phrase) ?? 0) + 1);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return [...counts.entries()]
|
|
199
|
+
.filter(([, c]) => c >= minCount)
|
|
200
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
201
|
+
.map(([phrase, count]) => ({ term_id: `T-${phrase.replace(/\s+/g, '-')}`, phrase, count }));
|
|
202
|
+
}
|
|
203
|
+
/** Suggest terms; with apply=true, write them to glossary/glossary.md and emit
|
|
204
|
+
* agent create events. */
|
|
205
|
+
export function tagSeed(seedPath, utterances, opts = {}) {
|
|
206
|
+
const suggested = suggestTerms(utterances, opts.minCount !== undefined ? { minCount: opts.minCount } : {});
|
|
207
|
+
if (opts.apply !== true)
|
|
208
|
+
return { suggested, applied: false };
|
|
209
|
+
const glossaryDir = join(seedPath, 'glossary');
|
|
210
|
+
mkdirSync(glossaryDir, { recursive: true });
|
|
211
|
+
const glossary = join(glossaryDir, 'glossary.md');
|
|
212
|
+
if (!existsSync(glossary))
|
|
213
|
+
writeFileSync(glossary, '# Glossary\n\n', 'utf8');
|
|
214
|
+
const events = openSeedEvents(seedPath);
|
|
215
|
+
try {
|
|
216
|
+
for (const t of suggested) {
|
|
217
|
+
appendFileSync(glossary, `- **${t.phrase}** (\`${t.term_id}\`) — _${t.count} mentions; define me_\n`, 'utf8');
|
|
218
|
+
emitAgentCreate(events, {
|
|
219
|
+
artifactKind: 'term',
|
|
220
|
+
initialState: { term_id: t.term_id, phrase: t.phrase, count: t.count, status: 'draft' },
|
|
221
|
+
agentName: AGENT,
|
|
222
|
+
agentVersion: VERSION,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
events.close();
|
|
228
|
+
}
|
|
229
|
+
return { suggested, applied: true };
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=tagcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tagcode.js","sourceRoot":"","sources":["../../src/lib/tagcode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQ7E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
// From cli/src/lib/templates.ts the templates live at ../../templates.
|
|
6
|
+
// From cli/dist/lib/templates.js the same relative path resolves to
|
|
7
|
+
// cli/templates (templates/ is a sibling of both src/ and dist/).
|
|
8
|
+
const TEMPLATES_ROOT = join(__dirname, '..', '..', 'templates');
|
|
9
|
+
export function loadTemplate(name) {
|
|
10
|
+
return readFileSync(join(TEMPLATES_ROOT, name), 'utf8');
|
|
11
|
+
}
|
|
12
|
+
export function render(template, vars) {
|
|
13
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
|
|
14
|
+
const value = vars[key];
|
|
15
|
+
if (value === undefined) {
|
|
16
|
+
throw new Error(`render: template references unknown variable "${key}"`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,uEAAuE;AACvE,oEAAoE;AACpE,kEAAkE;AAClE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;AAE/D,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,QAAgB,EAAE,IAA4B;IACnE,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,GAAG,GAAG,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC"}
|