pi-goosedump 0.12.52 → 0.12.54

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 (2) hide show
  1. package/dist/index.ts +213 -78
  2. package/package.json +2 -2
package/dist/index.ts CHANGED
@@ -2,17 +2,101 @@
2
2
  // Copyright (C) Jarkko Sakkinen 2026
3
3
 
4
4
  // src/cli.ts
5
+ import { Type as Type2 } from "@sinclair/typebox";
6
+ import { Value as Value2 } from "@sinclair/typebox/value";
5
7
  import { execFile } from "node:child_process";
6
- import { existsSync } from "node:fs";
8
+ import { existsSync, readFileSync } from "node:fs";
7
9
  import { createRequire } from "node:module";
8
10
  import { dirname, join } from "node:path";
11
+ import { fileURLToPath } from "node:url";
12
+
13
+ // src/format.ts
14
+ import { Value } from "@sinclair/typebox/value";
9
15
 
10
16
  // src/types.ts
17
+ import { Type } from "@sinclair/typebox";
11
18
  var BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:
12
19
 
13
20
  <summary>
14
21
  `;
15
22
  var BRANCH_SUMMARY_SUFFIX = "</summary>";
23
+ var GOOSE_MEMORY_TYPES = [
24
+ "decision",
25
+ "fact",
26
+ "preference",
27
+ "procedure",
28
+ "lesson"
29
+ ];
30
+ var GOOSEDUMP_MEMORY_TYPE_SCHEMA = Type.Union([
31
+ Type.Literal("decision"),
32
+ Type.Literal("fact"),
33
+ Type.Literal("preference"),
34
+ Type.Literal("procedure"),
35
+ Type.Literal("lesson")
36
+ ]);
37
+ var GOOSEDUMP_MEMORY_STATUS_SCHEMA = Type.Union([
38
+ Type.Literal("active"),
39
+ Type.Literal("superseded")
40
+ ]);
41
+ var GOOSEDUMP_MEMORY_SOURCE_SCHEMA = Type.Object({
42
+ citation_id: Type.String(),
43
+ provider: Type.String(),
44
+ session_id: Type.String(),
45
+ entry_id: Type.String(),
46
+ role: Type.String(),
47
+ observed_at: Type.Number(),
48
+ project: Type.String(),
49
+ source_path: Type.String(),
50
+ content_hash: Type.Optional(Type.String()),
51
+ snippet: Type.String()
52
+ });
53
+ var GOOSEDUMP_MEMORY_ENTITY_SCHEMA = Type.Object({
54
+ kind: Type.String(),
55
+ value: Type.String(),
56
+ origins: Type.Optional(Type.Array(Type.String()))
57
+ });
58
+ var GOOSEDUMP_MEMORY_MATCH_REASON_SCHEMA = Type.Object({
59
+ kind: Type.Union([
60
+ Type.Literal("lexical"),
61
+ Type.Literal("entity"),
62
+ Type.Literal("relation"),
63
+ Type.Literal("vector"),
64
+ Type.Literal("history")
65
+ ]),
66
+ detail: Type.String()
67
+ });
68
+ var GOOSEDUMP_MEMORY_RELATIONSHIP_SCHEMA = Type.Object({
69
+ direction: Type.Union([Type.Literal("outgoing"), Type.Literal("incoming")]),
70
+ kind: Type.Union([
71
+ Type.Literal("duplicates"),
72
+ Type.Literal("supports"),
73
+ Type.Literal("revises"),
74
+ Type.Literal("contradicts")
75
+ ]),
76
+ claim_id: Type.String(),
77
+ display_id: Type.String(),
78
+ memory_type: GOOSEDUMP_MEMORY_TYPE_SCHEMA,
79
+ text: Type.String(),
80
+ status: GOOSEDUMP_MEMORY_STATUS_SCHEMA,
81
+ rationale: Type.String()
82
+ });
83
+ var GOOSEDUMP_MEMORY_HIT_SCHEMA = Type.Object({
84
+ id: Type.String(),
85
+ display_id: Type.String(),
86
+ memory_type: GOOSEDUMP_MEMORY_TYPE_SCHEMA,
87
+ text: Type.String(),
88
+ keywords: Type.Array(Type.String()),
89
+ status: Type.Optional(GOOSEDUMP_MEMORY_STATUS_SCHEMA),
90
+ score: Type.Number(),
91
+ project: Type.String(),
92
+ valid_from: Type.Union([Type.Number(), Type.Null()]),
93
+ valid_until: Type.Union([Type.Number(), Type.Null()]),
94
+ superseded_by: Type.Optional(Type.Union([Type.String(), Type.Null()])),
95
+ related_by: Type.Optional(Type.Array(GOOSEDUMP_MEMORY_ENTITY_SCHEMA)),
96
+ relationships: Type.Array(GOOSEDUMP_MEMORY_RELATIONSHIP_SCHEMA),
97
+ match_reasons: Type.Array(GOOSEDUMP_MEMORY_MATCH_REASON_SCHEMA),
98
+ evidence: Type.Array(GOOSEDUMP_MEMORY_SOURCE_SCHEMA)
99
+ });
16
100
  var RECALL_TOKEN_BUDGET = 4096;
17
101
  var RECALL_MAX_BYTES = RECALL_TOKEN_BUDGET;
18
102
  var RECALL_DEFAULT_LIMIT = 5;
@@ -23,15 +107,47 @@ var MEMORY_HIT_SEPARATOR = `
23
107
  `;
24
108
  var MEMORY_TEXT_TRUNCATED = `
25
109
  [Entry text truncated]`;
110
+ var TURNS_BEFORE_COMPACT_MIN = 0;
111
+ var TURNS_BEFORE_COMPACT_MAX = 255;
112
+ var SUMMARY_MAX_TOKENS_MIN = 512;
113
+ var SUMMARY_MAX_TOKENS_MAX = 65536;
114
+ var TURNS_BEFORE_COMPACT_SCHEMA = Type.Integer({
115
+ minimum: TURNS_BEFORE_COMPACT_MIN,
116
+ maximum: TURNS_BEFORE_COMPACT_MAX
117
+ });
118
+ var SUMMARY_MAX_TOKENS_SCHEMA = Type.Integer({
119
+ minimum: SUMMARY_MAX_TOKENS_MIN,
120
+ maximum: SUMMARY_MAX_TOKENS_MAX
121
+ });
122
+ var ENABLE_MEMORY_SCHEMA = Type.Boolean();
123
+ var GOOSEDUMP_SETTINGS_SCHEMA = Type.Object({
124
+ turnsBeforeCompact: TURNS_BEFORE_COMPACT_SCHEMA,
125
+ summaryMaxTokens: SUMMARY_MAX_TOKENS_SCHEMA,
126
+ enableMemory: ENABLE_MEMORY_SCHEMA
127
+ });
128
+ var GOOSEDUMP_SETTING_SCHEMAS = {
129
+ turnsBeforeCompact: TURNS_BEFORE_COMPACT_SCHEMA,
130
+ summaryMaxTokens: SUMMARY_MAX_TOKENS_SCHEMA,
131
+ enableMemory: ENABLE_MEMORY_SCHEMA
132
+ };
133
+ var GOOSEDUMP_SETTING_KEYS = Object.keys(GOOSEDUMP_SETTINGS_SCHEMA.properties);
26
134
  var DEFAULT_GOOSEDUMP_SETTINGS = {
27
135
  turnsBeforeCompact: 0,
28
136
  summaryMaxTokens: 4096,
29
137
  enableMemory: false
30
138
  };
31
- var TURNS_BEFORE_COMPACT_MIN = 0;
32
- var TURNS_BEFORE_COMPACT_MAX = 255;
33
- var SUMMARY_MAX_TOKENS_MIN = 512;
34
- var SUMMARY_MAX_TOKENS_MAX = 65536;
139
+ var GOOSEDUMP_SESSION_SCHEMA = Type.Object({
140
+ id: Type.String(),
141
+ parent: Type.Union([Type.String(), Type.Null()]),
142
+ provider: Type.String(),
143
+ cwd: Type.String(),
144
+ path: Type.String(),
145
+ count: Type.Integer({ minimum: 0 }),
146
+ label: Type.Union([Type.String(), Type.Null()]),
147
+ from: Type.Union([Type.String(), Type.Null()]),
148
+ until: Type.Union([Type.String(), Type.Null()])
149
+ });
150
+ var GOOSEDUMP_SESSION_LIST_SCHEMA = Type.Array(GOOSEDUMP_SESSION_SCHEMA);
35
151
  var GOOSE_PROVIDERS = [
36
152
  "pi",
37
153
  "claude",
@@ -105,9 +221,6 @@ function isControlChar(char) {
105
221
  const code = char.charCodeAt(0);
106
222
  return code < 32 || code === 127 || code >= 128 && code <= 159;
107
223
  }
108
- function isStringArray(value) {
109
- return Array.isArray(value) && value.every((item) => typeof item === "string");
110
- }
111
224
 
112
225
  // src/format.ts
113
226
  function summarizeToolArgs(args) {
@@ -191,20 +304,11 @@ function parsePiMessages(output) {
191
304
  }
192
305
  return messages;
193
306
  }
194
- function isMemorySource(value) {
195
- return isRecord(value) && typeof value.citation_id === "string" && typeof value.provider === "string" && typeof value.session_id === "string" && typeof value.entry_id === "string" && typeof value.role === "string" && typeof value.observed_at === "number" && typeof value.project === "string" && typeof value.source_path === "string" && typeof value.snippet === "string" && (value.content_hash === undefined || typeof value.content_hash === "string");
196
- }
197
- function isMemoryMatchReason(value) {
198
- return isRecord(value) && typeof value.detail === "string" && ["lexical", "entity", "relation", "vector", "history"].includes(value.kind);
199
- }
200
- function isMemoryRelationship(value) {
201
- return isRecord(value) && ["outgoing", "incoming"].includes(value.direction) && ["duplicates", "supports", "revises", "contradicts"].includes(value.kind) && typeof value.claim_id === "string" && typeof value.display_id === "string" && ["fact", "decision", "preference", "procedure", "lesson"].includes(value.memory_type) && typeof value.text === "string" && ["active", "superseded"].includes(value.status) && typeof value.rationale === "string";
202
- }
203
307
  function parseMemoryHits(output) {
204
308
  const value = JSON.parse(output);
205
309
  if (!Array.isArray(value))
206
310
  throw new Error("goosedump memory recall returned invalid JSON");
207
- return value.filter((item) => isRecord(item) && typeof item.id === "string" && typeof item.display_id === "string" && typeof item.text === "string" && isStringArray(item.keywords) && typeof item.score === "number" && typeof item.project === "string" && (item.valid_from === null || typeof item.valid_from === "number") && (item.valid_until === null || typeof item.valid_until === "number") && (item.status === undefined || item.status === "active" || item.status === "superseded") && (item.superseded_by === undefined || item.superseded_by === null || typeof item.superseded_by === "string") && (item.related_by === undefined || Array.isArray(item.related_by) && item.related_by.every((entity) => isRecord(entity) && typeof entity.kind === "string" && typeof entity.value === "string")) && Array.isArray(item.relationships) && item.relationships.every(isMemoryRelationship) && Array.isArray(item.match_reasons) && item.match_reasons.every(isMemoryMatchReason) && ["fact", "decision", "preference", "procedure", "lesson"].includes(item.memory_type) && Array.isArray(item.evidence) && item.evidence.every(isMemorySource));
311
+ return value.filter((item) => Value.Check(GOOSEDUMP_MEMORY_HIT_SCHEMA, item));
208
312
  }
209
313
  function formatMemorySource(source) {
210
314
  const observed = new Date(source.observed_at).toISOString();
@@ -283,19 +387,53 @@ ${m.content}`).join(`
283
387
 
284
388
  // src/cli.ts
285
389
  var require2 = createRequire(import.meta.url);
390
+ var NATIVE_PACKAGE_TABLE = "native-packages.json";
391
+ var NATIVE_GOOSEDUMP_PACKAGE_SCHEMA = Type2.Object({
392
+ packageName: Type2.String({ minLength: 1 }),
393
+ binaryName: Type2.String({ minLength: 1 })
394
+ });
395
+ var NATIVE_GOOSEDUMP_PACKAGES_SCHEMA = Type2.Object({
396
+ "darwin-arm64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA,
397
+ "linux-arm64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA,
398
+ "linux-x64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA,
399
+ "win32-x64": NATIVE_GOOSEDUMP_PACKAGE_SCHEMA
400
+ });
401
+ var cachedNativePackages;
402
+ function resolveNativePackageTable() {
403
+ try {
404
+ const wrapperRequire = createRequire(resolveGoosedumpBinary());
405
+ return wrapperRequire.resolve(`./${NATIVE_PACKAGE_TABLE}`);
406
+ } catch {}
407
+ let dir = dirname(fileURLToPath(import.meta.url));
408
+ for (let i = 0;i < 8; i++) {
409
+ const candidate = join(dir, "bin", NATIVE_PACKAGE_TABLE);
410
+ if (existsSync(candidate))
411
+ return candidate;
412
+ const parent = dirname(dir);
413
+ if (parent === dir)
414
+ break;
415
+ dir = parent;
416
+ }
417
+ throw new Error("broken pi-goosedump installation: cannot resolve the native package table from @jarkkojs/goosedump");
418
+ }
419
+ function loadNativeGoosedumpPackages() {
420
+ const table = JSON.parse(readFileSync(resolveNativePackageTable(), "utf8"));
421
+ if (!Value2.Check(NATIVE_GOOSEDUMP_PACKAGES_SCHEMA, table)) {
422
+ throw new Error("broken pi-goosedump installation: native package table is invalid");
423
+ }
424
+ return table;
425
+ }
426
+ function nativeGoosedumpPackages() {
427
+ cachedNativePackages ??= loadNativeGoosedumpPackages();
428
+ return cachedNativePackages;
429
+ }
286
430
  function nativeGoosedumpPackage(target) {
287
- switch (target) {
288
- case "linux-x64":
289
- return { packageName: "@jarkkojs/goosedump-linux-x64", binaryName: "goosedump" };
290
- case "linux-arm64":
291
- return { packageName: "@jarkkojs/goosedump-linux-arm64", binaryName: "goosedump" };
292
- case "darwin-arm64":
293
- return { packageName: "@jarkkojs/goosedump-darwin-arm64", binaryName: "goosedump" };
294
- case "win32-x64":
295
- return { packageName: "@jarkkojs/goosedump-win32-x64", binaryName: "goosedump.exe" };
296
- default:
297
- throw new Error(`unsupported platform architecture: ${target}`);
431
+ const packages = nativeGoosedumpPackages();
432
+ const entry = packages[target];
433
+ if (!entry) {
434
+ throw new Error(`unsupported platform architecture: ${target}; supported platforms: ${Object.keys(packages).join(", ")}`);
298
435
  }
436
+ return entry;
299
437
  }
300
438
  function resolveGoosedumpBinary() {
301
439
  try {
@@ -400,6 +538,9 @@ async function goosedumpListSessions(signal, executablePath) {
400
538
  if (!Array.isArray(parsed)) {
401
539
  throw new Error("invalid goosedump session list JSON: expected an array");
402
540
  }
541
+ if (!Value2.Check(GOOSEDUMP_SESSION_LIST_SCHEMA, parsed)) {
542
+ throw new Error("invalid goosedump session list JSON");
543
+ }
403
544
  return parsed;
404
545
  }
405
546
  async function goosedumpRemoveSession(target, signal, executablePath) {
@@ -464,42 +605,37 @@ import { findCutPoint } from "@earendil-works/pi-coding-agent";
464
605
 
465
606
  // src/settings.ts
466
607
  import { DEFAULT_COMPACTION_SETTINGS } from "@earendil-works/pi-coding-agent";
608
+ import { Value as Value3 } from "@sinclair/typebox/value";
467
609
  import { randomUUID } from "node:crypto";
468
610
  import {
469
611
  existsSync as existsSync2,
470
612
  mkdirSync,
471
- readFileSync,
613
+ readFileSync as readFileSync2,
472
614
  renameSync,
473
615
  unlinkSync,
474
616
  writeFileSync
475
617
  } from "node:fs";
476
618
  import { homedir } from "node:os";
477
619
  import { dirname as dirname2, join as join2 } from "node:path";
478
- var GOOSEDUMP_SETTING_SPECS = {
479
- turnsBeforeCompact: {
480
- kind: "number",
481
- min: TURNS_BEFORE_COMPACT_MIN,
482
- max: TURNS_BEFORE_COMPACT_MAX
483
- },
484
- summaryMaxTokens: {
485
- kind: "number",
486
- min: SUMMARY_MAX_TOKENS_MIN,
487
- max: SUMMARY_MAX_TOKENS_MAX
488
- },
489
- enableMemory: { kind: "boolean" }
490
- };
620
+ function settingSpecFromSchema(schema) {
621
+ if (schema.type === "boolean")
622
+ return { kind: "boolean" };
623
+ const { minimum, maximum } = schema;
624
+ if (typeof minimum !== "number" || typeof maximum !== "number") {
625
+ throw new Error("goosedump setting schema is missing integer bounds");
626
+ }
627
+ return { kind: "number", min: minimum, max: maximum };
628
+ }
629
+ var GOOSEDUMP_SETTING_SPECS = Object.fromEntries(GOOSEDUMP_SETTING_KEYS.map((key) => [key, settingSpecFromSchema(GOOSEDUMP_SETTING_SCHEMAS[key])]));
491
630
  var MEMORY_DISABLED_MESSAGE = "Durable memory is disabled. Set goosedump.enableMemory to true in settings (or /goose-settings).";
492
631
  function isValidGoosedumpSettingValue(key, value) {
493
- const spec = GOOSEDUMP_SETTING_SPECS[key];
494
- if (spec.kind === "boolean")
495
- return typeof value === "boolean";
496
- return typeof value === "number" && Number.isSafeInteger(value) && value >= spec.min && value <= spec.max;
632
+ return Value3.Check(GOOSEDUMP_SETTING_SCHEMAS[key], value);
497
633
  }
498
634
  function pickValidGoosedumpSettings(raw) {
499
635
  if (!isRecord(raw))
500
636
  return {};
501
637
  const settings = {};
502
- for (const key of Object.keys(GOOSEDUMP_SETTING_SPECS)) {
638
+ for (const key of GOOSEDUMP_SETTING_KEYS) {
503
639
  const value = raw[key];
504
640
  if (!isValidGoosedumpSettingValue(key, value))
505
641
  continue;
@@ -527,7 +663,7 @@ function readJsonObject(path) {
527
663
  if (!existsSync2(path))
528
664
  return {};
529
665
  try {
530
- const parsed = JSON.parse(readFileSync(path, "utf8"));
666
+ const parsed = JSON.parse(readFileSync2(path, "utf8"));
531
667
  return isRecord(parsed) ? parsed : {};
532
668
  } catch {
533
669
  return {};
@@ -538,7 +674,7 @@ function readJsonObjectStrict(path) {
538
674
  return {};
539
675
  let parsed;
540
676
  try {
541
- parsed = JSON.parse(readFileSync(path, "utf8"));
677
+ parsed = JSON.parse(readFileSync2(path, "utf8"));
542
678
  } catch (error) {
543
679
  const message = error instanceof Error ? error.message : String(error);
544
680
  throw new Error(`${path}: ${message}`);
@@ -596,7 +732,7 @@ function validateGoosedumpSettings(path) {
596
732
  if (!isRecord(root.goosedump)) {
597
733
  throw new Error(`${path}: goosedump must be a JSON object`);
598
734
  }
599
- for (const key of Object.keys(GOOSEDUMP_SETTING_SPECS)) {
735
+ for (const key of GOOSEDUMP_SETTING_KEYS) {
600
736
  const value = root.goosedump[key];
601
737
  if (value !== undefined && !isValidGoosedumpSettingValue(key, value)) {
602
738
  throw new Error(`${path}: goosedump.${key} must be ${goosedumpSettingValidationMessage(key)}`);
@@ -1499,7 +1635,7 @@ import {
1499
1635
  defineTool,
1500
1636
  truncateHead
1501
1637
  } from "@earendil-works/pi-coding-agent";
1502
- import { Type } from "@sinclair/typebox";
1638
+ import { Type as Type3 } from "@sinclair/typebox";
1503
1639
  function memoryDisabledResult() {
1504
1640
  return textResult(MEMORY_DISABLED_MESSAGE);
1505
1641
  }
@@ -1509,18 +1645,18 @@ function requireMemoryEnabled(ctx) {
1509
1645
  return memoryDisabledResult();
1510
1646
  }
1511
1647
  function historyProviderParam() {
1512
- return Type.Optional(Type.Union(GOOSE_PROVIDERS.map((provider) => Type.Literal(provider)), {
1648
+ return Type3.Optional(Type3.Union(GOOSE_PROVIDERS.map((provider) => Type3.Literal(provider)), {
1513
1649
  default: "pi",
1514
1650
  description: PARAM_DESCRIPTIONS.provider
1515
1651
  }));
1516
1652
  }
1517
1653
  function historySessionParam() {
1518
- return Type.Optional(Type.String({
1654
+ return Type3.Optional(Type3.String({
1519
1655
  description: PARAM_DESCRIPTIONS.session
1520
1656
  }));
1521
1657
  }
1522
1658
  function historyScopeParam() {
1523
- return Type.Optional(Type.Union([Type.Literal("lineage"), Type.Literal("all")], {
1659
+ return Type3.Optional(Type3.Union([Type3.Literal("lineage"), Type3.Literal("all")], {
1524
1660
  default: "lineage",
1525
1661
  description: PARAM_DESCRIPTIONS.scope
1526
1662
  }));
@@ -1574,7 +1710,6 @@ function gooseToolMeta(name) {
1574
1710
  promptGuidelines: [...policy.guidelines]
1575
1711
  };
1576
1712
  }
1577
- var GOOSE_MEMORY_TYPES = ["decision", "fact", "preference", "procedure", "lesson"];
1578
1713
  function defineGooseTool(name, parameters, handler) {
1579
1714
  return defineTool({
1580
1715
  ...gooseToolMeta(name),
@@ -1590,7 +1725,7 @@ function defineGooseTool(name, parameters, handler) {
1590
1725
  }
1591
1726
  function registerGooseTools(pi, deps) {
1592
1727
  const { nativeExecutablePath, enqueueRemember, requestCompaction } = deps;
1593
- pi.registerTool(defineGooseTool("goose_remember", Type.Object({ ...historyTargetParams() }), async (params, _signal, ctx) => {
1728
+ pi.registerTool(defineGooseTool("goose_remember", Type3.Object({ ...historyTargetParams() }), async (params, _signal, ctx) => {
1594
1729
  const disabled = requireMemoryEnabled(ctx);
1595
1730
  if (disabled)
1596
1731
  return disabled;
@@ -1604,18 +1739,18 @@ function registerGooseTools(pi, deps) {
1604
1739
  });
1605
1740
  return textResult(`Memory learning queued for ${resolved.target}.`);
1606
1741
  }));
1607
- pi.registerTool(defineGooseTool("goose_recall", Type.Object({
1608
- query: Type.String({ description: PARAM_DESCRIPTIONS.memoryQuery }),
1609
- type: Type.Optional(Type.Union(GOOSE_MEMORY_TYPES.map((type) => Type.Literal(type)), { description: PARAM_DESCRIPTIONS.memoryType })),
1610
- allProjects: Type.Optional(Type.Boolean({
1742
+ pi.registerTool(defineGooseTool("goose_recall", Type3.Object({
1743
+ query: Type3.String({ description: PARAM_DESCRIPTIONS.memoryQuery }),
1744
+ type: Type3.Optional(Type3.Union(GOOSE_MEMORY_TYPES.map((type) => Type3.Literal(type)), { description: PARAM_DESCRIPTIONS.memoryType })),
1745
+ allProjects: Type3.Optional(Type3.Boolean({
1611
1746
  default: false,
1612
1747
  description: PARAM_DESCRIPTIONS.allProjects
1613
1748
  })),
1614
- history: Type.Optional(Type.Boolean({
1749
+ history: Type3.Optional(Type3.Boolean({
1615
1750
  default: false,
1616
1751
  description: PARAM_DESCRIPTIONS.history
1617
1752
  })),
1618
- limit: Type.Optional(Type.Integer({
1753
+ limit: Type3.Optional(Type3.Integer({
1619
1754
  minimum: 1,
1620
1755
  maximum: 20,
1621
1756
  default: 5,
@@ -1637,8 +1772,8 @@ function registerGooseTools(pi, deps) {
1637
1772
  return textResult(`No durable memory for "${params.query}"`);
1638
1773
  return textResult(formatMemoryHits(hits));
1639
1774
  }));
1640
- pi.registerTool(defineGooseTool("goose_forget", Type.Object({
1641
- target: Type.String({
1775
+ pi.registerTool(defineGooseTool("goose_forget", Type3.Object({
1776
+ target: Type3.String({
1642
1777
  description: PARAM_DESCRIPTIONS.forgetTarget
1643
1778
  })
1644
1779
  }), async (params, signal, ctx) => {
@@ -1651,16 +1786,16 @@ function registerGooseTools(pi, deps) {
1651
1786
  const res = await goosedumpMemoryForget(params.target.trim(), signal, nativeExecutablePath);
1652
1787
  return textResult(res);
1653
1788
  }));
1654
- pi.registerTool(defineGooseTool("goose_memory_status", Type.Object({}), async (_params, signal, ctx) => {
1789
+ pi.registerTool(defineGooseTool("goose_memory_status", Type3.Object({}), async (_params, signal, ctx) => {
1655
1790
  const disabled = requireMemoryEnabled(ctx);
1656
1791
  if (disabled)
1657
1792
  return disabled;
1658
1793
  return textResult(await goosedumpMemoryStatus(signal, nativeExecutablePath));
1659
1794
  }));
1660
- pi.registerTool(defineGooseTool("goose_search", Type.Object({
1661
- query: Type.String({ description: PARAM_DESCRIPTIONS.searchQuery }),
1795
+ pi.registerTool(defineGooseTool("goose_search", Type3.Object({
1796
+ query: Type3.String({ description: PARAM_DESCRIPTIONS.searchQuery }),
1662
1797
  ...historyBranchParams(),
1663
- page: Type.Optional(Type.Integer({
1798
+ page: Type3.Optional(Type3.Integer({
1664
1799
  minimum: 1,
1665
1800
  default: 1,
1666
1801
  description: PARAM_DESCRIPTIONS.page
@@ -1679,8 +1814,8 @@ function registerGooseTools(pi, deps) {
1679
1814
 
1680
1815
  ${text}`);
1681
1816
  }));
1682
- pi.registerTool(defineGooseTool("goose_get", Type.Object({
1683
- ids: Type.Array(Type.String(), {
1817
+ pi.registerTool(defineGooseTool("goose_get", Type3.Object({
1818
+ ids: Type3.Array(Type3.String(), {
1684
1819
  minItems: 1,
1685
1820
  description: PARAM_DESCRIPTIONS.entryIds
1686
1821
  }),
@@ -1695,8 +1830,8 @@ ${text}`);
1695
1830
  }
1696
1831
  return boundedHistoryResult(formatMessagesFull(messages));
1697
1832
  }));
1698
- pi.registerTool(defineGooseTool("goose_grep", Type.Object({
1699
- pattern: Type.String({ description: PARAM_DESCRIPTIONS.pattern }),
1833
+ pi.registerTool(defineGooseTool("goose_grep", Type3.Object({
1834
+ pattern: Type3.String({ description: PARAM_DESCRIPTIONS.pattern }),
1700
1835
  ...historyBranchParams()
1701
1836
  }), async (params, signal, ctx) => {
1702
1837
  const resolved = resolveHistoryTarget(ctx, "goose_grep", params);
@@ -1708,8 +1843,8 @@ ${text}`);
1708
1843
  }
1709
1844
  return boundedHistoryResult(formatMessagesCompact(messages));
1710
1845
  }));
1711
- pi.registerTool(defineGooseTool("goose_compact", Type.Object({
1712
- keep: Type.Optional(Type.Integer({
1846
+ pi.registerTool(defineGooseTool("goose_compact", Type3.Object({
1847
+ keep: Type3.Optional(Type3.Integer({
1713
1848
  minimum: 1,
1714
1849
  description: PARAM_DESCRIPTIONS.keep
1715
1850
  }))
@@ -1723,13 +1858,13 @@ ${text}`);
1723
1858
  }
1724
1859
  return textResult(compactStartedMessage(keep, result === "queued"));
1725
1860
  }));
1726
- pi.registerTool(defineGooseTool("goose_sessions", Type.Object({
1727
- action: Type.Optional(Type.Union([Type.Literal("list"), Type.Literal("delete")], {
1861
+ pi.registerTool(defineGooseTool("goose_sessions", Type3.Object({
1862
+ action: Type3.Optional(Type3.Union([Type3.Literal("list"), Type3.Literal("delete")], {
1728
1863
  default: "list",
1729
1864
  description: PARAM_DESCRIPTIONS.sessionsAction
1730
1865
  })),
1731
1866
  provider: historyProviderParam(),
1732
- session: Type.Optional(Type.String({
1867
+ session: Type3.Optional(Type3.String({
1733
1868
  description: PARAM_DESCRIPTIONS.sessionsDeleteId
1734
1869
  }))
1735
1870
  }), async (params, signal, ctx) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-goosedump",
3
- "version": "0.12.52",
3
+ "version": "0.12.54",
4
4
  "description": "Pi extension for goosedump session search, durable memory, session management, and compaction",
5
5
  "keywords": [
6
6
  "compaction",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@earendil-works/pi-tui": "^0.82.1",
41
- "@jarkkojs/goosedump": "^0.12.52",
41
+ "@jarkkojs/goosedump": "^0.12.54",
42
42
  "@sinclair/typebox": "^0.34.49"
43
43
  },
44
44
  "devDependencies": {