@goondocks/myco 0.5.1 → 0.6.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 (138) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +4 -0
  4. package/dist/{chunk-JJL6AMDA.js → chunk-24DOZEUJ.js} +255 -6
  5. package/dist/chunk-24DOZEUJ.js.map +1 -0
  6. package/dist/{chunk-ZWUFTOG3.js → chunk-2GSX3BK2.js} +4 -4
  7. package/dist/{chunk-FIRMTYFH.js → chunk-2YBUL3IL.js} +4 -37
  8. package/dist/chunk-2YBUL3IL.js.map +1 -0
  9. package/dist/{chunk-HL2S5QZG.js → chunk-2ZBB3MQT.js} +319 -40
  10. package/dist/chunk-2ZBB3MQT.js.map +1 -0
  11. package/dist/{chunk-HJG7Z6SJ.js → chunk-3EM23DMD.js} +2 -2
  12. package/dist/{chunk-XQXXF6MU.js → chunk-4RMSHZE4.js} +12 -1
  13. package/dist/{chunk-XQXXF6MU.js.map → chunk-4RMSHZE4.js.map} +1 -1
  14. package/dist/{chunk-T7OC6GH5.js → chunk-5FNZ7AMX.js} +2 -2
  15. package/dist/{chunk-X6TKHO22.js → chunk-5QWZT4AB.js} +2 -2
  16. package/dist/{chunk-B6WVNDA5.js → chunk-6BSDCZ5Q.js} +8 -2
  17. package/dist/{chunk-B6WVNDA5.js.map → chunk-6BSDCZ5Q.js.map} +1 -1
  18. package/dist/{chunk-R6LQT3U7.js → chunk-B5UZSHQV.js} +8 -12
  19. package/dist/{chunk-R6LQT3U7.js.map → chunk-B5UZSHQV.js.map} +1 -1
  20. package/dist/{chunk-7KQB22DP.js → chunk-E7OBRBCQ.js} +2 -2
  21. package/dist/{chunk-RCV2I4AI.js → chunk-GDYYJTTT.js} +5 -3
  22. package/dist/{chunk-RCV2I4AI.js.map → chunk-GDYYJTTT.js.map} +1 -1
  23. package/dist/{chunk-MIU3DKLN.js → chunk-GNR3QAER.js} +2 -2
  24. package/dist/{chunk-BMJX2IDQ.js → chunk-H7PRCVGQ.js} +2 -2
  25. package/dist/{chunk-6LTNFMXO.js → chunk-KC7ENQTN.js} +2 -2
  26. package/dist/chunk-KUMVJIJW.js +117 -0
  27. package/dist/chunk-KUMVJIJW.js.map +1 -0
  28. package/dist/{chunk-ND4VK6C7.js → chunk-L25U7PIG.js} +2 -2
  29. package/dist/{chunk-6UJWI4IW.js → chunk-MQSYSQ6T.js} +7 -5
  30. package/dist/{chunk-6UJWI4IW.js.map → chunk-MQSYSQ6T.js.map} +1 -1
  31. package/dist/{chunk-TBRZAJ7W.js → chunk-P3WO3N3I.js} +11 -3
  32. package/dist/chunk-P3WO3N3I.js.map +1 -0
  33. package/dist/{chunk-JI6M2L2W.js → chunk-QGJ2ZIUZ.js} +7 -4
  34. package/dist/chunk-QGJ2ZIUZ.js.map +1 -0
  35. package/dist/{chunk-5EZ7QF6J.js → chunk-QLUE3BUL.js} +66 -1
  36. package/dist/chunk-QLUE3BUL.js.map +1 -0
  37. package/dist/{chunk-AK6GNLPV.js → chunk-TWSTAVLO.js} +17 -1
  38. package/dist/{chunk-AK6GNLPV.js.map → chunk-TWSTAVLO.js.map} +1 -1
  39. package/dist/{chunk-FIA5NTRH.js → chunk-UVGAVYWZ.js} +11 -13
  40. package/dist/chunk-UVGAVYWZ.js.map +1 -0
  41. package/dist/{chunk-UKWO26VI.js → chunk-YTANWAGE.js} +2 -2
  42. package/dist/chunk-ZMYNRTTD.js +64 -0
  43. package/dist/chunk-ZMYNRTTD.js.map +1 -0
  44. package/dist/{cli-BLYNNKGJ.js → cli-K7SUTP7A.js} +22 -22
  45. package/dist/{client-5GB4WVXE.js → client-YJMNTITQ.js} +5 -5
  46. package/dist/{config-5FGLQGCW.js → config-G5GGT5A6.js} +3 -3
  47. package/dist/curate-6T5NKVXK.js +80 -0
  48. package/dist/curate-6T5NKVXK.js.map +1 -0
  49. package/dist/{detect-providers-BIHYFK5M.js → detect-providers-S3M5TAMW.js} +3 -3
  50. package/dist/{digest-7NKYXM6G.js → digest-O35VHYFP.js} +31 -40
  51. package/dist/digest-O35VHYFP.js.map +1 -0
  52. package/dist/{init-HPQ77WWF.js → init-TFLSATB3.js} +9 -11
  53. package/dist/init-TFLSATB3.js.map +1 -0
  54. package/dist/{logs-BSTBZHDR.js → logs-IENORIYR.js} +3 -3
  55. package/dist/{main-NFQ4II75.js → main-JEUQS3BY.js} +1218 -294
  56. package/dist/main-JEUQS3BY.js.map +1 -0
  57. package/dist/rebuild-7SH5GSNX.js +66 -0
  58. package/dist/rebuild-7SH5GSNX.js.map +1 -0
  59. package/dist/{reprocess-ZL4HKTSC.js → reprocess-Q4YH2ZBK.js} +20 -22
  60. package/dist/{reprocess-ZL4HKTSC.js.map → reprocess-Q4YH2ZBK.js.map} +1 -1
  61. package/dist/{restart-FYW662DR.js → restart-NLJLB52D.js} +7 -6
  62. package/dist/{restart-FYW662DR.js.map → restart-NLJLB52D.js.map} +1 -1
  63. package/dist/{search-E5JQMTXV.js → search-2BVRF54H.js} +10 -10
  64. package/dist/{server-TV3D35HZ.js → server-4AMZNP4F.js} +51 -97
  65. package/dist/{server-TV3D35HZ.js.map → server-4AMZNP4F.js.map} +1 -1
  66. package/dist/{session-QF6MILAC.js → session-F326AWCH.js} +2 -2
  67. package/dist/{session-start-5MFEOVQ5.js → session-start-AZAF3DTE.js} +10 -10
  68. package/dist/setup-digest-YLZZGSSR.js +15 -0
  69. package/dist/setup-llm-JOXBSLXC.js +15 -0
  70. package/dist/src/cli.js +4 -4
  71. package/dist/src/daemon/main.js +4 -4
  72. package/dist/src/hooks/post-tool-use.js +5 -5
  73. package/dist/src/hooks/session-end.js +5 -5
  74. package/dist/src/hooks/session-start.js +4 -4
  75. package/dist/src/hooks/stop.js +7 -7
  76. package/dist/src/hooks/user-prompt-submit.js +5 -5
  77. package/dist/src/mcp/server.js +4 -4
  78. package/dist/src/prompts/consolidation.md +46 -0
  79. package/dist/src/templates/portal.md +5 -0
  80. package/dist/stats-MKDIZFIQ.js +58 -0
  81. package/dist/stats-MKDIZFIQ.js.map +1 -0
  82. package/dist/templates-XPRBOWCE.js +38 -0
  83. package/dist/templates-XPRBOWCE.js.map +1 -0
  84. package/dist/ui/assets/index-D37IoDXS.css +1 -0
  85. package/dist/ui/assets/index-DA61Ial2.js +289 -0
  86. package/dist/ui/favicon.svg +11 -0
  87. package/dist/ui/fonts/GeistMono-LICENSE.txt +92 -0
  88. package/dist/ui/fonts/GeistMono-Variable.woff2 +0 -0
  89. package/dist/ui/index.html +14 -0
  90. package/dist/{verify-RACBFT2P.js → verify-7DW7LAND.js} +6 -6
  91. package/dist/{version-HJTVNPOO.js → version-RQLD7VBP.js} +4 -4
  92. package/package.json +3 -2
  93. package/dist/chunk-2AMAOSRF.js +0 -105
  94. package/dist/chunk-2AMAOSRF.js.map +0 -1
  95. package/dist/chunk-5EZ7QF6J.js.map +0 -1
  96. package/dist/chunk-FIA5NTRH.js.map +0 -1
  97. package/dist/chunk-FIRMTYFH.js.map +0 -1
  98. package/dist/chunk-HL2S5QZG.js.map +0 -1
  99. package/dist/chunk-IURC35BF.js +0 -49
  100. package/dist/chunk-IURC35BF.js.map +0 -1
  101. package/dist/chunk-JI6M2L2W.js.map +0 -1
  102. package/dist/chunk-JJL6AMDA.js.map +0 -1
  103. package/dist/chunk-KYL67SKZ.js +0 -150
  104. package/dist/chunk-KYL67SKZ.js.map +0 -1
  105. package/dist/chunk-TBRZAJ7W.js.map +0 -1
  106. package/dist/curate-S4HOYWXA.js +0 -231
  107. package/dist/curate-S4HOYWXA.js.map +0 -1
  108. package/dist/digest-7NKYXM6G.js.map +0 -1
  109. package/dist/init-HPQ77WWF.js.map +0 -1
  110. package/dist/main-NFQ4II75.js.map +0 -1
  111. package/dist/rebuild-KQ6G2GZM.js +0 -86
  112. package/dist/rebuild-KQ6G2GZM.js.map +0 -1
  113. package/dist/setup-digest-DZAFIBEF.js +0 -15
  114. package/dist/setup-llm-4BZM33YT.js +0 -15
  115. package/dist/stats-ZIIJ2GB3.js +0 -77
  116. package/dist/stats-ZIIJ2GB3.js.map +0 -1
  117. /package/dist/{chunk-ZWUFTOG3.js.map → chunk-2GSX3BK2.js.map} +0 -0
  118. /package/dist/{chunk-HJG7Z6SJ.js.map → chunk-3EM23DMD.js.map} +0 -0
  119. /package/dist/{chunk-T7OC6GH5.js.map → chunk-5FNZ7AMX.js.map} +0 -0
  120. /package/dist/{chunk-X6TKHO22.js.map → chunk-5QWZT4AB.js.map} +0 -0
  121. /package/dist/{chunk-7KQB22DP.js.map → chunk-E7OBRBCQ.js.map} +0 -0
  122. /package/dist/{chunk-MIU3DKLN.js.map → chunk-GNR3QAER.js.map} +0 -0
  123. /package/dist/{chunk-BMJX2IDQ.js.map → chunk-H7PRCVGQ.js.map} +0 -0
  124. /package/dist/{chunk-6LTNFMXO.js.map → chunk-KC7ENQTN.js.map} +0 -0
  125. /package/dist/{chunk-ND4VK6C7.js.map → chunk-L25U7PIG.js.map} +0 -0
  126. /package/dist/{chunk-UKWO26VI.js.map → chunk-YTANWAGE.js.map} +0 -0
  127. /package/dist/{cli-BLYNNKGJ.js.map → cli-K7SUTP7A.js.map} +0 -0
  128. /package/dist/{client-5GB4WVXE.js.map → client-YJMNTITQ.js.map} +0 -0
  129. /package/dist/{config-5FGLQGCW.js.map → config-G5GGT5A6.js.map} +0 -0
  130. /package/dist/{detect-providers-BIHYFK5M.js.map → detect-providers-S3M5TAMW.js.map} +0 -0
  131. /package/dist/{logs-BSTBZHDR.js.map → logs-IENORIYR.js.map} +0 -0
  132. /package/dist/{search-E5JQMTXV.js.map → search-2BVRF54H.js.map} +0 -0
  133. /package/dist/{session-QF6MILAC.js.map → session-F326AWCH.js.map} +0 -0
  134. /package/dist/{session-start-5MFEOVQ5.js.map → session-start-AZAF3DTE.js.map} +0 -0
  135. /package/dist/{setup-digest-DZAFIBEF.js.map → setup-digest-YLZZGSSR.js.map} +0 -0
  136. /package/dist/{setup-llm-4BZM33YT.js.map → setup-llm-JOXBSLXC.js.map} +0 -0
  137. /package/dist/{verify-RACBFT2P.js.map → verify-7DW7LAND.js.map} +0 -0
  138. /package/dist/{version-HJTVNPOO.js.map → version-RQLD7VBP.js.map} +0 -0
@@ -12,7 +12,7 @@
12
12
  "source": {
13
13
  "source": "npm",
14
14
  "package": "@goondocks/myco",
15
- "version": "0.5.0"
15
+ "version": "0.5.1"
16
16
  },
17
17
  "description": "Collective agent intelligence — captures session knowledge and serves it back via MCP",
18
18
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myco",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "description": "Collective agent intelligence — captures session knowledge and serves it back to your team via MCP",
5
5
  "author": {
6
6
  "name": "goondocks-co",
package/README.md CHANGED
@@ -70,6 +70,10 @@ An MCP server exposes the vault to any agent runtime. The digest extract is inje
70
70
 
71
71
  Sessions link to plans. Plans link to decisions. Decisions link to spores. Obsidian backlinks and metadata create a navigable graph of your team's institutional knowledge. Open the vault in [Obsidian](https://obsidian.md) to browse it visually, or let agents traverse it via MCP tools.
72
72
 
73
+ ### Dashboard
74
+
75
+ A local web dashboard at `http://localhost:<port>/` provides configuration management and operational triggers — no CLI or YAML editing needed. Manage intelligence providers, run curation and digest cycles, monitor daemon health, and view live logs. The daemon writes a `_portal.md` to your vault with the URL, so you can find it from Obsidian.
76
+
73
77
  ### Multi-agent
74
78
 
75
79
  Myco reads conversation transcripts from Claude Code, Cursor, and any agent that writes JSONL transcripts. Screenshots shared during sessions are extracted and embedded as Obsidian image attachments. A plugin adapter registry makes adding new agents straightforward.
@@ -1,7 +1,10 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
- parseNoteFrontmatter
4
- } from "./chunk-2AMAOSRF.js";
3
+ external_exports
4
+ } from "./chunk-MQSYSQ6T.js";
5
+ import {
6
+ CANDIDATE_CONTENT_PREVIEW
7
+ } from "./chunk-6BSDCZ5Q.js";
5
8
  import {
6
9
  __commonJS,
7
10
  __require,
@@ -3380,7 +3383,7 @@ var require_parse = __commonJS({
3380
3383
  var require_gray_matter = __commonJS({
3381
3384
  "node_modules/gray-matter/index.js"(exports2, module2) {
3382
3385
  "use strict";
3383
- var fs2 = __require("fs");
3386
+ var fs3 = __require("fs");
3384
3387
  var sections = require_section_matter();
3385
3388
  var defaults = require_defaults();
3386
3389
  var stringify = require_stringify();
@@ -3464,7 +3467,7 @@ var require_gray_matter = __commonJS({
3464
3467
  return stringify(file, data, options2);
3465
3468
  };
3466
3469
  matter2.read = function(filepath, options2) {
3467
- const str2 = fs2.readFileSync(filepath, "utf8");
3470
+ const str2 = fs3.readFileSync(filepath, "utf8");
3468
3471
  const file = matter2(str2, options2);
3469
3472
  file.path = filepath;
3470
3473
  return file;
@@ -3496,6 +3499,101 @@ var require_gray_matter = __commonJS({
3496
3499
  var import_gray_matter = __toESM(require_gray_matter(), 1);
3497
3500
  import fs from "fs";
3498
3501
  import path from "path";
3502
+
3503
+ // src/vault/types.ts
3504
+ var SessionFrontmatterSchema = external_exports.object({
3505
+ type: external_exports.literal("session"),
3506
+ id: external_exports.string(),
3507
+ agent: external_exports.string(),
3508
+ user: external_exports.string(),
3509
+ started: external_exports.string(),
3510
+ ended: external_exports.string().optional(),
3511
+ parent: external_exports.string().optional(),
3512
+ parent_reason: external_exports.string().optional(),
3513
+ plan: external_exports.string().optional(),
3514
+ // backward compat read path
3515
+ plans: external_exports.array(external_exports.string()).optional(),
3516
+ // new: multiple plans
3517
+ branch: external_exports.string().optional(),
3518
+ tags: external_exports.array(external_exports.string()).default([]),
3519
+ tools_used: external_exports.number().int().optional(),
3520
+ files_changed: external_exports.number().int().optional()
3521
+ });
3522
+ var PLAN_STATUSES = ["active", "in_progress", "completed", "abandoned"];
3523
+ var PlanFrontmatterSchema = external_exports.object({
3524
+ type: external_exports.literal("plan"),
3525
+ id: external_exports.string(),
3526
+ status: external_exports.enum(PLAN_STATUSES).default("active"),
3527
+ created: external_exports.string(),
3528
+ author: external_exports.string().optional(),
3529
+ tags: external_exports.array(external_exports.string()).default([])
3530
+ });
3531
+ var OBSERVATION_TYPES = ["gotcha", "bug_fix", "decision", "discovery", "trade_off", "cross-cutting"];
3532
+ var SPORE_STATUSES = ["active", "superseded", "archived"];
3533
+ var SporeFrontmatterSchema = external_exports.object({
3534
+ type: external_exports.literal("spore"),
3535
+ id: external_exports.string(),
3536
+ observation_type: external_exports.string(),
3537
+ status: external_exports.enum(SPORE_STATUSES).default("active"),
3538
+ session: external_exports.string().optional(),
3539
+ plan: external_exports.string().optional(),
3540
+ superseded_by: external_exports.string().optional(),
3541
+ consolidated_from: external_exports.array(external_exports.string()).optional(),
3542
+ created: external_exports.string(),
3543
+ tags: external_exports.array(external_exports.string()).default([])
3544
+ });
3545
+ var ARTIFACT_TYPES = ["spec", "plan", "rfc", "doc", "other"];
3546
+ var ArtifactFrontmatterSchema = external_exports.object({
3547
+ type: external_exports.literal("artifact"),
3548
+ id: external_exports.string(),
3549
+ artifact_type: external_exports.enum(ARTIFACT_TYPES).default("other"),
3550
+ source_path: external_exports.string(),
3551
+ title: external_exports.string(),
3552
+ last_captured_by: external_exports.string(),
3553
+ created: external_exports.string(),
3554
+ updated: external_exports.string(),
3555
+ tags: external_exports.array(external_exports.string()).default([])
3556
+ });
3557
+ var TeamMemberFrontmatterSchema = external_exports.object({
3558
+ type: external_exports.literal("team-member"),
3559
+ user: external_exports.string(),
3560
+ joined: external_exports.string(),
3561
+ role: external_exports.string().optional(),
3562
+ tags: external_exports.array(external_exports.string()).default([])
3563
+ });
3564
+ var schemasByType = {
3565
+ session: SessionFrontmatterSchema,
3566
+ plan: PlanFrontmatterSchema,
3567
+ spore: SporeFrontmatterSchema,
3568
+ artifact: ArtifactFrontmatterSchema,
3569
+ "team-member": TeamMemberFrontmatterSchema
3570
+ };
3571
+ function parseNoteFrontmatter(data) {
3572
+ const type = data.type;
3573
+ const schema = schemasByType[type];
3574
+ if (!schema) {
3575
+ throw new Error(`Unknown note type: ${type}. Known types: ${Object.keys(schemasByType).join(", ")}`);
3576
+ }
3577
+ const coerced = coerceDatesToStrings(data);
3578
+ return schema.parse(coerced);
3579
+ }
3580
+ function coerceDatesToStrings(obj) {
3581
+ const result = {};
3582
+ for (const [key, value] of Object.entries(obj)) {
3583
+ if (value instanceof Date) {
3584
+ result[key] = value.toISOString();
3585
+ } else if (Array.isArray(value)) {
3586
+ result[key] = value.map((item) => item instanceof Date ? item.toISOString() : item);
3587
+ } else if (value !== null && typeof value === "object" && !Array.isArray(value)) {
3588
+ result[key] = coerceDatesToStrings(value);
3589
+ } else {
3590
+ result[key] = value;
3591
+ }
3592
+ }
3593
+ return result;
3594
+ }
3595
+
3596
+ // src/vault/reader.ts
3499
3597
  var VAULT_SUBDIRS = ["sessions", "plans", "spores", "artifacts", "team"];
3500
3598
  var VaultReader = class {
3501
3599
  constructor(vaultDir) {
@@ -3573,10 +3671,161 @@ function extractTitle(content) {
3573
3671
  return match ? match[1].trim() : "";
3574
3672
  }
3575
3673
 
3674
+ // src/intelligence/response.ts
3675
+ var REASONING_PATTERNS = [
3676
+ // <think>...</think>answer (DeepSeek, Qwen, GLM, many others)
3677
+ /<think>[\s\S]*?<\/think>\s*/gi,
3678
+ // Implicit opening: reasoning...</think>answer (GLM-4.7 observed)
3679
+ /^[\s\S]*?<\/think>\s*/i,
3680
+ // <reasoning>...</reasoning>answer
3681
+ /<reasoning>[\s\S]*?<\/reasoning>\s*/gi,
3682
+ // <|thinking|>...<|/thinking|>answer
3683
+ /<\|thinking\|>[\s\S]*?<\|\/thinking\|>\s*/gi,
3684
+ // Plain-text "Thinking Process:" block followed by actual content
3685
+ // (Qwen 3.5 via LM Studio without native thinking mode)
3686
+ // Matches from "Thinking Process:" up to the last numbered step, then the synthesis follows
3687
+ /^Thinking Process:[\s\S]*?(?=\n(?:## |# |\*\*[A-Z]))/i
3688
+ ];
3689
+ function stripReasoningTokens(text) {
3690
+ if (!text) return text;
3691
+ for (const pattern of REASONING_PATTERNS) {
3692
+ const stripped = text.replace(pattern, "").trim();
3693
+ if (stripped && stripped !== text.trim()) {
3694
+ return stripped;
3695
+ }
3696
+ }
3697
+ return text;
3698
+ }
3699
+ function extractJson(text) {
3700
+ const cleaned = stripReasoningTokens(text);
3701
+ const fenceMatch = cleaned.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
3702
+ if (fenceMatch) {
3703
+ return JSON.parse(fenceMatch[1].trim());
3704
+ }
3705
+ const objectMatch = cleaned.match(/\{[\s\S]*\}/);
3706
+ if (objectMatch) {
3707
+ return JSON.parse(objectMatch[0]);
3708
+ }
3709
+ return JSON.parse(cleaned);
3710
+ }
3711
+ function extractNumber(text) {
3712
+ const cleaned = stripReasoningTokens(text).trim();
3713
+ const match = cleaned.match(/(\d+\.?\d*)/);
3714
+ if (match) return parseFloat(match[1]);
3715
+ return parseFloat(cleaned);
3716
+ }
3717
+
3718
+ // src/prompts/index.ts
3719
+ import fs2 from "fs";
3720
+ import path2 from "path";
3721
+ import { fileURLToPath } from "url";
3722
+ function resolvePromptsDir() {
3723
+ let dir = path2.dirname(fileURLToPath(import.meta.url));
3724
+ for (let i = 0; i < 5; i++) {
3725
+ if (fs2.existsSync(path2.join(dir, "package.json"))) {
3726
+ return path2.join(dir, "dist", "src", "prompts");
3727
+ }
3728
+ if (fs2.existsSync(path2.join(dir, "extraction.md"))) {
3729
+ return dir;
3730
+ }
3731
+ dir = path2.dirname(dir);
3732
+ }
3733
+ return path2.dirname(fileURLToPath(import.meta.url));
3734
+ }
3735
+ var PROMPTS_DIR = resolvePromptsDir();
3736
+ var promptCache = /* @__PURE__ */ new Map();
3737
+ function loadPrompt(name) {
3738
+ let cached = promptCache.get(name);
3739
+ if (!cached) {
3740
+ cached = fs2.readFileSync(path2.join(PROMPTS_DIR, `${name}.md`), "utf-8").trim();
3741
+ promptCache.set(name, cached);
3742
+ }
3743
+ return cached;
3744
+ }
3745
+ function interpolate(template, vars) {
3746
+ let result = template;
3747
+ for (const [key, value] of Object.entries(vars)) {
3748
+ result = result.replaceAll(`{{${key}}}`, value);
3749
+ }
3750
+ return result;
3751
+ }
3752
+ function formatNoteForPrompt(note) {
3753
+ return `[${note.id}] ${note.title}
3754
+ ${note.content}`;
3755
+ }
3756
+ function formatNotesForPrompt(notes) {
3757
+ return notes.map(formatNoteForPrompt).join("\n\n");
3758
+ }
3759
+ function buildExtractionPrompt(sessionId, eventCount, toolSummary, maxTokens) {
3760
+ return interpolate(loadPrompt("extraction"), {
3761
+ sessionId,
3762
+ eventCount: String(eventCount),
3763
+ toolSummary,
3764
+ maxTokens: String(maxTokens ?? 2048)
3765
+ });
3766
+ }
3767
+ function buildSummaryPrompt(sessionId, user, content, maxTokens) {
3768
+ return interpolate(loadPrompt("summary"), {
3769
+ sessionId,
3770
+ user,
3771
+ content,
3772
+ maxTokens: String(maxTokens ?? 1024)
3773
+ });
3774
+ }
3775
+ function buildTitlePrompt(summary, sessionId) {
3776
+ return interpolate(loadPrompt("title"), {
3777
+ summary,
3778
+ sessionId
3779
+ });
3780
+ }
3781
+ var ARTIFACT_TYPE_DESCRIPTIONS = [
3782
+ '"spec" \u2014 Design specifications, architecture documents',
3783
+ '"plan" \u2014 Implementation plans, roadmaps',
3784
+ '"rfc" \u2014 Requests for comment, proposals',
3785
+ '"doc" \u2014 Documentation, guides, READMEs',
3786
+ '"other" \u2014 Other substantive documents'
3787
+ ];
3788
+ function buildSimilarityPrompt(currentSummary, candidateSummary) {
3789
+ return interpolate(loadPrompt("session-similarity"), {
3790
+ currentSummary,
3791
+ candidateSummary
3792
+ });
3793
+ }
3794
+ function buildClassificationPrompt(sessionId, candidates, maxTokens) {
3795
+ const fileList = candidates.map((c) => {
3796
+ const truncated = c.content.slice(0, CANDIDATE_CONTENT_PREVIEW);
3797
+ return `### ${c.path}
3798
+ \`\`\`
3799
+ ${truncated}
3800
+ \`\`\``;
3801
+ }).join("\n\n");
3802
+ return interpolate(loadPrompt("classification"), {
3803
+ sessionId,
3804
+ fileList,
3805
+ artifactTypes: ARTIFACT_TYPE_DESCRIPTIONS.map((d) => `- ${d}`).join("\n"),
3806
+ validTypes: ARTIFACT_TYPES.join("|"),
3807
+ maxTokens: String(maxTokens ?? 1024)
3808
+ });
3809
+ }
3810
+
3576
3811
  export {
3577
3812
  require_gray_matter,
3813
+ PLAN_STATUSES,
3814
+ OBSERVATION_TYPES,
3815
+ ARTIFACT_TYPES,
3578
3816
  indexNote,
3579
- rebuildIndex
3817
+ rebuildIndex,
3818
+ stripReasoningTokens,
3819
+ extractJson,
3820
+ extractNumber,
3821
+ loadPrompt,
3822
+ formatNoteForPrompt,
3823
+ formatNotesForPrompt,
3824
+ buildExtractionPrompt,
3825
+ buildSummaryPrompt,
3826
+ buildTitlePrompt,
3827
+ buildSimilarityPrompt,
3828
+ buildClassificationPrompt
3580
3829
  };
3581
3830
  /*! Bundled license information:
3582
3831
 
@@ -3596,4 +3845,4 @@ strip-bom-string/index.js:
3596
3845
  * Released under the MIT License.
3597
3846
  *)
3598
3847
  */
3599
- //# sourceMappingURL=chunk-JJL6AMDA.js.map
3848
+ //# sourceMappingURL=chunk-24DOZEUJ.js.map