@goondocks/myco 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +14 -11
  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.6.0"
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.1",
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
@@ -32,15 +32,9 @@ The agent sets up your vault, configures intelligence, and starts capturing. Wor
32
32
 
33
33
  Myco captures everything your AI agents do — sessions, decisions, plans, discoveries — and connects them into a searchable intelligence graph stored as an [Obsidian](https://obsidian.md) vault. Named after [mycorrhizal networks](https://en.wikipedia.org/wiki/Mycorrhizal_network), the underground fungal systems that connect trees in a forest, Myco is the invisible network linking your agents and team members, sharing intelligence beneath the surface.
34
34
 
35
- **For agents** — MCP tools let any agent runtime search, recall, and build on your team's accumulated knowledge.
36
- ```
37
- myco_search("how did we handle auth?") → semantically matched sessions, decisions, and linked context
38
- myco_recall("migration plan") → full decision history with session lineage
39
- myco_remember(observation) → persist a discovery for the team
40
- myco_context(tier: 3000) → pre-computed project understanding, instantly available
41
- ```
35
+ **For agents** — [12 MCP tools and 3 skills](docs/agent-tools.md) let any agent search, recall, and build on accumulated knowledge. A digest extract is injected at session start, and relevant spores are injected after each user prompt — agents get context automatically without being told to search.
42
36
 
43
- **For humans** — open the vault in Obsidian and browse the intelligence graph visually. Sessions link to plans, plans link to decisions, decisions link to spores. It's all Markdown with backlinks — your team's connected knowledge, navigable and searchable.
37
+ **For humans** — open the vault in [Obsidian](https://obsidian.md) to browse the intelligence graph visually, or use the local web dashboard to manage configuration, run operations, and monitor system health. Everything is Markdown with backlinks — your team's connected knowledge, navigable and searchable.
44
38
 
45
39
  **For teams** — the vault is a Git-friendly directory of Markdown files. Share it through your existing Git workflow.
46
40
 
@@ -52,11 +46,11 @@ A background daemon reads your agent's conversation transcript after each turn
52
46
 
53
47
  ### Curate
54
48
 
55
- As a project evolves, older observations become stale. Myco automatically detects and supersedes outdated spores when new ones are created — using vector similarity to find candidates and an LLM to judge which are truly replaced vs. merely related. Superseded spores are preserved with lineage metadata (never deleted), but filtered from search results and digest synthesis. Run `myco curate` for vault-wide cleanup, or let it happen automatically on every spore write.
49
+ As a project evolves, older observations become stale. Myco automatically detects and supersedes outdated spores when new ones are created — using vector similarity to find candidates and an LLM to judge which are truly replaced vs. merely related. Related spores are automatically consolidated into comprehensive wisdom notes during each digest cycle, compressing scattered observations into denser, higher-quality knowledge. Superseded spores are preserved with lineage metadata (never deleted), but filtered from search results and digest synthesis. Run vault-wide curation from the dashboard, or let it happen automatically.
56
50
 
57
51
  ### Digest
58
52
 
59
- A **continuous reasoning engine** runs inside the daemon, periodically synthesizing all accumulated knowledge into tiered context extracts. These pre-computed summaries give agents an instant, rich understanding of the project at session start — no searching required. Four tiers serve different needs: executive briefing (1.5K tokens), team standup (3K), deep onboarding (5K), and institutional knowledge (10K). Run `myco digest --tier 3000` to reprocess a specific tier from scratch, or `myco digest --full` for a complete rebuild.
53
+ A **continuous reasoning engine** runs inside the daemon, periodically synthesizing all accumulated knowledge into tiered context extracts. Before each digest cycle, an optional consolidation pre-pass compresses related spores into wisdom notes, ensuring the digest operates on clean, dense substrate. The pre-computed extracts give agents an instant, rich understanding of the project at session start — no searching required. Four tiers serve different needs: executive briefing (1.5K tokens), team standup (3K), deep onboarding (5K), and institutional knowledge (10K). Trigger digest cycles and manage tiers from the dashboard.
60
54
 
61
55
  ### Index
62
56
 
@@ -64,12 +58,21 @@ Every note is indexed for both keyword search (SQLite FTS5) and semantic search
64
58
 
65
59
  ### Serve
66
60
 
67
- An MCP server exposes the vault to any agent runtime. The digest extract is injected at session start for immediate context, and relevant spores are injected per-prompt for targeted intelligence. Agents build on your team's accumulated knowledge without being told to.
61
+ An MCP server exposes 12 tools to any agent runtime. Two automatic injection points ensure agents always have relevant context:
62
+
63
+ - **Session start** — the digest extract is injected via the `SessionStart` hook, giving the agent a pre-computed understanding of the project before it asks a single question.
64
+ - **Per-prompt** — after each user prompt, relevant spores are retrieved via vector search and injected via the `UserPromptSubmit` hook, providing targeted intelligence for the task at hand.
65
+
66
+ Agents build on your team's accumulated knowledge without being told to. See the [Lifecycle docs](docs/lifecycle.md) for the full event flow.
68
67
 
69
68
  ### Connect
70
69
 
71
70
  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
71
 
72
+ ### Dashboard
73
+
74
+ 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.
75
+
73
76
  ### Multi-agent
74
77
 
75
78
  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