tenbrains 2.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 (183) hide show
  1. package/AGENTS.md +112 -0
  2. package/README.md +218 -0
  3. package/dist/ai/analyzer.d.ts +28 -0
  4. package/dist/ai/analyzer.d.ts.map +1 -0
  5. package/dist/ai/analyzer.js +35 -0
  6. package/dist/ai/analyzer.js.map +1 -0
  7. package/dist/ai/client.d.ts +12 -0
  8. package/dist/ai/client.d.ts.map +1 -0
  9. package/dist/ai/client.js +152 -0
  10. package/dist/ai/client.js.map +1 -0
  11. package/dist/ai/json.d.ts +7 -0
  12. package/dist/ai/json.d.ts.map +1 -0
  13. package/dist/ai/json.js +57 -0
  14. package/dist/ai/json.js.map +1 -0
  15. package/dist/ai/mock.d.ts +6 -0
  16. package/dist/ai/mock.d.ts.map +1 -0
  17. package/dist/ai/mock.js +66 -0
  18. package/dist/ai/mock.js.map +1 -0
  19. package/dist/ai/prompts.d.ts +19 -0
  20. package/dist/ai/prompts.d.ts.map +1 -0
  21. package/dist/ai/prompts.js +40 -0
  22. package/dist/ai/prompts.js.map +1 -0
  23. package/dist/ai/providers.d.ts +22 -0
  24. package/dist/ai/providers.d.ts.map +1 -0
  25. package/dist/ai/providers.js +56 -0
  26. package/dist/ai/providers.js.map +1 -0
  27. package/dist/ai/resolve.d.ts +24 -0
  28. package/dist/ai/resolve.d.ts.map +1 -0
  29. package/dist/ai/resolve.js +33 -0
  30. package/dist/ai/resolve.js.map +1 -0
  31. package/dist/bin/preflight.d.ts +2 -0
  32. package/dist/bin/preflight.d.ts.map +1 -0
  33. package/dist/bin/preflight.js +11 -0
  34. package/dist/bin/preflight.js.map +1 -0
  35. package/dist/bin/tenbrains.d.ts +3 -0
  36. package/dist/bin/tenbrains.d.ts.map +1 -0
  37. package/dist/bin/tenbrains.js +9 -0
  38. package/dist/bin/tenbrains.js.map +1 -0
  39. package/dist/cli.d.ts +4 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +554 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/commands/analyze.d.ts +7 -0
  44. package/dist/commands/analyze.d.ts.map +1 -0
  45. package/dist/commands/analyze.js +204 -0
  46. package/dist/commands/analyze.js.map +1 -0
  47. package/dist/commands/bookmark.d.ts +9 -0
  48. package/dist/commands/bookmark.d.ts.map +1 -0
  49. package/dist/commands/bookmark.js +120 -0
  50. package/dist/commands/bookmark.js.map +1 -0
  51. package/dist/commands/config.d.ts +15 -0
  52. package/dist/commands/config.d.ts.map +1 -0
  53. package/dist/commands/config.js +142 -0
  54. package/dist/commands/config.js.map +1 -0
  55. package/dist/commands/db.d.ts +9 -0
  56. package/dist/commands/db.d.ts.map +1 -0
  57. package/dist/commands/db.js +64 -0
  58. package/dist/commands/db.js.map +1 -0
  59. package/dist/commands/digest.d.ts +19 -0
  60. package/dist/commands/digest.d.ts.map +1 -0
  61. package/dist/commands/digest.js +71 -0
  62. package/dist/commands/digest.js.map +1 -0
  63. package/dist/commands/import.d.ts +11 -0
  64. package/dist/commands/import.d.ts.map +1 -0
  65. package/dist/commands/import.js +78 -0
  66. package/dist/commands/import.js.map +1 -0
  67. package/dist/commands/learn.d.ts +9 -0
  68. package/dist/commands/learn.d.ts.map +1 -0
  69. package/dist/commands/learn.js +149 -0
  70. package/dist/commands/learn.js.map +1 -0
  71. package/dist/commands/manifest.d.ts +13 -0
  72. package/dist/commands/manifest.d.ts.map +1 -0
  73. package/dist/commands/manifest.js +62 -0
  74. package/dist/commands/manifest.js.map +1 -0
  75. package/dist/commands/record.d.ts +10 -0
  76. package/dist/commands/record.d.ts.map +1 -0
  77. package/dist/commands/record.js +37 -0
  78. package/dist/commands/record.js.map +1 -0
  79. package/dist/commands/search.d.ts +5 -0
  80. package/dist/commands/search.d.ts.map +1 -0
  81. package/dist/commands/search.js +33 -0
  82. package/dist/commands/search.js.map +1 -0
  83. package/dist/commands/shared.d.ts +9 -0
  84. package/dist/commands/shared.d.ts.map +1 -0
  85. package/dist/commands/shared.js +13 -0
  86. package/dist/commands/shared.js.map +1 -0
  87. package/dist/commands/suggest.d.ts +9 -0
  88. package/dist/commands/suggest.d.ts.map +1 -0
  89. package/dist/commands/suggest.js +102 -0
  90. package/dist/commands/suggest.js.map +1 -0
  91. package/dist/commands/takeaway.d.ts +9 -0
  92. package/dist/commands/takeaway.d.ts.map +1 -0
  93. package/dist/commands/takeaway.js +167 -0
  94. package/dist/commands/takeaway.js.map +1 -0
  95. package/dist/core/config.d.ts +52 -0
  96. package/dist/core/config.d.ts.map +1 -0
  97. package/dist/core/config.js +180 -0
  98. package/dist/core/config.js.map +1 -0
  99. package/dist/core/context.d.ts +28 -0
  100. package/dist/core/context.d.ts.map +1 -0
  101. package/dist/core/context.js +40 -0
  102. package/dist/core/context.js.map +1 -0
  103. package/dist/core/errors.d.ts +33 -0
  104. package/dist/core/errors.d.ts.map +1 -0
  105. package/dist/core/errors.js +82 -0
  106. package/dist/core/errors.js.map +1 -0
  107. package/dist/core/input.d.ts +9 -0
  108. package/dist/core/input.d.ts.map +1 -0
  109. package/dist/core/input.js +47 -0
  110. package/dist/core/input.js.map +1 -0
  111. package/dist/core/opts.d.ts +8 -0
  112. package/dist/core/opts.d.ts.map +1 -0
  113. package/dist/core/opts.js +38 -0
  114. package/dist/core/opts.js.map +1 -0
  115. package/dist/core/output.d.ts +58 -0
  116. package/dist/core/output.d.ts.map +1 -0
  117. package/dist/core/output.js +76 -0
  118. package/dist/core/output.js.map +1 -0
  119. package/dist/core/paths.d.ts +20 -0
  120. package/dist/core/paths.d.ts.map +1 -0
  121. package/dist/core/paths.js +31 -0
  122. package/dist/core/paths.js.map +1 -0
  123. package/dist/core/text.d.ts +10 -0
  124. package/dist/core/text.d.ts.map +1 -0
  125. package/dist/core/text.js +132 -0
  126. package/dist/core/text.js.map +1 -0
  127. package/dist/core/validate.d.ts +5 -0
  128. package/dist/core/validate.d.ts.map +1 -0
  129. package/dist/core/validate.js +17 -0
  130. package/dist/core/validate.js.map +1 -0
  131. package/dist/db/database.d.ts +27 -0
  132. package/dist/db/database.d.ts.map +1 -0
  133. package/dist/db/database.js +90 -0
  134. package/dist/db/database.js.map +1 -0
  135. package/dist/db/fts.d.ts +12 -0
  136. package/dist/db/fts.d.ts.map +1 -0
  137. package/dist/db/fts.js +42 -0
  138. package/dist/db/fts.js.map +1 -0
  139. package/dist/db/migrations.d.ts +20 -0
  140. package/dist/db/migrations.d.ts.map +1 -0
  141. package/dist/db/migrations.js +243 -0
  142. package/dist/db/migrations.js.map +1 -0
  143. package/dist/db/repositories.d.ts +130 -0
  144. package/dist/db/repositories.d.ts.map +1 -0
  145. package/dist/db/repositories.js +418 -0
  146. package/dist/db/repositories.js.map +1 -0
  147. package/dist/domain/learn.d.ts +25 -0
  148. package/dist/domain/learn.d.ts.map +1 -0
  149. package/dist/domain/learn.js +85 -0
  150. package/dist/domain/learn.js.map +1 -0
  151. package/dist/domain/schemas.d.ts +169 -0
  152. package/dist/domain/schemas.d.ts.map +1 -0
  153. package/dist/domain/schemas.js +54 -0
  154. package/dist/domain/schemas.js.map +1 -0
  155. package/dist/domain/search.d.ts +32 -0
  156. package/dist/domain/search.d.ts.map +1 -0
  157. package/dist/domain/search.js +77 -0
  158. package/dist/domain/search.js.map +1 -0
  159. package/dist/domain/suggest.d.ts +17 -0
  160. package/dist/domain/suggest.d.ts.map +1 -0
  161. package/dist/domain/suggest.js +114 -0
  162. package/dist/domain/suggest.js.map +1 -0
  163. package/dist/domain/tags.d.ts +9 -0
  164. package/dist/domain/tags.d.ts.map +1 -0
  165. package/dist/domain/tags.js +40 -0
  166. package/dist/domain/tags.js.map +1 -0
  167. package/dist/domain/types.d.ts +84 -0
  168. package/dist/domain/types.d.ts.map +1 -0
  169. package/dist/domain/types.js +2 -0
  170. package/dist/domain/types.js.map +1 -0
  171. package/dist/index.d.ts +19 -0
  172. package/dist/index.d.ts.map +1 -0
  173. package/dist/index.js +18 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/x/archive.d.ts +32 -0
  176. package/dist/x/archive.d.ts.map +1 -0
  177. package/dist/x/archive.js +108 -0
  178. package/dist/x/archive.js.map +1 -0
  179. package/dist/x/client.d.ts +61 -0
  180. package/dist/x/client.d.ts.map +1 -0
  181. package/dist/x/client.js +321 -0
  182. package/dist/x/client.js.map +1 -0
  183. package/package.json +58 -0
@@ -0,0 +1,19 @@
1
+ import type { RunContext } from "../core/context.js";
2
+ import { type Opts } from "../core/opts.js";
3
+ import type { CommandResult } from "../core/output.js";
4
+ import type { Store } from "../db/repositories.js";
5
+ interface DigestData {
6
+ since: string;
7
+ days: number;
8
+ counts: {
9
+ analyses: number;
10
+ takeaways: number;
11
+ bookmarks: number;
12
+ };
13
+ markdown: string;
14
+ }
15
+ /** A markdown recap of everything saved in the window — the tool's "output side". */
16
+ export declare function buildDigest(store: Store, days: number, now: Date): DigestData;
17
+ export declare function digestCommand(ctx: RunContext, opts: Opts): CommandResult;
18
+ export {};
19
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,IAAI,EAAa,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,UAAU,CA6D7E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAWxE"}
@@ -0,0 +1,71 @@
1
+ import { optNumber } from "../core/opts.js";
2
+ function snippet(text, max = 120) {
3
+ const clean = text.replace(/\s+/g, " ").trim();
4
+ return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
5
+ }
6
+ /** A markdown recap of everything saved in the window — the tool's "output side". */
7
+ export function buildDigest(store, days, now) {
8
+ const since = new Date(now.getTime() - days * 86_400_000).toISOString();
9
+ const postsById = new Map(store.posts.all().map((p) => [p.id, p]));
10
+ const accountsById = new Map(store.accounts.list().map((a) => [a.id, a]));
11
+ const analyses = store.analyses.all().filter((a) => a.createdAt >= since);
12
+ const snapshots = store.snapshots.all().filter((s) => s.createdAt >= since);
13
+ const bookmarks = store.bookmarks.all().filter((b) => b.createdAt >= since);
14
+ const lines = [
15
+ `# tenbrains digest — last ${days} day${days === 1 ? "" : "s"}`,
16
+ "",
17
+ `_${analyses.length} analyses · ${snapshots.length} account takeaways · ${bookmarks.length} bookmarks since ${since.slice(0, 10)}_`,
18
+ ];
19
+ if (analyses.length > 0) {
20
+ lines.push("", "## Analyses", "");
21
+ for (const analysis of analyses) {
22
+ const post = postsById.get(analysis.postId);
23
+ const author = post?.authorUsername ? ` — @${post.authorUsername}` : "";
24
+ lines.push(`- **${analysis.topic}**${author}: ${snippet(analysis.summary)} \`${analysis.id}\``);
25
+ }
26
+ }
27
+ if (snapshots.length > 0) {
28
+ lines.push("", "## Account takeaways", "");
29
+ for (const snap of snapshots) {
30
+ const account = accountsById.get(snap.accountId);
31
+ lines.push(`- **@${account?.username ?? "account"}**: ${snippet(snap.summary)}`);
32
+ for (const takeaway of snap.takeaways.slice(0, 3)) {
33
+ lines.push(` - ${snippet(takeaway, 100)}`);
34
+ }
35
+ }
36
+ }
37
+ if (bookmarks.length > 0) {
38
+ lines.push("", "## Bookmarks", "");
39
+ for (const bookmark of bookmarks) {
40
+ const post = postsById.get(bookmark.postId);
41
+ const tags = bookmark.tags.length > 0 ? ` ${bookmark.tags.map((t) => `#${t}`).join(" ")}` : "";
42
+ lines.push(`- ${snippet(post?.text ?? bookmark.note ?? "")}${tags} \`${bookmark.id}\``);
43
+ }
44
+ }
45
+ if (analyses.length + snapshots.length + bookmarks.length === 0) {
46
+ lines.push("", "Nothing saved in this window.");
47
+ }
48
+ return {
49
+ since,
50
+ days,
51
+ counts: {
52
+ analyses: analyses.length,
53
+ takeaways: snapshots.length,
54
+ bookmarks: bookmarks.length,
55
+ },
56
+ markdown: lines.join("\n"),
57
+ };
58
+ }
59
+ export function digestCommand(ctx, opts) {
60
+ const days = optNumber(opts, "days", 7);
61
+ const digest = buildDigest(ctx.store(), days, new Date());
62
+ return {
63
+ data: digest,
64
+ meta: {
65
+ days,
66
+ total: digest.counts.analyses + digest.counts.takeaways + digest.counts.bookmarks,
67
+ },
68
+ human: () => digest.markdown,
69
+ };
70
+ }
71
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { RunContext } from "../core/context.js";
2
+ import { type Opts } from "../core/opts.js";
3
+ import type { CommandResult } from "../core/output.js";
4
+ /**
5
+ * Bulk-import the extracted official X account archive — the free path to
6
+ * real signal. Likes become posts + bookmarks (they feed the suggestion
7
+ * profile immediately); the account's own tweets become plain posts ready for
8
+ * analysis. Re-running is safe: everything dedupes on externalId.
9
+ */
10
+ export declare function importXArchiveCommand(ctx: RunContext, opts: Opts): CommandResult;
11
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,IAAI,EAAqC,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAuEhF"}
@@ -0,0 +1,78 @@
1
+ import { optBool, optNumber, requireString } from "../core/opts.js";
2
+ import { readArchive } from "../x/archive.js";
3
+ /**
4
+ * Bulk-import the extracted official X account archive — the free path to
5
+ * real signal. Likes become posts + bookmarks (they feed the suggestion
6
+ * profile immediately); the account's own tweets become plain posts ready for
7
+ * analysis. Re-running is safe: everything dedupes on externalId.
8
+ */
9
+ export function importXArchiveCommand(ctx, opts) {
10
+ const root = requireString(opts, "path", "<path>");
11
+ const store = ctx.store();
12
+ const limit = optNumber(opts, "limit", 0);
13
+ const wantLikes = optBool(opts, "likes") || !optBool(opts, "tweets");
14
+ const wantTweets = optBool(opts, "tweets") || !optBool(opts, "likes");
15
+ const bookmarkLikes = opts.bookmarks !== false; // --no-bookmarks opts out
16
+ const archive = readArchive(root);
17
+ const cap = (items) => (limit > 0 ? items.slice(0, limit) : items);
18
+ const counts = {
19
+ likesImported: 0,
20
+ bookmarksCreated: 0,
21
+ tweetsImported: 0,
22
+ deduped: 0,
23
+ };
24
+ store.transaction(() => {
25
+ if (wantLikes) {
26
+ for (const like of cap(archive.likes)) {
27
+ const { post, deduped } = store.posts.ingest({
28
+ text: like.text,
29
+ externalId: like.externalId,
30
+ url: like.url,
31
+ });
32
+ if (deduped) {
33
+ counts.deduped += 1;
34
+ }
35
+ else {
36
+ counts.likesImported += 1;
37
+ }
38
+ if (bookmarkLikes && !store.bookmarks.findByPostId(post.id)) {
39
+ store.bookmarks.create({ postId: post.id, tags: [], source: "x:archive" });
40
+ counts.bookmarksCreated += 1;
41
+ }
42
+ }
43
+ }
44
+ if (wantTweets) {
45
+ for (const tweet of cap(archive.tweets)) {
46
+ const { deduped } = store.posts.ingest({
47
+ text: tweet.text,
48
+ externalId: tweet.externalId,
49
+ url: `https://x.com/${archive.username ?? "i"}/status/${tweet.externalId}`,
50
+ authorUsername: archive.username,
51
+ postedAt: tweet.postedAt,
52
+ });
53
+ if (deduped) {
54
+ counts.deduped += 1;
55
+ }
56
+ else {
57
+ counts.tweetsImported += 1;
58
+ }
59
+ }
60
+ }
61
+ });
62
+ return {
63
+ data: {
64
+ path: root,
65
+ username: archive.username ?? null,
66
+ found: { likes: archive.likes.length, tweets: archive.tweets.length },
67
+ ...counts,
68
+ },
69
+ meta: { persisted: true },
70
+ human: () => [
71
+ `Imported X archive${archive.username ? ` for @${archive.username}` : ""}:`,
72
+ ` likes: ${counts.likesImported} new (${counts.bookmarksCreated} bookmarked)`,
73
+ ` tweets: ${counts.tweetsImported} new`,
74
+ ` deduped: ${counts.deduped} already stored`,
75
+ ].join("\n"),
76
+ };
77
+ }
78
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RunContext } from "../core/context.js";
2
+ import { type Opts } from "../core/opts.js";
3
+ import type { CommandResult } from "../core/output.js";
4
+ export declare function learnGenerateCommand(ctx: RunContext, opts: Opts): CommandResult;
5
+ export declare function learnShowCommand(ctx: RunContext, opts: Opts): CommandResult;
6
+ export declare function learnListCommand(ctx: RunContext, opts: Opts): CommandResult;
7
+ export declare function learnTodayCommand(ctx: RunContext, opts: Opts): CommandResult;
8
+ export declare function learnDoneCommand(ctx: RunContext, opts: Opts): CommandResult;
9
+ //# sourceMappingURL=learn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/commands/learn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,KAAK,IAAI,EAAuC,MAAM,iBAAiB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOvD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAwB/E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAW3E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAQ3E;AAYD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAsD5E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAkC3E"}
@@ -0,0 +1,149 @@
1
+ import { CliError } from "../core/errors.js";
2
+ import { resolveJsonInput } from "../core/input.js";
3
+ import { optNumber, optString, requireString } from "../core/opts.js";
4
+ import { parseOrThrow } from "../core/validate.js";
5
+ import { buildFeynmanTrack, nextPendingDay, scheduledDay } from "../domain/learn.js";
6
+ import { RatingsInputSchema } from "../domain/schemas.js";
7
+ export function learnGenerateCommand(ctx, opts) {
8
+ const store = ctx.store();
9
+ const analysisId = requireString(opts, "analysis", "--analysis");
10
+ const analysis = store.analyses.findById(analysisId);
11
+ if (!analysis) {
12
+ throw new CliError("NOT_FOUND", `No analysis with id ${analysisId}.`, {
13
+ details: { analysisId },
14
+ });
15
+ }
16
+ const ratingsOpt = optString(opts, "ratings");
17
+ const ratings = ratingsOpt
18
+ ? parseOrThrow(RatingsInputSchema, resolveJsonInput(ratingsOpt), "Invalid ratings input.")
19
+ : [];
20
+ const minutes = optNumber(opts, "minutes", 10);
21
+ const days = buildFeynmanTrack(analysis.concepts, minutes, ratings);
22
+ const track = store.tracks.create({ analysisId, minutesPerDay: minutes, ratings, days });
23
+ return {
24
+ data: { track, analysis },
25
+ meta: { trackId: track.id, minutesPerDay: minutes, persisted: true },
26
+ human: () => renderTrack(track),
27
+ };
28
+ }
29
+ export function learnShowCommand(ctx, opts) {
30
+ const store = ctx.store();
31
+ const id = requireString(opts, "id", "<id>");
32
+ const track = store.tracks.findById(id);
33
+ if (!track) {
34
+ throw new CliError("NOT_FOUND", `No learning track with id ${id}.`, { details: { id } });
35
+ }
36
+ return {
37
+ data: { track, analysis: store.analyses.findById(track.analysisId) },
38
+ human: () => renderTrack(track),
39
+ };
40
+ }
41
+ export function learnListCommand(ctx, opts) {
42
+ const limit = optNumber(opts, "limit", 20);
43
+ const analysisId = optString(opts, "analysis");
44
+ const tracks = ctx.store().tracks.list(limit, analysisId);
45
+ return {
46
+ data: { tracks, count: tracks.length },
47
+ meta: { limit, ...(analysisId ? { analysisId } : {}) },
48
+ };
49
+ }
50
+ /** Most recently created track that still has pending days. */
51
+ function findActiveTrack(store) {
52
+ for (const track of store.tracks.list(100)) {
53
+ if (nextPendingDay(track.days, track.progress) !== null) {
54
+ return track;
55
+ }
56
+ }
57
+ return null;
58
+ }
59
+ export function learnTodayCommand(ctx, opts) {
60
+ const store = ctx.store();
61
+ const id = optString(opts, "id");
62
+ let track;
63
+ if (id) {
64
+ track = store.tracks.findById(id);
65
+ if (!track) {
66
+ throw new CliError("NOT_FOUND", `No learning track with id ${id}.`, { details: { id } });
67
+ }
68
+ }
69
+ else {
70
+ track = findActiveTrack(store);
71
+ if (!track) {
72
+ throw new CliError("NOT_FOUND", "No learning track with pending days. Create one with `learn generate --analysis <id>` or `analyze --learn`.");
73
+ }
74
+ }
75
+ const day = nextPendingDay(track.days, track.progress);
76
+ const analysis = store.analyses.findById(track.analysisId);
77
+ if (day === null) {
78
+ return {
79
+ data: { trackId: track.id, completed: true, task: null, progress: track.progress },
80
+ meta: { trackId: track.id, completed: true },
81
+ human: () => `Track ${track.id} is complete — all ${track.days.length} days done.`,
82
+ };
83
+ }
84
+ const task = track.days.find((d) => d.day === day) ?? null;
85
+ const onSchedule = scheduledDay(track.createdAt, new Date(), track.days.length);
86
+ return {
87
+ data: {
88
+ trackId: track.id,
89
+ day,
90
+ totalDays: track.days.length,
91
+ task,
92
+ scheduledDay: onSchedule,
93
+ behindBy: Math.max(0, onSchedule - day),
94
+ doneDays: track.progress.length,
95
+ topic: analysis?.topic ?? null,
96
+ },
97
+ meta: { trackId: track.id, day, completed: false },
98
+ human: () => {
99
+ const topic = analysis ? ` — ${analysis.topic}` : "";
100
+ const behind = onSchedule > day ? ` (calendar says day ${onSchedule}; ${onSchedule - day} behind)` : "";
101
+ return [
102
+ `Day ${day}/${track.days.length} of ${track.id}${topic}${behind}`,
103
+ ...(task ? [` ${task.learn}`, ` ${task.explain}`, ` ${task.check}`] : []),
104
+ `Mark it finished with: learn done ${track.id}`,
105
+ ].join("\n");
106
+ },
107
+ };
108
+ }
109
+ export function learnDoneCommand(ctx, opts) {
110
+ const store = ctx.store();
111
+ const id = requireString(opts, "id", "<id>");
112
+ let track = store.tracks.findById(id);
113
+ if (!track) {
114
+ throw new CliError("NOT_FOUND", `No learning track with id ${id}.`, { details: { id } });
115
+ }
116
+ const pending = nextPendingDay(track.days, track.progress);
117
+ const day = optNumber(opts, "day", pending ?? 0);
118
+ if (pending === null && opts.day === undefined) {
119
+ throw new CliError("CONFLICT", `Track ${id} is already complete.`, { details: { id } });
120
+ }
121
+ if (!Number.isInteger(day) || day < 1 || day > track.days.length) {
122
+ throw new CliError("USAGE", `--day must be between 1 and ${track.days.length}.`, {
123
+ details: { day },
124
+ });
125
+ }
126
+ if (track.progress.some((p) => p.day === day)) {
127
+ throw new CliError("CONFLICT", `Day ${day} of track ${id} is already marked done.`, {
128
+ details: { id, day },
129
+ });
130
+ }
131
+ track = store.tracks.markDone(id, day, optString(opts, "notes"));
132
+ const remaining = nextPendingDay(track.days, track.progress);
133
+ return {
134
+ data: { track, day, completed: remaining === null },
135
+ meta: { trackId: track.id, day, completed: remaining === null, persisted: true },
136
+ human: () => remaining === null
137
+ ? `Day ${day} done — track ${id} complete! 🎉`
138
+ : `Day ${day} done (${track.progress.length}/${track.days.length}). Next up: day ${remaining}.`,
139
+ };
140
+ }
141
+ function renderTrack(track) {
142
+ const done = new Set(track.progress.map((p) => p.day));
143
+ const stats = track.progress.length > 0 ? ` — ${track.progress.length}/${track.days.length} done` : "";
144
+ return [
145
+ `7-day Feynman track (${track.minutesPerDay} min/day) — ${track.id}${stats}`,
146
+ ...track.days.map((d) => `Day ${d.day}${done.has(d.day) ? " ✓" : ""} [${d.concept}]\n ${d.learn}\n ${d.explain}\n ${d.check}`),
147
+ ].join("\n");
148
+ }
149
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../src/commands/learn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Command } from "commander";
2
+ import type { RunContext } from "../core/context.js";
3
+ import type { Opts } from "../core/opts.js";
4
+ import type { CommandResult } from "../core/output.js";
5
+ /**
6
+ * Emit a complete, machine-readable description of the CLI: the output
7
+ * contract, error/exit codes, provider catalog, db schema version, and the full
8
+ * command tree. This is the agent's discovery entry point — one call reveals
9
+ * every command and flag without scraping `--help`.
10
+ */
11
+ export declare function buildManifest(program: Command): Record<string, unknown>;
12
+ export declare function manifestCommand(program: Command): (_ctx: RunContext, _opts: Opts) => CommandResult;
13
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAiDvD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2BvE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,IACtC,MAAM,UAAU,EAAE,OAAO,IAAI,KAAG,aAAa,CAGtD"}
@@ -0,0 +1,62 @@
1
+ import { PROVIDER_CATALOG } from "../ai/providers.js";
2
+ import { ERROR_CODES, exitCodeMap } from "../core/errors.js";
3
+ import { currentSchemaVersion } from "../db/migrations.js";
4
+ function describeCommand(command) {
5
+ const args = (command
6
+ .registeredArguments ?? []);
7
+ return {
8
+ name: command.name(),
9
+ description: command.description(),
10
+ aliases: command.aliases(),
11
+ arguments: args.map((arg) => ({
12
+ name: arg.name(),
13
+ required: arg.required,
14
+ description: arg.description ?? "",
15
+ })),
16
+ options: command.options.map((option) => ({
17
+ flags: option.flags,
18
+ description: option.description ?? "",
19
+ })),
20
+ commands: command.commands.map(describeCommand),
21
+ };
22
+ }
23
+ /**
24
+ * Emit a complete, machine-readable description of the CLI: the output
25
+ * contract, error/exit codes, provider catalog, db schema version, and the full
26
+ * command tree. This is the agent's discovery entry point — one call reveals
27
+ * every command and flag without scraping `--help`.
28
+ */
29
+ export function buildManifest(program) {
30
+ return {
31
+ name: "tenbrains",
32
+ version: program.version() ?? "unknown",
33
+ description: program.description(),
34
+ output: {
35
+ default: "json",
36
+ note: "stdout is exactly one JSON envelope per run; diagnostics go to stderr. Use --pretty for human output.",
37
+ successEnvelope: { ok: true, command: "string", data: "object", meta: "object" },
38
+ errorEnvelope: {
39
+ ok: false,
40
+ command: "string",
41
+ error: { code: "ErrorCode", message: "string", retryable: "boolean", details: "object?" },
42
+ },
43
+ },
44
+ errorCodes: ERROR_CODES,
45
+ exitCodes: exitCodeMap(),
46
+ providers: Object.values(PROVIDER_CATALOG).map((p) => ({
47
+ id: p.id,
48
+ label: p.label,
49
+ defaultModel: p.defaultModel,
50
+ requiresKey: p.requiresKey,
51
+ keyConfigPath: p.keyConfigPath,
52
+ })),
53
+ database: { engine: "sqlite", schemaVersion: currentSchemaVersion() },
54
+ commands: program.commands.map(describeCommand),
55
+ };
56
+ }
57
+ export function manifestCommand(program) {
58
+ return (_ctx, _opts) => ({
59
+ data: buildManifest(program),
60
+ });
61
+ }
62
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA4B3D,SAAS,eAAe,CAAC,OAAgB;IACvC,MAAM,IAAI,GAAG,CAAE,OAAoE;SAChF,mBAAmB,IAAI,EAAE,CAAwB,CAAC;IACrD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;QAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE;YAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;SACnC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;SACtC,CAAC,CAAC;QACH,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;KAChD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,SAAS;QACvC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;QAClC,MAAM,EAAE;YACN,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,uGAAuG;YAC7G,eAAe,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChF,aAAa,EAAE;gBACb,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,QAAQ;gBACjB,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE;aAC1F;SACF;QACD,UAAU,EAAE,WAAW;QACvB,SAAS,EAAE,WAAW,EAAE;QACxB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;SAC/B,CAAC,CAAC;QACH,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,EAAE,EAAE;QACrE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO,CAAC,IAAgB,EAAE,KAAW,EAAiB,EAAE,CAAC,CAAC;QACxD,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC;KAC7B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { RunContext } from "../core/context.js";
2
+ import { type Opts } from "../core/opts.js";
3
+ import type { CommandResult } from "../core/output.js";
4
+ /**
5
+ * Resolve any prefixed id (post_, ana_, acc_, snap_, bm_, sug_, trk_) to its
6
+ * stored record. Lets an agent follow an id from one command's output straight
7
+ * to the underlying entity without knowing which table it belongs to.
8
+ */
9
+ export declare function recordGetCommand(ctx: RunContext, opts: Opts): CommandResult;
10
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/commands/record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,KAAK,IAAI,EAAiB,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CA8B3E"}
@@ -0,0 +1,37 @@
1
+ import { CliError } from "../core/errors.js";
2
+ import { requireString } from "../core/opts.js";
3
+ /**
4
+ * Resolve any prefixed id (post_, ana_, acc_, snap_, bm_, sug_, trk_) to its
5
+ * stored record. Lets an agent follow an id from one command's output straight
6
+ * to the underlying entity without knowing which table it belongs to.
7
+ */
8
+ export function recordGetCommand(ctx, opts) {
9
+ const id = requireString(opts, "id", "<id>");
10
+ const store = ctx.store();
11
+ const prefix = id.split("_", 1)[0];
12
+ const record = (() => {
13
+ switch (prefix) {
14
+ case "post":
15
+ return { type: "post", value: store.posts.findById(id) };
16
+ case "ana":
17
+ return { type: "analysis", value: store.analyses.findById(id) };
18
+ case "acc":
19
+ return { type: "account", value: store.accounts.findById(id) };
20
+ case "snap":
21
+ return { type: "takeaway_snapshot", value: store.snapshots.findById(id) };
22
+ case "bm":
23
+ return { type: "bookmark", value: store.bookmarks.findById(id) };
24
+ case "sug":
25
+ return { type: "suggestion", value: store.suggestions.findById(id) };
26
+ case "trk":
27
+ return { type: "learning_track", value: store.tracks.findById(id) };
28
+ default:
29
+ throw new CliError("USAGE", `Unrecognized id prefix "${prefix}".`, { details: { id } });
30
+ }
31
+ })();
32
+ if (!record.value) {
33
+ throw new CliError("NOT_FOUND", `No ${record.type} with id ${id}.`, { details: { id } });
34
+ }
35
+ return { data: { type: record.type, record: record.value } };
36
+ }
37
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/commands/record.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAa,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG3D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAe,EAAE,IAAU;IAC1D,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;QACnB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3D,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAClE,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,KAAK,MAAM;gBACT,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5E,KAAK,IAAI;gBACP,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACnE,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACvE,KAAK,KAAK;gBACR,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACtE;gBACE,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,2BAA2B,MAAM,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC,IAAI,YAAY,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RunContext } from "../core/context.js";
2
+ import { type Opts } from "../core/opts.js";
3
+ import type { CommandResult } from "../core/output.js";
4
+ export declare function searchCommand(ctx: RunContext, opts: Opts): CommandResult;
5
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,KAAK,IAAI,EAAqC,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKvD,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CA4BxE"}
@@ -0,0 +1,33 @@
1
+ import { CliError } from "../core/errors.js";
2
+ import { optList, optNumber, requireString } from "../core/opts.js";
3
+ import { searchCorpus } from "../domain/search.js";
4
+ const ALL_TYPES = ["analysis", "takeaway", "bookmark"];
5
+ export function searchCommand(ctx, opts) {
6
+ const query = requireString(opts, "query", "<query>");
7
+ const requested = optList(opts, "type");
8
+ let types = ALL_TYPES;
9
+ if (requested.length > 0 && !requested.includes("all")) {
10
+ for (const t of requested) {
11
+ if (!ALL_TYPES.includes(t)) {
12
+ throw new CliError("USAGE", `Invalid --type "${t}". Use analysis|takeaway|bookmark|all.`);
13
+ }
14
+ }
15
+ types = requested;
16
+ }
17
+ const limit = optNumber(opts, "limit", 10);
18
+ const result = searchCorpus(ctx.store(), query, { types, limit });
19
+ return {
20
+ data: result,
21
+ meta: { total: result.total },
22
+ human: () => {
23
+ const lines = [`Results for "${query}" (${result.total}):`];
24
+ for (const type of ALL_TYPES) {
25
+ for (const hit of result.groups[type]) {
26
+ lines.push(` [${type} ${hit.score.toFixed(2)}] ${hit.title} — ${hit.snippet}`);
27
+ }
28
+ }
29
+ return result.total === 0 ? `No matches for "${query}".` : lines.join("\n");
30
+ },
31
+ };
32
+ }
33
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAa,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE/E,OAAO,EAAmB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,SAAS,GAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAErE,MAAM,UAAU,aAAa,CAAC,GAAe,EAAE,IAAU;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,KAAK,GAAiB,SAAS,CAAC;IACpC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAe,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,wCAAwC,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QACD,KAAK,GAAG,SAAyB,CAAC;IACpC,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QAC7B,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,KAAK,GAAa,CAAC,gBAAgB,KAAK,MAAM,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YACtE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { RunContext } from "../core/context.js";
2
+ import { type Opts } from "../core/opts.js";
3
+ /**
4
+ * Resolve the X (Twitter) Bearer token for a run: the `--x-bearer` flag (which
5
+ * may be `@file` or `-` for stdin) wins, then the stored `x.bearerToken` config,
6
+ * else null. No environment variables are consulted.
7
+ */
8
+ export declare function resolveXBearer(ctx: RunContext, opts: Opts): string | null;
9
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,KAAK,IAAI,EAAa,MAAM,iBAAiB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAIzE"}
@@ -0,0 +1,13 @@
1
+ import { resolveTextInput } from "../core/input.js";
2
+ import { optString } from "../core/opts.js";
3
+ /**
4
+ * Resolve the X (Twitter) Bearer token for a run: the `--x-bearer` flag (which
5
+ * may be `@file` or `-` for stdin) wins, then the stored `x.bearerToken` config,
6
+ * else null. No environment variables are consulted.
7
+ */
8
+ export function resolveXBearer(ctx, opts) {
9
+ const flag = optString(opts, "xBearer");
10
+ const fromFlag = flag ? resolveTextInput(flag).trim() : "";
11
+ return fromFlag || ctx.config.getXBearer() || null;
12
+ }
13
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAe,EAAE,IAAU;IACxD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,OAAO,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC;AACrD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { RunContext } from "../core/context.js";
2
+ import { type Opts } from "../core/opts.js";
3
+ import type { CommandResult } from "../core/output.js";
4
+ export declare function suggestGenerateCommand(ctx: RunContext, opts: Opts): CommandResult;
5
+ export declare function suggestListCommand(ctx: RunContext, opts: Opts): CommandResult;
6
+ export declare function suggestSaveCommand(ctx: RunContext, opts: Opts): CommandResult;
7
+ export declare function suggestDismissCommand(ctx: RunContext, opts: Opts): CommandResult;
8
+ export declare function suggestAddCommand(ctx: RunContext, opts: Opts): CommandResult;
9
+ //# sourceMappingURL=suggest.d.ts.map