@hyperlynq/synaptic 0.7.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 (98) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +427 -0
  3. package/build/scripts/rebuild-index.d.ts +5 -0
  4. package/build/scripts/rebuild-index.js +33 -0
  5. package/build/src/cli/init.d.ts +13 -0
  6. package/build/src/cli/init.js +222 -0
  7. package/build/src/cli/init.js.map +1 -0
  8. package/build/src/cli/pre-commit.d.ts +6 -0
  9. package/build/src/cli/pre-commit.js +159 -0
  10. package/build/src/cli/pre-commit.js.map +1 -0
  11. package/build/src/cli.d.ts +2 -0
  12. package/build/src/cli.js +36 -0
  13. package/build/src/cli.js.map +1 -0
  14. package/build/src/hooks/pre-compact.d.ts +6 -0
  15. package/build/src/hooks/pre-compact.js +64 -0
  16. package/build/src/hooks/pre-compact.js.map +1 -0
  17. package/build/src/hooks/session-start.d.ts +13 -0
  18. package/build/src/hooks/session-start.js +277 -0
  19. package/build/src/hooks/session-start.js.map +1 -0
  20. package/build/src/hooks/stop.d.ts +7 -0
  21. package/build/src/hooks/stop.js +248 -0
  22. package/build/src/hooks/stop.js.map +1 -0
  23. package/build/src/index.d.ts +1 -0
  24. package/build/src/index.js +8 -0
  25. package/build/src/index.js.map +1 -0
  26. package/build/src/server.d.ts +6 -0
  27. package/build/src/server.js +133 -0
  28. package/build/src/server.js.map +1 -0
  29. package/build/src/storage/embedder.d.ts +27 -0
  30. package/build/src/storage/embedder.js +126 -0
  31. package/build/src/storage/embedder.js.map +1 -0
  32. package/build/src/storage/git.d.ts +20 -0
  33. package/build/src/storage/git.js +98 -0
  34. package/build/src/storage/git.js.map +1 -0
  35. package/build/src/storage/maintenance.d.ts +9 -0
  36. package/build/src/storage/maintenance.js +46 -0
  37. package/build/src/storage/maintenance.js.map +1 -0
  38. package/build/src/storage/markdown.d.ts +21 -0
  39. package/build/src/storage/markdown.js +79 -0
  40. package/build/src/storage/markdown.js.map +1 -0
  41. package/build/src/storage/paths.d.ts +6 -0
  42. package/build/src/storage/paths.js +17 -0
  43. package/build/src/storage/paths.js.map +1 -0
  44. package/build/src/storage/project.d.ts +2 -0
  45. package/build/src/storage/project.js +35 -0
  46. package/build/src/storage/project.js.map +1 -0
  47. package/build/src/storage/session.d.ts +1 -0
  48. package/build/src/storage/session.js +17 -0
  49. package/build/src/storage/session.js.map +1 -0
  50. package/build/src/storage/sqlite.d.ts +102 -0
  51. package/build/src/storage/sqlite.js +830 -0
  52. package/build/src/storage/sqlite.js.map +1 -0
  53. package/build/src/storage/watcher.d.ts +22 -0
  54. package/build/src/storage/watcher.js +126 -0
  55. package/build/src/storage/watcher.js.map +1 -0
  56. package/build/src/tools/context-archive.d.ts +11 -0
  57. package/build/src/tools/context-archive.js +13 -0
  58. package/build/src/tools/context-archive.js.map +1 -0
  59. package/build/src/tools/context-chain.d.ts +12 -0
  60. package/build/src/tools/context-chain.js +26 -0
  61. package/build/src/tools/context-chain.js.map +1 -0
  62. package/build/src/tools/context-cochanges.d.ts +20 -0
  63. package/build/src/tools/context-cochanges.js +25 -0
  64. package/build/src/tools/context-cochanges.js.map +1 -0
  65. package/build/src/tools/context-delete-rule.d.ts +11 -0
  66. package/build/src/tools/context-delete-rule.js +12 -0
  67. package/build/src/tools/context-delete-rule.js.map +1 -0
  68. package/build/src/tools/context-dna.d.ts +18 -0
  69. package/build/src/tools/context-dna.js +197 -0
  70. package/build/src/tools/context-dna.js.map +1 -0
  71. package/build/src/tools/context-git-index.d.ts +17 -0
  72. package/build/src/tools/context-git-index.js +59 -0
  73. package/build/src/tools/context-git-index.js.map +1 -0
  74. package/build/src/tools/context-list-rules.d.ts +8 -0
  75. package/build/src/tools/context-list-rules.js +11 -0
  76. package/build/src/tools/context-list-rules.js.map +1 -0
  77. package/build/src/tools/context-list.d.ts +26 -0
  78. package/build/src/tools/context-list.js +42 -0
  79. package/build/src/tools/context-list.js.map +1 -0
  80. package/build/src/tools/context-resolve-pattern.d.ts +11 -0
  81. package/build/src/tools/context-resolve-pattern.js +9 -0
  82. package/build/src/tools/context-resolve-pattern.js.map +1 -0
  83. package/build/src/tools/context-save-rule.d.ts +14 -0
  84. package/build/src/tools/context-save-rule.js +15 -0
  85. package/build/src/tools/context-save-rule.js.map +1 -0
  86. package/build/src/tools/context-save.d.ts +26 -0
  87. package/build/src/tools/context-save.js +68 -0
  88. package/build/src/tools/context-save.js.map +1 -0
  89. package/build/src/tools/context-search.d.ts +31 -0
  90. package/build/src/tools/context-search.js +99 -0
  91. package/build/src/tools/context-search.js.map +1 -0
  92. package/build/src/tools/context-session.d.ts +13 -0
  93. package/build/src/tools/context-session.js +29 -0
  94. package/build/src/tools/context-session.js.map +1 -0
  95. package/build/src/tools/context-status.d.ts +13 -0
  96. package/build/src/tools/context-status.js +15 -0
  97. package/build/src/tools/context-status.js.map +1 -0
  98. package/package.json +57 -0
@@ -0,0 +1,35 @@
1
+ import { execSync } from "node:child_process";
2
+ import { basename } from "node:path";
3
+ import { isGitRepo } from "./git.js";
4
+ let cachedProject = null;
5
+ export function detectProject(cwd) {
6
+ if (cachedProject !== null)
7
+ return cachedProject;
8
+ const dir = cwd ?? process.cwd();
9
+ // Try git remote name first
10
+ if (isGitRepo(dir)) {
11
+ try {
12
+ const remote = execSync("git remote get-url origin", {
13
+ cwd: dir,
14
+ encoding: "utf-8",
15
+ timeout: 3000,
16
+ }).trim();
17
+ // Parse repo name from URL: git@github.com:user/repo.git or https://github.com/user/repo.git
18
+ const match = remote.match(/\/([^/]+?)(?:\.git)?$/) ?? remote.match(/:([^/]+?)(?:\.git)?$/);
19
+ if (match) {
20
+ cachedProject = match[1];
21
+ return cachedProject;
22
+ }
23
+ }
24
+ catch {
25
+ // Fall through to folder name
26
+ }
27
+ }
28
+ // Fall back to folder name
29
+ cachedProject = basename(dir) || null;
30
+ return cachedProject;
31
+ }
32
+ export function resetProjectCache() {
33
+ cachedProject = null;
34
+ }
35
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/storage/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,aAAa,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEjC,4BAA4B;IAC5B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,2BAA2B,EAAE;gBACnD,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,6FAA6F;YAC7F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC5F,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzB,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACtC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function getSessionId(): string;
@@ -0,0 +1,17 @@
1
+ import { createHash } from "node:crypto";
2
+ let cachedSessionId = null;
3
+ export function getSessionId() {
4
+ if (cachedSessionId)
5
+ return cachedSessionId;
6
+ // Check env var first (Claude Code may expose this)
7
+ const envSession = process.env.CLAUDE_SESSION_ID ?? process.env.SESSION_ID;
8
+ if (envSession) {
9
+ cachedSessionId = envSession;
10
+ return cachedSessionId;
11
+ }
12
+ // Fallback: hash of pid + ppid + start time
13
+ const raw = `${process.pid}-${process.ppid}-${Date.now()}`;
14
+ cachedSessionId = createHash("sha256").update(raw).digest("hex").slice(0, 12);
15
+ return cachedSessionId;
16
+ }
17
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/storage/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C,MAAM,UAAU,YAAY;IAC1B,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,oDAAoD;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC3E,IAAI,UAAU,EAAE,CAAC;QACf,eAAe,GAAG,UAAU,CAAC;QAC7B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,4CAA4C;IAC5C,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC3D,eAAe,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,102 @@
1
+ import type { ContextEntry } from "./markdown.js";
2
+ export declare class ContextIndex {
3
+ private db;
4
+ static assignTier(type: string, explicitTier?: string): "ephemeral" | "working" | "longterm";
5
+ constructor(dbPath?: string);
6
+ private init;
7
+ private migrate;
8
+ insert(entry: ContextEntry): number;
9
+ insertVec(entryRowid: number, embedding: Float32Array): void;
10
+ search(query: string, opts?: {
11
+ type?: string;
12
+ days?: number;
13
+ limit?: number;
14
+ includeArchived?: boolean;
15
+ }): ContextEntry[];
16
+ searchVec(embedding: Float32Array, limit: number): Array<{
17
+ rowid: number;
18
+ distance: number;
19
+ }>;
20
+ getByRowids(rowids: number[]): ContextEntry[];
21
+ list(opts?: {
22
+ days?: number;
23
+ type?: string;
24
+ includeArchived?: boolean;
25
+ }): ContextEntry[];
26
+ status(): {
27
+ totalEntries: number;
28
+ dateRange: {
29
+ earliest: string;
30
+ latest: string;
31
+ } | null;
32
+ dbSizeBytes: number;
33
+ tierDistribution: Record<string, number>;
34
+ archivedCount: number;
35
+ activePatterns: number;
36
+ };
37
+ clearAll(): void;
38
+ getRowidsByIds(ids: string[]): number[];
39
+ archiveEntries(ids: string[]): number;
40
+ bumpAccess(ids: string[]): void;
41
+ /** Increment access_count and set last_accessed for a given entry ID */
42
+ touchEntry(id: string): boolean;
43
+ hybridSearch(query: string, embedding: Float32Array, opts?: {
44
+ type?: string;
45
+ days?: number;
46
+ limit?: number;
47
+ tier?: string;
48
+ includeArchived?: boolean;
49
+ project?: string | null;
50
+ }): ContextEntry[];
51
+ /** Archive ephemeral entries based on access-aware windows */
52
+ decayEphemeral(): number;
53
+ /** Demote working entries based on access-aware idle windows */
54
+ demoteIdle(): number;
55
+ /** Promote decisions/insights older than 7 days to longterm */
56
+ promoteStable(): number;
57
+ /** Promote ephemeral entries accessed 3+ times to working */
58
+ promoteFrequent(): number;
59
+ getEmbedding(entryId: string): Float32Array | null;
60
+ findConsolidationCandidates(threshold?: number): Array<{
61
+ label: string;
62
+ entries: ContextEntry[];
63
+ }>;
64
+ hasEntryWithTag(tag: string): boolean;
65
+ findByTag(tag: string): ContextEntry[];
66
+ findSimilarIssues(embedding: Float32Array, days?: number, distanceThreshold?: number): ContextEntry[];
67
+ createOrUpdatePattern(label: string, entryIds: string[]): string;
68
+ getActivePatterns(): Array<{
69
+ id: string;
70
+ label: string;
71
+ entryIds: string[];
72
+ occurrenceCount: number;
73
+ firstSeen: string;
74
+ lastSeen: string;
75
+ }>;
76
+ getPatternForEntry(entryId: string): {
77
+ id: string;
78
+ occurrenceCount: number;
79
+ } | null;
80
+ resolvePattern(patternId: string): boolean;
81
+ saveRule(label: string, content: string): number;
82
+ listRules(): Array<ContextEntry & {
83
+ label: string;
84
+ }>;
85
+ deleteRule(label: string): boolean;
86
+ upsertFilePair(project: string, fileA: string, fileB: string, date: string): void;
87
+ getCoChanges(project: string, file: string, limit?: number): Array<{
88
+ file: string;
89
+ count: number;
90
+ lastSeen: string;
91
+ }>;
92
+ listBySession(sessionId: string, opts?: {
93
+ type?: string;
94
+ }): ContextEntry[];
95
+ /** Update an entry's content (for consolidation) */
96
+ updateEntryContent(id: string, newContent: string): boolean;
97
+ /** Merge tags from source entries into a target entry */
98
+ mergeTagsInto(targetId: string, sourceIds: string[]): void;
99
+ /** Change tier for an entry */
100
+ changeTier(id: string, tier: string): boolean;
101
+ close(): void;
102
+ }