@tenphi/akno 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +83 -0
  2. package/README.md +46 -0
  3. package/dist/args.d.ts +18 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +92 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +142 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/commands/adopt-cmd.d.ts +2 -0
  12. package/dist/commands/adopt-cmd.d.ts.map +1 -0
  13. package/dist/commands/adopt-cmd.js +61 -0
  14. package/dist/commands/adopt-cmd.js.map +1 -0
  15. package/dist/commands/answer-cmd.d.ts +2 -0
  16. package/dist/commands/answer-cmd.d.ts.map +1 -0
  17. package/dist/commands/answer-cmd.js +150 -0
  18. package/dist/commands/answer-cmd.js.map +1 -0
  19. package/dist/commands/bench-cmd.d.ts +4 -0
  20. package/dist/commands/bench-cmd.d.ts.map +1 -0
  21. package/dist/commands/bench-cmd.js +1542 -0
  22. package/dist/commands/bench-cmd.js.map +1 -0
  23. package/dist/commands/config-cmd.d.ts +7 -0
  24. package/dist/commands/config-cmd.d.ts.map +1 -0
  25. package/dist/commands/config-cmd.js +80 -0
  26. package/dist/commands/config-cmd.js.map +1 -0
  27. package/dist/commands/context-cmd.d.ts +2 -0
  28. package/dist/commands/context-cmd.d.ts.map +1 -0
  29. package/dist/commands/context-cmd.js +130 -0
  30. package/dist/commands/context-cmd.js.map +1 -0
  31. package/dist/commands/doctor-cmd.d.ts +2 -0
  32. package/dist/commands/doctor-cmd.d.ts.map +1 -0
  33. package/dist/commands/doctor-cmd.js +198 -0
  34. package/dist/commands/doctor-cmd.js.map +1 -0
  35. package/dist/commands/dream-cmd.d.ts +26 -0
  36. package/dist/commands/dream-cmd.d.ts.map +1 -0
  37. package/dist/commands/dream-cmd.js +1167 -0
  38. package/dist/commands/dream-cmd.js.map +1 -0
  39. package/dist/commands/dream-model-status.d.ts +5 -0
  40. package/dist/commands/dream-model-status.d.ts.map +1 -0
  41. package/dist/commands/dream-model-status.js +33 -0
  42. package/dist/commands/dream-model-status.js.map +1 -0
  43. package/dist/commands/dream-notifications.d.ts +24 -0
  44. package/dist/commands/dream-notifications.d.ts.map +1 -0
  45. package/dist/commands/dream-notifications.js +168 -0
  46. package/dist/commands/dream-notifications.js.map +1 -0
  47. package/dist/commands/dream-schedule.d.ts +55 -0
  48. package/dist/commands/dream-schedule.d.ts.map +1 -0
  49. package/dist/commands/dream-schedule.js +160 -0
  50. package/dist/commands/dream-schedule.js.map +1 -0
  51. package/dist/commands/folder-cmd.d.ts +2 -0
  52. package/dist/commands/folder-cmd.d.ts.map +1 -0
  53. package/dist/commands/folder-cmd.js +84 -0
  54. package/dist/commands/folder-cmd.js.map +1 -0
  55. package/dist/commands/graph-cmd.d.ts +2 -0
  56. package/dist/commands/graph-cmd.d.ts.map +1 -0
  57. package/dist/commands/graph-cmd.js +126 -0
  58. package/dist/commands/graph-cmd.js.map +1 -0
  59. package/dist/commands/inbox-cmd.d.ts +2 -0
  60. package/dist/commands/inbox-cmd.d.ts.map +1 -0
  61. package/dist/commands/inbox-cmd.js +69 -0
  62. package/dist/commands/inbox-cmd.js.map +1 -0
  63. package/dist/commands/index-cmd.d.ts +2 -0
  64. package/dist/commands/index-cmd.d.ts.map +1 -0
  65. package/dist/commands/index-cmd.js +102 -0
  66. package/dist/commands/index-cmd.js.map +1 -0
  67. package/dist/commands/ingest-cmd.d.ts +2 -0
  68. package/dist/commands/ingest-cmd.d.ts.map +1 -0
  69. package/dist/commands/ingest-cmd.js +167 -0
  70. package/dist/commands/ingest-cmd.js.map +1 -0
  71. package/dist/commands/init-cmd.d.ts +292 -0
  72. package/dist/commands/init-cmd.d.ts.map +1 -0
  73. package/dist/commands/init-cmd.js +476 -0
  74. package/dist/commands/init-cmd.js.map +1 -0
  75. package/dist/commands/init-prompts.d.ts +51 -0
  76. package/dist/commands/init-prompts.d.ts.map +1 -0
  77. package/dist/commands/init-prompts.js +192 -0
  78. package/dist/commands/init-prompts.js.map +1 -0
  79. package/dist/commands/list-cmd.d.ts +2 -0
  80. package/dist/commands/list-cmd.d.ts.map +1 -0
  81. package/dist/commands/list-cmd.js +77 -0
  82. package/dist/commands/list-cmd.js.map +1 -0
  83. package/dist/commands/maintenance-policy-output.d.ts +4 -0
  84. package/dist/commands/maintenance-policy-output.d.ts.map +1 -0
  85. package/dist/commands/maintenance-policy-output.js +72 -0
  86. package/dist/commands/maintenance-policy-output.js.map +1 -0
  87. package/dist/commands/mutate-cmd.d.ts +5 -0
  88. package/dist/commands/mutate-cmd.d.ts.map +1 -0
  89. package/dist/commands/mutate-cmd.js +224 -0
  90. package/dist/commands/mutate-cmd.js.map +1 -0
  91. package/dist/commands/plan-cmd.d.ts +9 -0
  92. package/dist/commands/plan-cmd.d.ts.map +1 -0
  93. package/dist/commands/plan-cmd.js +411 -0
  94. package/dist/commands/plan-cmd.js.map +1 -0
  95. package/dist/commands/read-cmd.d.ts +2 -0
  96. package/dist/commands/read-cmd.d.ts.map +1 -0
  97. package/dist/commands/read-cmd.js +89 -0
  98. package/dist/commands/read-cmd.js.map +1 -0
  99. package/dist/commands/recall-cmd.d.ts +2 -0
  100. package/dist/commands/recall-cmd.d.ts.map +1 -0
  101. package/dist/commands/recall-cmd.js +176 -0
  102. package/dist/commands/recall-cmd.js.map +1 -0
  103. package/dist/commands/redeploy-cmd.d.ts +43 -0
  104. package/dist/commands/redeploy-cmd.d.ts.map +1 -0
  105. package/dist/commands/redeploy-cmd.js +270 -0
  106. package/dist/commands/redeploy-cmd.js.map +1 -0
  107. package/dist/commands/rules-cmd.d.ts +2 -0
  108. package/dist/commands/rules-cmd.d.ts.map +1 -0
  109. package/dist/commands/rules-cmd.js +72 -0
  110. package/dist/commands/rules-cmd.js.map +1 -0
  111. package/dist/commands/serve-cmd.d.ts +23 -0
  112. package/dist/commands/serve-cmd.d.ts.map +1 -0
  113. package/dist/commands/serve-cmd.js +415 -0
  114. package/dist/commands/serve-cmd.js.map +1 -0
  115. package/dist/commands/timeline-cmd.d.ts +2 -0
  116. package/dist/commands/timeline-cmd.d.ts.map +1 -0
  117. package/dist/commands/timeline-cmd.js +67 -0
  118. package/dist/commands/timeline-cmd.js.map +1 -0
  119. package/dist/commands/write-cmd.d.ts +49 -0
  120. package/dist/commands/write-cmd.d.ts.map +1 -0
  121. package/dist/commands/write-cmd.js +269 -0
  122. package/dist/commands/write-cmd.js.map +1 -0
  123. package/dist/ops-handle.d.ts +67 -0
  124. package/dist/ops-handle.d.ts.map +1 -0
  125. package/dist/ops-handle.js +196 -0
  126. package/dist/ops-handle.js.map +1 -0
  127. package/dist/output.d.ts +28 -0
  128. package/dist/output.d.ts.map +1 -0
  129. package/dist/output.js +87 -0
  130. package/dist/output.js.map +1 -0
  131. package/dist/serve/http.d.ts +19 -0
  132. package/dist/serve/http.d.ts.map +1 -0
  133. package/dist/serve/http.js +135 -0
  134. package/dist/serve/http.js.map +1 -0
  135. package/dist/serve/mcp.d.ts +21 -0
  136. package/dist/serve/mcp.d.ts.map +1 -0
  137. package/dist/serve/mcp.js +79 -0
  138. package/dist/serve/mcp.js.map +1 -0
  139. package/dist/serve/socket.d.ts +15 -0
  140. package/dist/serve/socket.d.ts.map +1 -0
  141. package/dist/serve/socket.js +311 -0
  142. package/dist/serve/socket.js.map +1 -0
  143. package/dist/version.d.ts +2 -0
  144. package/dist/version.d.ts.map +1 -0
  145. package/dist/version.js +15 -0
  146. package/dist/version.js.map +1 -0
  147. package/package.json +40 -0
@@ -0,0 +1,84 @@
1
+ import { openOptionsFrom, parse } from "../args.js";
2
+ import { heading, json, kv, line, statusLabel, style } from "../output.js";
3
+ import { resolveOps } from "../ops-handle.js";
4
+ const FOLDER_HELP = `akno folder <path> --description <text> [options]
5
+
6
+ Declare a folder and what belongs in it. The rule is written to
7
+ <akno_path>/akno.jsonc, so the taxonomy travels with the notes.
8
+
9
+ Never gated: nothing here waits on approval. What it asks for is a sentence —
10
+ \`description\` is what the next caller reads before filing a page there.
11
+
12
+ --description <text> What belongs here. Required.
13
+ --role <r> knowledge | source | inference | ignored. Default knowledge.
14
+ --remember <m> integrate | deny. Knowledge defaults to integrate; other roles deny.
15
+ --type <t> Default page type for this folder.
16
+ --ingest <mode> page | document | file | auto | ignore.
17
+ --rank <n> 0..2, multiplied into the recall score.
18
+ --route Make this an inbox: arrivals are named and moved out of it.
19
+ --actor <who> user | agent.
20
+ --dry-run Report the rule; write nothing.
21
+ --json`;
22
+ export async function folderCommand(argv) {
23
+ const { values, positionals } = parse(argv, {
24
+ description: { type: 'string' },
25
+ role: { type: 'string' },
26
+ remember: { type: 'string' },
27
+ type: { type: 'string' },
28
+ ingest: { type: 'string' },
29
+ rank: { type: 'string' },
30
+ route: { type: 'boolean', default: false },
31
+ actor: { type: 'string' },
32
+ 'dry-run': { type: 'boolean', default: false },
33
+ });
34
+ if (values.help || positionals.length === 0) {
35
+ line(FOLDER_HELP);
36
+ return positionals.length === 0 && !values.help ? 1 : 0;
37
+ }
38
+ if (!values.description) {
39
+ line(style.red(' --description is required. A folder nothing can explain is the thing this prevents.'));
40
+ return 1;
41
+ }
42
+ const handle = await resolveOps(values, openOptionsFrom(values), {
43
+ write: true,
44
+ ...(values.actor === 'user' || values.actor === 'agent' ? { actor: values.actor } : {}),
45
+ });
46
+ try {
47
+ const result = await handle.ops.folder({
48
+ path: positionals[0],
49
+ description: values.description,
50
+ ...(values.role ? { role: values.role } : {}),
51
+ ...(values.remember ? { remember: values.remember } : {}),
52
+ ...(values.type ? { type: values.type } : {}),
53
+ ...(values.ingest ? { ingest: values.ingest } : {}),
54
+ ...(values.rank !== undefined ? { rank: Number(values.rank) } : {}),
55
+ ...(values.route ? { route: true } : {}),
56
+ ...(values['dry-run'] ? { dry_run: true } : {}),
57
+ });
58
+ if (values.json) {
59
+ json(result);
60
+ return 0;
61
+ }
62
+ if (result.outcome === 'noop') {
63
+ line(`${statusLabel('ok')} ${style.grey(result.note ?? 'already declared')}`);
64
+ kv(Object.entries(result.rule ?? {}).map(([key, value]) => [key, String(value)]));
65
+ return 0;
66
+ }
67
+ heading(`${style.green('declared')} ${result.path}`);
68
+ kv([
69
+ ['rule', result.glob ?? null],
70
+ ['in', result.rules_file ?? null],
71
+ ...Object.entries(result.rule ?? {}).map(([key, value]) => [key, String(value)]),
72
+ ]);
73
+ if (result.change_id) {
74
+ line(`\n ${style.grey('reverse with')} ${style.bold(`akno undo ${result.change_id}`)}`);
75
+ }
76
+ if (result.note)
77
+ line(style.grey(`\n ${result.note}`));
78
+ return 0;
79
+ }
80
+ finally {
81
+ await handle.close();
82
+ }
83
+ }
84
+ //# sourceMappingURL=folder-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-cmd.js","sourceRoot":"","sources":["../../src/commands/folder-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function graphCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=graph-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/graph-cmd.ts"],"names":[],"mappings":"AA0BA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DlE"}
@@ -0,0 +1,126 @@
1
+ import { openOptionsFrom, parse } from "../args.js";
2
+ import { json, line, statusLabel, style } from "../output.js";
3
+ import { resolveOps } from "../ops-handle.js";
4
+ const GRAPH_HELP = `akno graph [seed] [options]
5
+
6
+ Inspect bounded evidence paths without returning page bodies or copied claims.
7
+
8
+ --slug <slug> Seed one exact page.
9
+ --entity <id> Seed one exact canonical entity id.
10
+ --query <text> Resolve exact entity names contained in a query. A positional
11
+ seed is treated as the query when no seed flag is present.
12
+ --direction <d> out | in | both (default: both)
13
+ --relation <r,...> Restrict relationship types.
14
+ --hops <n> 1 | 2 | 3 (default: 2)
15
+ --limit <n> Maximum paths, up to 100 (default: 30).
16
+ --history Include superseded fact paths. Excluded by default.
17
+ --json Machine-readable response.`;
18
+ export async function graphCommand(argv) {
19
+ const { values, positionals } = parse(argv, {
20
+ slug: { type: 'string' },
21
+ entity: { type: 'string' },
22
+ query: { type: 'string' },
23
+ direction: { type: 'string' },
24
+ relation: { type: 'string' },
25
+ hops: { type: 'string' },
26
+ limit: { type: 'string' },
27
+ history: { type: 'boolean', default: false },
28
+ });
29
+ if (values.help) {
30
+ line(GRAPH_HELP);
31
+ return 0;
32
+ }
33
+ const positionalQuery = !values.slug && !values.entity && !values.query ? positionals.join(' ') : '';
34
+ const hasExplicitSeed = Boolean(values.slug || values.entity || values.query);
35
+ if ([values.slug, values.entity, values.query, positionalQuery || undefined].filter(Boolean).length !== 1 ||
36
+ (hasExplicitSeed && positionals.length > 0)) {
37
+ line(GRAPH_HELP);
38
+ return 1;
39
+ }
40
+ const handle = await resolveOps(values, openOptionsFrom(values));
41
+ try {
42
+ const result = await handle.ops.graph({
43
+ ...(values.slug ? { slug: values.slug } : {}),
44
+ ...(values.entity ? { entity: values.entity } : {}),
45
+ ...(values.query || positionalQuery ? { query: values.query ?? positionalQuery } : {}),
46
+ ...(values.direction ? { direction: values.direction } : {}),
47
+ ...(values.relation
48
+ ? { relations: values.relation.split(',').map((value) => value.trim()) }
49
+ : {}),
50
+ ...(values.hops ? { max_hops: Number(values.hops) } : {}),
51
+ ...(values.limit ? { limit: Number(values.limit) } : {}),
52
+ ...(values.history ? { include_history: true } : {}),
53
+ });
54
+ if (values.json) {
55
+ json(result);
56
+ return result.status === 'unavailable' ? 1 : 0;
57
+ }
58
+ printGraph(result);
59
+ return result.status === 'unavailable' ? 1 : 0;
60
+ }
61
+ finally {
62
+ await handle.close();
63
+ }
64
+ }
65
+ function printGraph(result) {
66
+ line(`${statusLabel(result.status)} ${style.grey(`${result.paths.length} path${result.paths.length === 1 ? '' : 's'}`)} ` +
67
+ `${style.grey(`${result.nodes.length} nodes, ${result.edges.length} edges`)}`);
68
+ if (result.degraded?.length)
69
+ line(style.yellow(` degraded: ${result.degraded.join(', ')}`));
70
+ if (result.note)
71
+ line(style.grey(` ${result.note}`));
72
+ const nodes = new Map(result.nodes.map((node) => [node.id, node]));
73
+ const edges = new Map(result.edges.map((edge) => [edge.id, edge]));
74
+ for (const seed of result.seeds) {
75
+ const node = nodes.get(seed.node);
76
+ line(` ${style.grey(`seed ${seed.form}`)} ${node ? nodeLabel(node) : seed.value}`);
77
+ }
78
+ for (const ambiguity of result.ambiguities) {
79
+ line(style.yellow(` ambiguous ${JSON.stringify(ambiguity.mention)}`));
80
+ for (const candidate of ambiguity.candidates) {
81
+ line(` ${nodeLabel(candidate)} ${candidate.entity ? style.grey(candidate.entity) : ''}`);
82
+ }
83
+ }
84
+ for (const path of result.paths) {
85
+ const start = nodes.get(path.nodes[0]);
86
+ if (!start)
87
+ continue;
88
+ let rendered = nodeLabel(start);
89
+ for (let index = 0; index < path.edges.length; index++) {
90
+ const edge = edges.get(path.edges[index]);
91
+ const from = path.nodes[index];
92
+ const next = nodes.get(path.nodes[index + 1]);
93
+ if (!edge || !next)
94
+ continue;
95
+ const relation = edge.predicate ? `${edge.relation}:${edge.predicate}` : edge.relation;
96
+ rendered +=
97
+ edge.from === from ? ` —${relation}→ ${nodeLabel(next)}` : ` ←${relation}— ${nodeLabel(next)}`;
98
+ }
99
+ line(` ${style.grey(`${path.hops}h ~${path.confidence.toFixed(3)}`)} ${rendered}`);
100
+ line(style.grey(` ${path.evidence.map(locator).join(' · ')}`));
101
+ }
102
+ if (result.truncated)
103
+ line(style.yellow(' traversal was truncated; narrower filters may reveal other paths'));
104
+ }
105
+ function nodeLabel(node) {
106
+ switch (node.kind) {
107
+ case 'entity':
108
+ return `${node.label ?? node.entity}${node.slug ? style.grey(` [${node.slug}]`) : ''}`;
109
+ case 'page':
110
+ return node.slug ?? node.label ?? node.id;
111
+ case 'document':
112
+ return `${node.label ?? node.document}${node.availability ? style.grey(` [${node.availability}]`) : ''}`;
113
+ case 'fact':
114
+ return `${node.fact}${node.slug && node.line_start ? style.grey(` [${node.slug}:${node.line_start}]`) : ''}`;
115
+ case 'event':
116
+ return `${node.event}${node.date ? style.grey(` [${node.date}]`) : ''}`;
117
+ }
118
+ }
119
+ function locator(evidence) {
120
+ const lineRange = evidence.line_start
121
+ ? `:${evidence.line_start}${evidence.line_end && evidence.line_end !== evidence.line_start ? `-${evidence.line_end}` : ''}`
122
+ : '';
123
+ const source = evidence.slug ?? evidence.document ?? evidence.event ?? evidence.fact ?? evidence.kind;
124
+ return `${source}${lineRange}${evidence.field ? `#${evidence.field}` : ''}`;
125
+ }
126
+ //# sourceMappingURL=graph-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-cmd.js","sourceRoot":"","sources":["../../src/commands/graph-cmd.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,GAAG;;;;;;;;;;;;;iDAa8B,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CASlC,IAAI,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC7B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC7C,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,IACE,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,eAAe,IAAI,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;QACrG,CAAC,eAAe,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,EAC3C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAA2B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,GAAG,CAAC,MAAM,CAAC,QAAQ;gBACjB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAoB,EAAE;gBAC3F,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,CAAC;YACb,OAAO,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAmB;IACrC,IAAI,CACF,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG;QAClH,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,CAChF,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM;QAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,IAAI,MAAM,CAAC,IAAI;QAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC;YAChC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,SAAS;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACvF,QAAQ;gBACN,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnG,CAAC;QACD,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,MAAM,CAAC,SAAS;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oEAAoE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,SAAS,CAAC,IAAkB;IACnC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzF,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;QAC5C,KAAK,UAAU;YACb,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3G,KAAK,MAAM;YACT,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/G,KAAK,OAAO;YACV,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,QAAkC;IACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU;QACnC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3H,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;IACtG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function inboxCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=inbox-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/inbox-cmd.ts"],"names":[],"mappings":"AAyBA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDlE"}
@@ -0,0 +1,69 @@
1
+ import { openOptionsFrom, parse } from "../args.js";
2
+ import { runMaintenance } from "../ops-handle.js";
3
+ import { heading, json, line, style, truncate } from "../output.js";
4
+ const INBOX_HELP = `akno inbox [options]
5
+
6
+ Process whatever is sitting in an inbox folder: extract, name, summarize, and route.
7
+ A file that finds a home moves there with its page. A file that does not **stays in
8
+ the inbox**, with a proposal.
9
+
10
+ That failure mode is the point. An unrouted file sits visibly where you dropped it
11
+ rather than being filed confidently into the wrong place, where you would never look
12
+ for it. An inbox with three things in it is a to-do list; a misfiled document is a
13
+ lost one.
14
+
15
+ An inbox is any folder with \`route: true\` in its rule:
16
+
17
+ "inbox/**": { "ingest": "auto", "route": true }
18
+
19
+ \`akno serve\` does this automatically as files arrive. This command is for a
20
+ one-off pass, or for a machine that is not running the service.
21
+
22
+ --limit <n> Files to process in this pass (default 50).
23
+ --json`;
24
+ export async function inboxCommand(argv) {
25
+ const { values } = parse(argv, { limit: { type: 'string' } });
26
+ if (values.help) {
27
+ line(INBOX_HELP);
28
+ return 0;
29
+ }
30
+ const input = values.limit ? { limit: Number(values.limit) } : {};
31
+ // Through the service when one is running: filing a document writes, and exactly one
32
+ // process may write. The user running this by hand is the user, so a new folder is not gated.
33
+ const result = await runMaintenance('inbox', input, values, openOptionsFrom(values), (mem) => mem.inbox(input));
34
+ {
35
+ if (values.json) {
36
+ json(result);
37
+ return result.waiting.length > 0 ? 2 : 0;
38
+ }
39
+ const total = result.filed.length + result.waiting.length + result.skipped.length;
40
+ if (total === 0) {
41
+ line(style.grey('the inbox is empty'));
42
+ return 0;
43
+ }
44
+ if (result.filed.length > 0) {
45
+ heading(`${result.filed.length} filed`);
46
+ for (const entry of result.filed) {
47
+ line(` ${style.green('→')} ${entry.source} ${style.grey('became')} ${entry.slug}`);
48
+ }
49
+ }
50
+ if (result.waiting.length > 0) {
51
+ heading(`${result.waiting.length} still in the inbox`);
52
+ for (const entry of result.waiting) {
53
+ line(` ${style.yellow('·')} ${entry.source}`);
54
+ line(` ${style.grey(truncate(entry.reason, 96))}`);
55
+ if (entry.proposalId) {
56
+ line(` ${style.grey('decide with')} ${style.bold(`akno ingest <file> --folder <folder>`)}`);
57
+ }
58
+ }
59
+ }
60
+ if (result.skipped.length > 0) {
61
+ heading(`${result.skipped.length} skipped`);
62
+ for (const entry of result.skipped) {
63
+ line(` ${style.grey(`${entry.source} — ${entry.reason}`)}`);
64
+ }
65
+ }
66
+ return result.waiting.length > 0 ? 2 : 0;
67
+ }
68
+ }
69
+ //# sourceMappingURL=inbox-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-cmd.js","sourceRoot":"","sources":["../../src/commands/inbox-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function indexCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=index-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AAoBA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6FlE"}
@@ -0,0 +1,102 @@
1
+ import { openOptionsFrom, parse } from "../args.js";
2
+ import { runMaintenance } from "../ops-handle.js";
3
+ import { heading, json, kv, line, ms, progressWriter, style } from "../output.js";
4
+ const INDEX_HELP = `akno index [options]
5
+
6
+ Reconcile the index against the knowledge base. Safe to run any time — a pass
7
+ with nothing changed stats the tree and stops.
8
+
9
+ --verify Hash every file instead of trusting mtime and size. The
10
+ correctness path: catches a sync client or a restored
11
+ backup that preserved mtime across a real content change.
12
+ --structural Skip the model-backed passes (embeddings, summaries,
13
+ facts). Structure indexes in milliseconds.
14
+ --rederive Re-run summaries and fact derivation even where the body
15
+ hash has not moved.
16
+ --rebuild Delete the index first, then index from scratch. Costs one
17
+ re-index and no data; the knowledge base is untouched.
18
+ --json Machine-readable report.`;
19
+ export async function indexCommand(argv) {
20
+ const { values } = parse(argv, {
21
+ verify: { type: 'boolean', default: false },
22
+ structural: { type: 'boolean', default: false },
23
+ rederive: { type: 'boolean', default: false },
24
+ rebuild: { type: 'boolean', default: false },
25
+ });
26
+ if (values.help) {
27
+ line(INDEX_HELP);
28
+ return 0;
29
+ }
30
+ if (values.rebuild) {
31
+ const { loadConfig } = await import('@tenphi/akno-core');
32
+ const config = loadConfig(openOptionsFrom(values));
33
+ const fs = await import('node:fs');
34
+ // Deleting the index costs one re-index and no data. That property is the
35
+ // design — so `--rebuild` is allowed to be this blunt.
36
+ for (const suffix of ['', '-wal', '-shm']) {
37
+ fs.rmSync(`${config.dbPath}${suffix}`, { force: true });
38
+ }
39
+ line(style.grey(`removed ${config.dbPath}`));
40
+ }
41
+ const input = {
42
+ ...(values.verify ? { verify: true } : {}),
43
+ ...(values.structural ? { structuralOnly: true } : {}),
44
+ ...(values.rederive ? { rederive: true } : {}),
45
+ };
46
+ // Through the service when one is running — it holds the write handle. In-process it also
47
+ // gets a progress writer, which a socket cannot carry: the service logs its own progress.
48
+ const report = await runMaintenance('index', input, values, openOptionsFrom(values), async (mem) => {
49
+ const progress = progressWriter();
50
+ return mem.index({
51
+ ...input,
52
+ onProgress: (update) => progress(update.phase, update.done, update.total, update.detail),
53
+ });
54
+ });
55
+ {
56
+ if (values.json) {
57
+ json(report);
58
+ return 0;
59
+ }
60
+ heading(`Indexed in ${ms(report.durationMs)}`);
61
+ kv([
62
+ ['pages indexed', report.pagesIndexed],
63
+ ['pages unchanged', report.pagesUnchanged],
64
+ ['pages renamed', report.pagesRenamed > 0 ? report.pagesRenamed : '-'],
65
+ ['pages removed', report.pagesRemoved > 0 ? report.pagesRemoved : '-'],
66
+ ['ignored by role', report.ignored > 0 ? report.ignored : '-'],
67
+ ['chunks written', report.chunksWritten],
68
+ ['chunks embedded', report.chunksEmbedded],
69
+ ['pages summarized', report.pagesDerived],
70
+ ['facts derived', report.factsDerived],
71
+ ['events indexed', report.eventsIndexed],
72
+ ['graph nodes', report.graphNodes],
73
+ ['graph edges', report.graphEdges],
74
+ ['graph entities', report.graphEntities],
75
+ ['graph mentions', report.graphMentions],
76
+ ['ambiguous mentions', report.graphAmbiguousMentions > 0 ? report.graphAmbiguousMentions : '-'],
77
+ ['unresolved mentions', report.graphUnresolvedMentions > 0 ? report.graphUnresolvedMentions : '-'],
78
+ ['contextual mentions', report.graphContextualMentions > 0 ? report.graphContextualMentions : '-'],
79
+ ['new contextual choices', report.graphContextualResolved > 0 ? report.graphContextualResolved : '-'],
80
+ ['contextual abstentions', report.graphContextualAbstained > 0 ? report.graphContextualAbstained : '-'],
81
+ ['contextual failures', report.graphContextualFailed > 0 ? report.graphContextualFailed : '-'],
82
+ ['graph facts', report.graphFacts],
83
+ ['fact edges', report.graphFactEdges],
84
+ ['non-traversable facts', report.graphNonTraversableFacts > 0 ? report.graphNonTraversableFacts : '-'],
85
+ ['documents linked', report.documentsLinked],
86
+ ['documents read', report.documentsExtracted > 0 ? report.documentsExtracted : '-'],
87
+ ['documents summarized', report.documentsSummarized > 0 ? report.documentsSummarized : '-'],
88
+ ['text renditions', report.renditionsWritten > 0 ? report.renditionsWritten : '-'],
89
+ ['files hashed', report.hashed],
90
+ ]);
91
+ if (report.warnings.length > 0) {
92
+ heading(`${report.warnings.length} warning${report.warnings.length === 1 ? '' : 's'}`);
93
+ for (const warning of report.warnings.slice(0, 20))
94
+ line(` ${style.yellow('·')} ${warning}`);
95
+ if (report.warnings.length > 20) {
96
+ line(style.grey(` … ${report.warnings.length - 20} more — see \`akno doctor\``));
97
+ }
98
+ }
99
+ return 0;
100
+ }
101
+ }
102
+ //# sourceMappingURL=index-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAElF,MAAM,UAAU,GAAG;;;;;;;;;;;;;;+CAc4B,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAKrB,IAAI,EAAE;QACP,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;QAC/C,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;QAC7C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC7C,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,0EAA0E;QAC1E,uDAAuD;QACvD,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1C,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;IAEF,0FAA0F;IAC1F,0FAA0F;IAC1F,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACjG,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,KAAK,CAAC;YACf,GAAG,KAAK;YACR,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;SACzF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,CAAC;QACC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,CAAC;YACb,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC;YACD,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC;YACtC,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC;YAC1C,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;YACtE,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;YACtE,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9D,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;YACxC,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC;YAC1C,CAAC,kBAAkB,EAAE,MAAM,CAAC,YAAY,CAAC;YACzC,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC;YACtC,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;YACxC,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC;YAClC,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC;YAClC,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;YACxC,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC;YACxC,CAAC,oBAAoB,EAAE,MAAM,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/F,CAAC,qBAAqB,EAAE,MAAM,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC;YAClG,CAAC,qBAAqB,EAAE,MAAM,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC;YAClG,CAAC,wBAAwB,EAAE,MAAM,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC;YACrG,CAAC,wBAAwB,EAAE,MAAM,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC;YACvG,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9F,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC;YAClC,CAAC,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC;YACrC,CAAC,uBAAuB,EAAE,MAAM,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC;YACtG,CAAC,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC;YAC5C,CAAC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC;YACnF,CAAC,sBAAsB,EAAE,MAAM,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3F,CAAC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC;YAClF,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACvF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAE,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;YAC9F,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,6BAA6B,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ingestCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=ingest-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/ingest-cmd.ts"],"names":[],"mappings":"AA6BA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmInE"}
@@ -0,0 +1,167 @@
1
+ import { openOptionsFrom, parse } from "../args.js";
2
+ import { heading, json, kv, line, statusLabel, style, truncate } from "../output.js";
3
+ import { resolveOps } from "../ops-handle.js";
4
+ const INGEST_HELP = `akno ingest <path | url> [options]
5
+
6
+ Pull a file, a folder, or a URL into memory: extract the text, OCR it if there is no
7
+ text layer, name it from its contents, summarize it, and route it to a folder. You
8
+ never run an extraction tool.
9
+
10
+ A folder is walked one level deep — a recursive pass over a folder pointed at by
11
+ mistake is a thousand model calls — and every file gets its own verdict.
12
+
13
+ Extraction uses what macOS already has — PDFKit for a text layer, the Vision
14
+ framework for OCR. A small helper is compiled on first use and cached.
15
+
16
+ Two things it deliberately refuses to do:
17
+ · A file whose text cannot be read keeps its name and gets no page, rather than
18
+ being given a confident wrong one.
19
+ · A file with no clear destination stays where it is, with a proposal. A misfiled
20
+ document is a lost one.
21
+
22
+ --folder <path> Put it here, instead of letting routing decide.
23
+ --label <text> A description for the stored file.
24
+ --limit <n> Files to look at when ingesting a folder (default 50).
25
+ --move Move the source instead of copying it.
26
+ --actor <who> user | agent. The user is never gated.
27
+ --json`;
28
+ export async function ingestCommand(argv) {
29
+ const { values, positionals } = parse(argv, {
30
+ folder: { type: 'string' },
31
+ label: { type: 'string' },
32
+ limit: { type: 'string' },
33
+ move: { type: 'boolean', default: false },
34
+ actor: { type: 'string' },
35
+ });
36
+ if (values.help || positionals.length === 0) {
37
+ line(INGEST_HELP);
38
+ return values.help ? 0 : 1;
39
+ }
40
+ const handle = await resolveOps(values, openOptionsFrom(values), {
41
+ write: true,
42
+ ...(values.actor === 'user' || values.actor === 'agent' ? { actor: values.actor } : {}),
43
+ });
44
+ try {
45
+ const target = positionals[0];
46
+ const result = await handle.ops.ingest({
47
+ // A URL and a path are told apart here rather than by the op, so `./https-notes`
48
+ // stays a path and does not become a fetch.
49
+ ...(/^https?:\/\//i.test(target) ? { url: target } : { path: target }),
50
+ ...(values.folder ? { folder: values.folder } : {}),
51
+ ...(values.label ? { label: values.label } : {}),
52
+ ...(values.limit ? { limit: Number(values.limit) } : {}),
53
+ ...(values.move ? { route: true } : {}),
54
+ });
55
+ if (values.json) {
56
+ json(result);
57
+ return result.outcome === 'ok' || result.outcome === 'duplicate' ? 0 : 2;
58
+ }
59
+ if (result.batch) {
60
+ // A folder: one line per file, because three filing themselves and two needing a
61
+ // decision is not one outcome.
62
+ heading(result.note ?? `${result.batch.length} files`);
63
+ const width = Math.max(...result.batch.map((entry) => entry.source.length));
64
+ for (const entry of result.batch) {
65
+ const label = entry.outcome === 'ok'
66
+ ? style.green('filed')
67
+ : entry.outcome === 'duplicate'
68
+ ? style.grey('already stored')
69
+ : entry.outcome === 'error'
70
+ ? style.red('error')
71
+ : style.yellow(entry.outcome === 'requires_approval' ? 'needs a home' : 'skipped');
72
+ line(` ${entry.source.padEnd(width)} ${label} ${style.grey(entry.slug ?? truncate(entry.note ?? '', 60))}`);
73
+ }
74
+ return result.batch.some((entry) => entry.outcome === 'ok') ? 0 : 2;
75
+ }
76
+ if (result.outcome === 'duplicate') {
77
+ line(`${statusLabel('ok')} ${style.grey('already stored')}`);
78
+ kv([
79
+ ['document', result.document],
80
+ ['file', result.rel_path],
81
+ ['page', result.slug],
82
+ ]);
83
+ return 0;
84
+ }
85
+ if (result.outcome === 'skipped') {
86
+ // Not a failure. A guard firing is the layer working, and the caller needs
87
+ // to know which one so it can decide whether to help.
88
+ line(`${statusLabel(result.status)} ${style.yellow('left where it is')}`);
89
+ line(` ${result.note}`);
90
+ if (result.ocr)
91
+ line(style.grey(' (OCR ran, but produced nothing usable)'));
92
+ return 2;
93
+ }
94
+ if (result.outcome === 'requires_approval' && result.approval) {
95
+ heading(style.yellow('needs a destination — the file stays where it is'));
96
+ kv([
97
+ ['what it is', result.approval.reason],
98
+ ['proposal', result.approval.proposal_id],
99
+ ['pages', result.page_count ?? null],
100
+ ['text from', describeSource(result.text_from)],
101
+ ]);
102
+ if (result.approval.nearest.length > 0) {
103
+ line(` ${style.grey('folders that came closest')} ${result.approval.nearest.join(', ')}`);
104
+ }
105
+ line(`\n ${style.grey('decide with')} ${style.bold('akno ingest <path> --folder <folder>')}`);
106
+ return 2;
107
+ }
108
+ if (result.outcome === 'requires_folder' && result.requires_folder) {
109
+ // A different problem from the one above, and worth saying so: there is a destination
110
+ // in mind, it just has not been described yet. Nobody is waiting to approve it.
111
+ const required = result.requires_folder;
112
+ heading(style.yellow(`'${required.folder}' is not declared — the file stays where it is`));
113
+ kv([
114
+ ['what it is', truncate(result.summary ?? '', 90) || null],
115
+ ['pages', result.page_count ?? null],
116
+ ['text from', describeSource(result.text_from)],
117
+ ]);
118
+ if (required.nearest.length > 0) {
119
+ line(` ${style.grey('could go instead')} ${required.nearest.join(', ')}`);
120
+ }
121
+ line(`\n ${style.grey('say what belongs there, then ingest again:')}`);
122
+ line(` ${style.bold(`akno folder ${required.folder} --description "…"`)}`);
123
+ return 2;
124
+ }
125
+ line(`${statusLabel(result.status)} ${style.grey(`change ${result.change_id}`)}`);
126
+ kv([
127
+ ['page', result.slug],
128
+ ['file', result.rel_path],
129
+ ['pages', result.page_count ?? null],
130
+ ['text from', describeSource(result.text_from)],
131
+ ['renamed from', result.renamed_from ?? null],
132
+ ]);
133
+ if (result.summary)
134
+ line(`\n ${truncate(result.summary, 150)}`);
135
+ if (result.related?.length)
136
+ line(`\n ${style.grey('related')} ${result.related.join(', ')}`);
137
+ if (result.note)
138
+ line(`\n ${style.grey(result.note)}`);
139
+ line(`\n ${style.grey('reverse with')} ${style.bold(`akno undo ${result.change_id}`)}`);
140
+ return 0;
141
+ }
142
+ finally {
143
+ await handle.close();
144
+ }
145
+ }
146
+ /**
147
+ * `ocr: true/false` cannot distinguish a PDF's own text layer from a vision model's
148
+ * description of a photograph, and printing them the same way claims something untrue
149
+ * about where the text came from.
150
+ */
151
+ function describeSource(via) {
152
+ switch (via) {
153
+ case 'text-layer':
154
+ return "the document's own text layer";
155
+ case 'ocr':
156
+ return 'OCR (macOS Vision)';
157
+ case 'plain':
158
+ return 'the file itself';
159
+ case 'textutil':
160
+ return 'textutil';
161
+ case 'vision':
162
+ return "a vision model's description — not text found in the image";
163
+ default:
164
+ return 'nothing could be extracted';
165
+ }
166
+ }
167
+ //# sourceMappingURL=ingest-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest-cmd.js","sourceRoot":"","sources":["../../src/commands/ingest-cmd.ts"],"names":[],"mappings":"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"}