@namzu/sdk 62.1.0 → 62.2.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 (66) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/compaction/consolidation.d.ts +16 -1
  3. package/dist/compaction/consolidation.d.ts.map +1 -1
  4. package/dist/compaction/consolidation.js +8 -6
  5. package/dist/compaction/consolidation.js.map +1 -1
  6. package/dist/compaction/context-window.d.ts.map +1 -1
  7. package/dist/compaction/context-window.js +1 -0
  8. package/dist/compaction/context-window.js.map +1 -1
  9. package/dist/compaction/index.d.ts +1 -0
  10. package/dist/compaction/index.d.ts.map +1 -1
  11. package/dist/pricing/catalogue.generated.d.ts.map +1 -1
  12. package/dist/pricing/catalogue.generated.js +41 -1
  13. package/dist/pricing/catalogue.generated.js.map +1 -1
  14. package/dist/public-runtime.d.ts +3 -2
  15. package/dist/public-runtime.d.ts.map +1 -1
  16. package/dist/public-runtime.js +1 -1
  17. package/dist/public-runtime.js.map +1 -1
  18. package/dist/public-types.d.ts +1 -1
  19. package/dist/public-types.d.ts.map +1 -1
  20. package/dist/runtime/query/finalize-turn.d.ts.map +1 -1
  21. package/dist/runtime/query/finalize-turn.js +1 -1
  22. package/dist/runtime/query/finalize-turn.js.map +1 -1
  23. package/dist/runtime/query/index.d.ts +7 -0
  24. package/dist/runtime/query/index.d.ts.map +1 -1
  25. package/dist/runtime/query/index.js.map +1 -1
  26. package/dist/store/index.d.ts +2 -0
  27. package/dist/store/index.d.ts.map +1 -1
  28. package/dist/store/index.js +1 -0
  29. package/dist/store/index.js.map +1 -1
  30. package/dist/store/memory/secrets.d.ts +20 -0
  31. package/dist/store/memory/secrets.d.ts.map +1 -0
  32. package/dist/store/memory/secrets.js +84 -0
  33. package/dist/store/memory/secrets.js.map +1 -0
  34. package/dist/tools/memory/save.d.ts.map +1 -1
  35. package/dist/tools/memory/save.js +5 -0
  36. package/dist/tools/memory/save.js.map +1 -1
  37. package/dist/tools/memory/secret-guard.d.ts +8 -0
  38. package/dist/tools/memory/secret-guard.d.ts.map +1 -0
  39. package/dist/tools/memory/secret-guard.js +23 -0
  40. package/dist/tools/memory/secret-guard.js.map +1 -0
  41. package/dist/tools/memory/update.d.ts.map +1 -1
  42. package/dist/tools/memory/update.js +10 -0
  43. package/dist/tools/memory/update.js.map +1 -1
  44. package/dist/turn/index.d.ts +1 -1
  45. package/dist/turn/index.d.ts.map +1 -1
  46. package/dist/turn/memory-promoter.d.ts +20 -0
  47. package/dist/turn/memory-promoter.d.ts.map +1 -1
  48. package/dist/turn/memory-promoter.js +6 -3
  49. package/dist/turn/memory-promoter.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/compaction/consolidation.ts +29 -4
  52. package/src/compaction/context-window.ts +1 -0
  53. package/src/compaction/index.ts +1 -0
  54. package/src/pricing/catalogue.generated.ts +41 -1
  55. package/src/pricing/rates.source.json +37 -2
  56. package/src/public-runtime.ts +3 -1
  57. package/src/public-types.ts +2 -0
  58. package/src/runtime/query/finalize-turn.ts +9 -5
  59. package/src/runtime/query/index.ts +8 -0
  60. package/src/store/index.ts +2 -0
  61. package/src/store/memory/secrets.ts +105 -0
  62. package/src/tools/memory/save.ts +4 -0
  63. package/src/tools/memory/secret-guard.ts +23 -0
  64. package/src/tools/memory/update.ts +9 -0
  65. package/src/turn/index.ts +1 -1
  66. package/src/turn/memory-promoter.ts +19 -2
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Secret shapes: text that looks like a credential and must not be written to
3
+ * a memory. A memory is recalled into later prompts, sent to providers and
4
+ * kept on disk in the clear, so a key saved once is a key leaked many times.
5
+ *
6
+ * The match is on shape only. It names a reason code and never returns the
7
+ * matched text, so a caller can log the code without logging the secret.
8
+ */
9
+ const PATTERNS = [
10
+ ['private_key', /-----BEGIN [A-Z ]*PRIVATE KEY(?: BLOCK)?-----/],
11
+ [
12
+ 'provider_token',
13
+ new RegExp([
14
+ '\\bsk-(?:ant-|proj-|live-|or-v1-)?[A-Za-z0-9_-]{20,}',
15
+ '\\bgh[pousr]_[A-Za-z0-9]{30,}',
16
+ '\\bgithub_pat_[A-Za-z0-9_]{30,}',
17
+ '\\bglpat-[A-Za-z0-9_-]{16,}',
18
+ '\\bxox[abposr]-[A-Za-z0-9-]{10,}',
19
+ '\\b(?:AKIA|ASIA)[A-Z0-9]{16}\\b',
20
+ '\\bAIza[A-Za-z0-9_-]{35}\\b',
21
+ '\\bnvapi-[A-Za-z0-9_-]{20,}',
22
+ '\\bnpm_[A-Za-z0-9]{30,}',
23
+ '\\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}',
24
+ '\\bSG\\.[A-Za-z0-9_-]{16,}\\.[A-Za-z0-9_-]{16,}',
25
+ '\\bhf_[A-Za-z0-9]{30,}',
26
+ '\\bBearer\\s+[A-Za-z0-9._~+/-]{24,}=*',
27
+ ].join('|')),
28
+ ],
29
+ ['jwt', /\beyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/],
30
+ ['credentialed_url', /\b[a-z][a-z0-9+.-]*:\/\/[^\s/:@]+:[^\s/@]+@[^\s/]+/i],
31
+ ];
32
+ /** Shannon entropy of `text`, in bits per character. */
33
+ function entropy(text) {
34
+ const counts = new Map();
35
+ for (const ch of text)
36
+ counts.set(ch, (counts.get(ch) ?? 0) + 1);
37
+ let bits = 0;
38
+ for (const n of counts.values()) {
39
+ const p = n / text.length;
40
+ bits -= p * Math.log2(p);
41
+ }
42
+ return bits;
43
+ }
44
+ /** How many times the token switches between a letter and a digit. */
45
+ function letterDigitSwitches(token) {
46
+ let switches = 0;
47
+ let previous;
48
+ for (const ch of token) {
49
+ const kind = /\d/.test(ch) ? 'digit' : /[A-Za-z]/.test(ch) ? 'letter' : undefined;
50
+ if (kind === undefined)
51
+ continue;
52
+ if (previous !== undefined && previous !== kind)
53
+ switches += 1;
54
+ previous = kind;
55
+ }
56
+ return switches;
57
+ }
58
+ /**
59
+ * Random, not merely long: a long identifier with a trailing number
60
+ * (`DecisionsAbcDefGhi1234567890`) has mixed case and a digit but few
61
+ * letter-digit switches and a low spread, a key has both. A path-like token
62
+ * is a path.
63
+ */
64
+ function looksRandom(token) {
65
+ return (!token.includes('/') &&
66
+ /[A-Z]/.test(token) &&
67
+ /[a-z]/.test(token) &&
68
+ letterDigitSwitches(token) >= 4 &&
69
+ entropy(token) >= 4.5);
70
+ }
71
+ /** The first secret shape `text` has, or `undefined`. */
72
+ export function findSecretShape(text, options = {}) {
73
+ for (const [shape, pattern] of PATTERNS)
74
+ if (pattern.test(text))
75
+ return shape;
76
+ if (options.entropy === true) {
77
+ for (const token of text.match(/[A-Za-z0-9+/_=-]{32,}/g) ?? []) {
78
+ if (looksRandom(token))
79
+ return 'high_entropy';
80
+ }
81
+ }
82
+ return undefined;
83
+ }
84
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/store/memory/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,QAAQ,GAAgD;IAC7D,CAAC,aAAa,EAAE,+CAA+C,CAAC;IAChE;QACC,gBAAgB;QAChB,IAAI,MAAM,CACT;YACC,sDAAsD;YACtD,+BAA+B;YAC/B,iCAAiC;YACjC,6BAA6B;YAC7B,kCAAkC;YAClC,iCAAiC;YACjC,6BAA6B;YAC7B,6BAA6B;YAC7B,yBAAyB;YACzB,yCAAyC;YACzC,iDAAiD;YACjD,wBAAwB;YACxB,uCAAuC;SACvC,CAAC,IAAI,CAAC,GAAG,CAAC,CACX;KACD;IACD,CAAC,KAAK,EAAE,iEAAiE,CAAC;IAC1E,CAAC,kBAAkB,EAAE,qDAAqD,CAAC;CAC3E,CAAA;AAED,wDAAwD;AACxD,SAAS,OAAO,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,KAAK,MAAM,EAAE,IAAI,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,sEAAsE;AACtE,SAAS,mBAAmB,CAAC,KAAa;IACzC,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,QAAwC,CAAA;IAC5C,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QACjF,IAAI,IAAI,KAAK,SAAS;YAAE,SAAQ;QAChC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;YAAE,QAAQ,IAAI,CAAC,CAAA;QAC9D,QAAQ,GAAG,IAAI,CAAA;IAChB,CAAC;IACD,OAAO,QAAQ,CAAA;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,KAAa;IACjC,OAAO,CACN,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACnB,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CACrB,CAAA;AACF,CAAC;AAWD,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAC9B,IAAY,EACZ,UAA6B,EAAE;IAE/B,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,QAAQ;QAAE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;IAC7E,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,IAAI,WAAW,CAAC,KAAK,CAAC;gBAAE,OAAO,cAAc,CAAA;QAC9C,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAA;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/tools/memory/save.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAsEtE"}
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/tools/memory/save.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAK/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAyEtE"}
@@ -3,6 +3,7 @@ import { MemoryContentRejectedError, MemoryNameConflictError } from '../../store
3
3
  import { AGENT_MEMORY_SOURCE } from '../../store/memory/origin.js';
4
4
  import { defineTool } from '../defineTool.js';
5
5
  import { memoryFieldsSchema } from './fields.js';
6
+ import { refuseSecret } from './secret-guard.js';
6
7
  export function buildSaveMemoryTool(store) {
7
8
  return defineTool({
8
9
  name: 'save_memory',
@@ -10,6 +11,7 @@ export function buildSaveMemoryTool(store) {
10
11
  'Save one memory for later sessions in this project: a single fact that the code, the history and the docs do not already hold.',
11
12
  'Choose a type: user (who the person is and how they like to work), feedback (a rule they gave about how to work), project (a fact or decision about the work), reference (where to look for something).',
12
13
  'For feedback and project memories, write the rule or fact first, then a line starting "Why:" and a line starting "How to apply:".',
14
+ 'Never save a secret: an API key, token, password, private key or a URL with credentials in it is refused.',
13
15
  'Link a related memory by writing [[its-name]] in the content.',
14
16
  'The name must be new: a name another memory holds is refused, and the reply points to update_memory.',
15
17
  "Returns the saved memory's id and name.",
@@ -27,6 +29,9 @@ export function buildSaveMemoryTool(store) {
27
29
  destructive: false,
28
30
  concurrencySafe: true,
29
31
  async execute({ title, summary, content, tags, name, description, type }, context) {
32
+ const refused = refuseSecret([title, summary, content, description, ...(tags ?? [])]);
33
+ if (refused)
34
+ return refused;
30
35
  try {
31
36
  const { entry } = await store.create({
32
37
  title,
@@ -1 +1 @@
1
- {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/tools/memory/save.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/tools/memory/save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAGlE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACrD,OAAO,UAAU,CAAC;QACjB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE;YACZ,gIAAgI;YAChI,yMAAyM;YACzM,mIAAmI;YACnI,2GAA2G;YAC3G,+DAA+D;YAC/D,sGAAsG;YACtG,yCAAyC;SACzC,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC5D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YACpE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC5D,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACxE,GAAG,kBAAkB;SACrB,CAAC;QACF,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,IAAI;QACrB,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO;YAChF,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACrF,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAA;YAC3B,IAAI,CAAC;gBACJ,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;oBACpC,KAAK;oBACL,OAAO;oBACP,OAAO;oBACP,IAAI;oBACJ,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,QAAQ,EAAE;wBACT,MAAM,EAAE,mBAAmB;wBAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;qBACtB;iBACD,CAAC,CAAA;gBAEF,OAAO;oBACN,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,iBAAiB,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBACxF,IAAI,EAAE;wBACL,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACzD;iBACD,CAAA;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,KAAK,YAAY,0BAA0B,EAAE,CAAC;oBACjD,OAAO;wBACN,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,KAAK,CAAC,OAAO;wBACrB,KAAK,EAAE,yBAAyB;wBAChC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;qBAC9B,CAAA;gBACF,CAAC;gBACD,IAAI,CAAC,CAAC,KAAK,YAAY,uBAAuB,CAAC;oBAAE,MAAM,KAAK,CAAA;gBAC5D,OAAO;oBACN,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,mBAAmB,KAAK,CAAC,UAAU,qBAAqB,KAAK,CAAC,UAAU,8FAA8F;oBAC9K,KAAK,EAAE,4BAA4B;oBACnC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;iBAC9D,CAAA;YACF,CAAC;QACF,CAAC;KACD,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ToolResult } from '../../types/tool/index.js';
2
+ /**
3
+ * A refusal when any field a model is saving holds a secret, else `undefined`.
4
+ * The reply names the shape, never the text, so the refusal does not repeat
5
+ * the secret into the transcript.
6
+ */
7
+ export declare function refuseSecret(fields: readonly (string | undefined)[]): ToolResult | undefined;
8
+ //# sourceMappingURL=secret-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-guard.d.ts","sourceRoot":"","sources":["../../../src/tools/memory/secret-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAE3D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,UAAU,GAAG,SAAS,CAc5F"}
@@ -0,0 +1,23 @@
1
+ import { findSecretShape } from '../../store/memory/secrets.js';
2
+ /**
3
+ * A refusal when any field a model is saving holds a secret, else `undefined`.
4
+ * The reply names the shape, never the text, so the refusal does not repeat
5
+ * the secret into the transcript.
6
+ */
7
+ export function refuseSecret(fields) {
8
+ for (const field of fields) {
9
+ if (field === undefined)
10
+ continue;
11
+ const shape = findSecretShape(field);
12
+ if (shape === undefined)
13
+ continue;
14
+ return {
15
+ success: false,
16
+ output: 'The memory looks like it contains a secret (an API key, token, password, private key or a URL with credentials). Memories are recalled into later prompts and kept on disk in the clear, so it was not saved. Save where the secret lives (the variable or file name) instead of its value.',
17
+ error: 'Memory content rejected',
18
+ data: { reason: 'secret', shape },
19
+ };
20
+ }
21
+ return undefined;
22
+ }
23
+ //# sourceMappingURL=secret-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-guard.js","sourceRoot":"","sources":["../../../src/tools/memory/secret-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuC;IACnE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;QACpC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,OAAO;YACN,OAAO,EAAE,KAAK;YACd,MAAM,EACL,6RAA6R;YAC9R,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;SACjC,CAAA;IACF,CAAC;IACD,OAAO,SAAS,CAAA;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/tools/memory/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAK/D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAuGxE"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/tools/memory/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAM/D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CA+GxE"}
@@ -5,6 +5,7 @@ import { hasConditionalMemoryWrites } from '../../types/memory/index.js';
5
5
  import { defineTool } from '../defineTool.js';
6
6
  import { memoryFieldsSchema } from './fields.js';
7
7
  import { resolveMemoryReference } from './resolve.js';
8
+ import { refuseSecret } from './secret-guard.js';
8
9
  export function buildUpdateMemoryTool(store) {
9
10
  return defineTool({
10
11
  name: 'update_memory',
@@ -48,6 +49,15 @@ export function buildUpdateMemoryTool(store) {
48
49
  error: 'Conditional memory update unavailable',
49
50
  };
50
51
  }
52
+ const refused = refuseSecret([
53
+ updates.title,
54
+ updates.summary,
55
+ updates.content,
56
+ updates.description,
57
+ ...(updates.tags ?? []),
58
+ ]);
59
+ if (refused)
60
+ return refused;
51
61
  const reference = await resolveMemoryReference(store, id);
52
62
  if (!reference.found) {
53
63
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/tools/memory/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/tools/memory/update.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export type { FingerprintExec, WorkspaceFingerprintOptions } from './workspace-f
9
9
  export { checkLimitsDetailed, buildLimitConfig } from './LimitChecker.js';
10
10
  export type { LimitCheckerState, LimitCheckResult } from './LimitChecker.js';
11
11
  export { SESSION_MEMORY_TAG, createMemoryPromoter } from './memory-promoter.js';
12
- export type { MemoryPromoterOptions } from './memory-promoter.js';
12
+ export type { MemoryPromoterOptions, SessionMemoryCategory } from './memory-promoter.js';
13
13
  export { createMemoryRecallStep } from './memory-recall.js';
14
14
  export type { MemoryRecallOptions } from './memory-recall.js';
15
15
  export { createJsonClaimVerifier } from './json-claim-verifier.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/turn/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACtE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,UAAU,EACV,iBAAiB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EACN,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,4BAA4B,CAAA;AACnC,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAE9F,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAE5E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAClE,YAAY,EACX,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/turn/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACtE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,UAAU,EACV,iBAAiB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EACN,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,4BAA4B,CAAA;AACnC,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAE9F,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAE5E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/E,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAClE,YAAY,EACX,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,0BAA0B,CAAA"}
@@ -5,6 +5,15 @@
5
5
  */
6
6
  import type { MemoryStore } from '../types/memory/index.js';
7
7
  import type { PromoteMemory } from '../types/session/memory-promotion.js';
8
+ /**
9
+ * The categories that make a turn worth remembering.
10
+ *
11
+ * Ordered as they are rendered. `userRequirements` first because it is the
12
+ * most durable of the five — a constraint the user stated outlives the turn
13
+ * that heard it, whereas a discovery about a codebase expires when the
14
+ * codebase moves.
15
+ */
16
+ declare const KNOWLEDGE: readonly [readonly ["userRequirements", "What the user requires"], readonly ["decisions", "Decisions"], readonly ["discoveries", "Discoveries"], readonly ["failures", "What did not work"], readonly ["environment", "Environment"]];
8
17
  /**
9
18
  * Tag every record this promoter writes, so a host can find or prune them.
10
19
  * Also its `metadata.source`, which keeps the record out of a Markdown
@@ -30,7 +39,17 @@ export interface MemoryPromoterOptions {
30
39
  * that costs context every time it is retrieved.
31
40
  */
32
41
  readonly maxPerCategory?: number;
42
+ /**
43
+ * Decide whether one extracted claim may become part of a record. Called
44
+ * with the candidate's category (`userRequirements`, `decisions`,
45
+ * `discoveries`, `failures` or `environment`) and the claim text. A claim
46
+ * it rejects is left out; a record with no claim left is not written.
47
+ * Defaults to keeping every claim.
48
+ */
49
+ readonly acceptClaim?: (category: SessionMemoryCategory, text: string) => boolean;
33
50
  }
51
+ /** The claim categories of a {@link SessionMemoryCandidate}. */
52
+ export type SessionMemoryCategory = (typeof KNOWLEDGE)[number][0];
34
53
  /**
35
54
  * Build a promoter that writes one record per turn that learned something.
36
55
  *
@@ -40,4 +59,5 @@ export interface MemoryPromoterOptions {
40
59
  * reports it.
41
60
  */
42
61
  export declare function createMemoryPromoter(options: MemoryPromoterOptions): PromoteMemory;
62
+ export {};
43
63
  //# sourceMappingURL=memory-promoter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-promoter.d.ts","sourceRoot":"","sources":["../../src/turn/memory-promoter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,sCAAsC,CAAA;AAkBjG;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAAwB,CAAA;AAEvD,MAAM,WAAW,qBAAqB;IACrC,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAChC;AAgDD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CA8ClF"}
1
+ {"version":3,"file":"memory-promoter.d.ts","sourceRoot":"","sources":["../../src/turn/memory-promoter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,sCAAsC,CAAA;AAEjG;;;;;;;GAOG;AACH,QAAA,MAAM,SAAS,uOAMkE,CAAA;AAEjF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAAwB,CAAA;AAEvD,MAAM,WAAW,qBAAqB;IACrC,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACjF;AAED,gEAAgE;AAChE,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAqDjE;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CA+ClF"}
@@ -28,11 +28,13 @@ const KNOWLEDGE = [
28
28
  */
29
29
  export const SESSION_MEMORY_TAG = SESSION_MEMORY_SOURCE;
30
30
  /** Everything the candidate knows, as `[heading, items]`, empties dropped. */
31
- function knowledge(candidate, cap) {
31
+ function knowledge(candidate, cap, accept) {
32
32
  const out = [];
33
33
  for (const [key, heading] of KNOWLEDGE) {
34
34
  const items = [
35
- ...new Set(candidate[key].map((item) => item.trim()).filter(Boolean)),
35
+ ...new Set(candidate[key]
36
+ .map((item) => item.trim())
37
+ .filter((item) => item !== '' && accept(key, item))),
36
38
  ];
37
39
  if (items.length > 0)
38
40
  out.push([heading, items.slice(0, cap)]);
@@ -73,9 +75,10 @@ export function createMemoryPromoter(options) {
73
75
  const cap = options.maxPerCategory ?? 20;
74
76
  if (!Number.isSafeInteger(cap) || cap < 1)
75
77
  throw new Error('maxPerCategory must be a positive integer');
78
+ const accept = options.acceptClaim ?? (() => true);
76
79
  const tags = [SESSION_MEMORY_TAG, ...(options.tags ?? [])];
77
80
  return async (candidate) => {
78
- const sections = knowledge(candidate, cap);
81
+ const sections = knowledge(candidate, cap, accept);
79
82
  // Nothing learned, nothing written. Not an empty record: a store full
80
83
  // of rows describing runs that discovered nothing is a store whose
81
84
  // search results are mostly noise, and the model reads that store.
@@ -1 +1 @@
1
- {"version":3,"file":"memory-promoter.js","sourceRoot":"","sources":["../../src/turn/memory-promoter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-promoter.js","sourceRoot":"","sources":["../../src/turn/memory-promoter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@namzu/sdk",
3
- "version": "62.1.0",
3
+ "version": "62.2.1",
4
4
  "description": "Open-source AI kernel for TypeScript: runs an agent the way an operating system runs a process, with an identity and a budget, scheduled tool calls and checkpointed turns.",
5
5
  "license": "FSL-1.1-MIT",
6
6
  "engines": {
@@ -37,6 +37,25 @@ export interface ConsolidationMeta {
37
37
 
38
38
  const MAX_TASK_IN_TITLE = 72
39
39
 
40
+ /**
41
+ * A host's screen over what a consolidation may quote. Without one a
42
+ * consolidation carries the task, decisions, discoveries and failures
43
+ * verbatim, which is right for a store the operator reads and wrong for one
44
+ * that is recalled into later prompts unreviewed.
45
+ */
46
+ export interface ConsolidationScreen {
47
+ /**
48
+ * The task as it may appear in the title and body, or `undefined` to say
49
+ * it is not stated. Absent keeps the task as written.
50
+ */
51
+ readonly task?: (task: string) => string | undefined
52
+ /** Whether one item may be written down. Absent keeps every item. */
53
+ readonly keep?: (
54
+ category: 'decisions' | 'discoveries' | 'failures' | 'files',
55
+ text: string,
56
+ ) => boolean
57
+ }
58
+
40
59
  function head(text: string, max: number): string {
41
60
  const line = text.split('\n')[0]?.trim() ?? ''
42
61
  return line.length <= max ? line : `${line.slice(0, max - 1)}…`
@@ -72,16 +91,22 @@ export async function isConsolidated(
72
91
  export function consolidationEntry(
73
92
  state: WorkingState,
74
93
  meta: ConsolidationMeta,
94
+ screen?: ConsolidationScreen,
75
95
  ): CreateMemoryParams | null {
76
- const decisions = state.decisions.filter((d) => d.trim().length > 0)
77
- const discoveries = state.discoveries.filter((d) => d.trim().length > 0)
78
- const failures = state.failures.filter((f) => f.trim().length > 0)
96
+ const kept =
97
+ (category: 'decisions' | 'discoveries' | 'failures' | 'files') =>
98
+ (item: string): boolean =>
99
+ item.trim().length > 0 && (screen?.keep?.(category, item) ?? true)
100
+ const decisions = state.decisions.filter(kept('decisions'))
101
+ const discoveries = state.discoveries.filter(kept('discoveries'))
102
+ const failures = state.failures.filter(kept('failures'))
79
103
  if (decisions.length + discoveries.length + failures.length === 0) return null
80
104
 
81
- const task = state.task.trim()
105
+ const task = (screen?.task ? (screen.task(state.task.trim()) ?? '') : state.task).trim()
82
106
  const files = [...state.files.values()]
83
107
  .filter((slot) => slot.actions.some((a) => a.type !== 'read'))
84
108
  .map((slot) => slot.path)
109
+ .filter(kept('files'))
85
110
  const section = (name: string, items: readonly string[]): string[] =>
86
111
  items.length === 0 ? [] : [`## ${name}`, '', ...items.map((item) => `- ${item}`), '']
87
112
  const content = [
@@ -155,6 +155,7 @@ const WINDOWS: ReadonlyArray<readonly [prefix: string, tokens: number]> = [
155
155
  ['claude-mythos', 1_000_000],
156
156
  ['claude-opus-5', 1_000_000],
157
157
  ['claude-sonnet-5', 1_000_000],
158
+ ['claude-haiku-5', 1_000_000],
158
159
  ['claude-opus-4-8', 1_000_000],
159
160
  ['claude-opus-4-7', 1_000_000],
160
161
  ['claude-opus-4-6', 1_000_000],
@@ -109,4 +109,5 @@ export { DEFAULT_SOFT_TARGET, planSalienceWorkingSet } from './plan.js'
109
109
 
110
110
  // Episodic → semantic: what a turn learned, as the entry a later turn searches.
111
111
  export { CONSOLIDATION_TAG, consolidationEntry, isConsolidated } from './consolidation.js'
112
+ export type { ConsolidationScreen } from './consolidation.js'
112
113
  export type { ConsolidationMeta } from './consolidation.js'
@@ -5,7 +5,7 @@
5
5
  // CI re-runs the generator and fails on any difference, so a hand edit here is
6
6
  // reverted by the next run at best and reported as drift at worst.
7
7
  //
8
- // 4 vendors, 35 priced models.
8
+ // 4 vendors, 40 priced models.
9
9
 
10
10
  import type { ModelPricing } from '../utils/cost.js'
11
11
 
@@ -43,6 +43,14 @@ export const VENDOR_RATES: readonly VendorRates[] = [
43
43
  cache: { promptIncludesCacheReads: false, readCostPer1M: 0.25, writeCostPer1M: 12.5 },
44
44
  },
45
45
  ],
46
+ [
47
+ 'claude-fable-5-2',
48
+ {
49
+ inputCostPer1M: 8,
50
+ outputCostPer1M: 40,
51
+ cache: { promptIncludesCacheReads: false, readCostPer1M: 0.2, writeCostPer1M: 10 },
52
+ },
53
+ ],
46
54
  [
47
55
  'claude-haiku-4-5',
48
56
  {
@@ -67,6 +75,22 @@ export const VENDOR_RATES: readonly VendorRates[] = [
67
75
  cache: { promptIncludesCacheReads: false, readCostPer1M: 0.25, writeCostPer1M: 12.5 },
68
76
  },
69
77
  ],
78
+ [
79
+ 'claude-mythos-5-2',
80
+ {
81
+ inputCostPer1M: 8,
82
+ outputCostPer1M: 40,
83
+ cache: { promptIncludesCacheReads: false, readCostPer1M: 0.2, writeCostPer1M: 10 },
84
+ },
85
+ ],
86
+ [
87
+ 'claude-opus-4',
88
+ {
89
+ inputCostPer1M: 15,
90
+ outputCostPer1M: 75,
91
+ cache: { promptIncludesCacheReads: false, readCostPer1M: 1.5, writeCostPer1M: 18.75 },
92
+ },
93
+ ],
70
94
  [
71
95
  'claude-opus-4-1',
72
96
  {
@@ -115,6 +139,14 @@ export const VENDOR_RATES: readonly VendorRates[] = [
115
139
  cache: { promptIncludesCacheReads: false, readCostPer1M: 0.2, writeCostPer1M: 5 },
116
140
  },
117
141
  ],
142
+ [
143
+ 'claude-sonnet-4',
144
+ {
145
+ inputCostPer1M: 3,
146
+ outputCostPer1M: 15,
147
+ cache: { promptIncludesCacheReads: false, readCostPer1M: 0.3, writeCostPer1M: 3.75 },
148
+ },
149
+ ],
118
150
  [
119
151
  'claude-sonnet-4-5',
120
152
  {
@@ -139,6 +171,14 @@ export const VENDOR_RATES: readonly VendorRates[] = [
139
171
  cache: { promptIncludesCacheReads: false, readCostPer1M: 0.2, writeCostPer1M: 2.5 },
140
172
  },
141
173
  ],
174
+ [
175
+ 'claude-sonnet-5-5',
176
+ {
177
+ inputCostPer1M: 2,
178
+ outputCostPer1M: 10,
179
+ cache: { promptIncludesCacheReads: false, readCostPer1M: 0.1, writeCostPer1M: 2.5 },
180
+ },
181
+ ],
142
182
  ]),
143
183
  },
144
184
  {
@@ -56,11 +56,25 @@
56
56
  {
57
57
  "providerId": "anthropic",
58
58
  "unmetered": false,
59
- "verified": "2026-09-24",
59
+ "verified": "2026-11-10",
60
60
  "promptIncludesCacheReads": false,
61
61
  "reportsCacheWrites": true,
62
- "note": "The last two rows exist because the driver's own offline catalogue offers those models and this table did not price them — a lookup-key gap that reads as `cost unknown` and is invisible to the generator's own check, which only proves the module matches this file. `providers/anthropic` asserts the two lists agree. Vendor list prices, every row checked against its pricing page on the `verified` date. Cache read is the vendor's published 0.1x of the input rate, except on the three models it prices differently: 0.05x on claude-opus-5-5 and 0.025x on claude-fable-5-1 and claude-mythos-5-1, entered at the published rate rather than derived. Cache write is its published 1.25x for the five-minute entry, which is the default TTL and the one the driver's `cacheControl: { type: 'auto' }` asks for. claude-sonnet-5 launched at an introductory $2/$10 with $3/$15 scheduled from 2026-09-01, and this table recorded the scheduled rate; the vendor has since made $2/$10 the standard price and cancelled the increase. The table has no time dimension, so a future promotional window is still recorded at the list rate and over-reported rather than mis-modelled.",
62
+ "note": "The last two rows exist because the driver's own offline catalogue offers those models and this table did not price them — a lookup-key gap that reads as `cost unknown` and is invisible to the generator's own check, which only proves the module matches this file. `providers/anthropic` asserts the two lists agree. Vendor list prices, every row checked against its pricing page on the `verified` date. Cache read is the vendor's published 0.1x of the input rate, except on the six models it prices differently: 0.05x on claude-opus-5-5 and claude-sonnet-5-5 and 0.025x on claude-fable-5-1, claude-mythos-5-1, claude-fable-5-2 and claude-mythos-5-2, entered at the published rate rather than derived. claude-haiku-5-5 has no row on purpose: the vendor prices it by prompt length ($0.10 in / $0.50 out up to 100,000 prompt tokens, $0.50 / $2.50 above, cache counted in the length), this table holds one rate per model, and either single rate would be wrong for the other half of requests, so its cost reports unknown. Cache write is its published 1.25x for the five-minute entry, which is the default TTL and the one the driver's `cacheControl: { type: 'auto' }` asks for. claude-sonnet-5 launched at an introductory $2/$10 with $3/$15 scheduled from 2026-09-01, and this table recorded the scheduled rate; the vendor has since made $2/$10 the standard price and cancelled the increase. The table has no time dimension, so a future promotional window is still recorded at the list rate and over-reported rather than mis-modelled.",
63
63
  "models": [
64
+ {
65
+ "id": "claude-fable-5-2",
66
+ "inputPer1M": 8,
67
+ "outputPer1M": 40,
68
+ "cacheReadPer1M": 0.2,
69
+ "cacheWritePer1M": 10
70
+ },
71
+ {
72
+ "id": "claude-mythos-5-2",
73
+ "inputPer1M": 8,
74
+ "outputPer1M": 40,
75
+ "cacheReadPer1M": 0.2,
76
+ "cacheWritePer1M": 10
77
+ },
64
78
  {
65
79
  "id": "claude-fable-5-1",
66
80
  "inputPer1M": 10,
@@ -82,6 +96,13 @@
82
96
  "cacheReadPer1M": 0.2,
83
97
  "cacheWritePer1M": 5
84
98
  },
99
+ {
100
+ "id": "claude-sonnet-5-5",
101
+ "inputPer1M": 2,
102
+ "outputPer1M": 10,
103
+ "cacheReadPer1M": 0.1,
104
+ "cacheWritePer1M": 2.5
105
+ },
85
106
  {
86
107
  "id": "claude-fable-5",
87
108
  "inputPer1M": 10,
@@ -145,6 +166,13 @@
145
166
  "cacheReadPer1M": 0.1,
146
167
  "cacheWritePer1M": 1.25
147
168
  },
169
+ {
170
+ "id": "claude-sonnet-4",
171
+ "inputPer1M": 3,
172
+ "outputPer1M": 15,
173
+ "cacheReadPer1M": 0.3,
174
+ "cacheWritePer1M": 3.75
175
+ },
148
176
  {
149
177
  "id": "claude-sonnet-4-5",
150
178
  "inputPer1M": 3,
@@ -152,6 +180,13 @@
152
180
  "cacheReadPer1M": 0.3,
153
181
  "cacheWritePer1M": 3.75
154
182
  },
183
+ {
184
+ "id": "claude-opus-4",
185
+ "inputPer1M": 15,
186
+ "outputPer1M": 75,
187
+ "cacheReadPer1M": 1.5,
188
+ "cacheWritePer1M": 18.75
189
+ },
155
190
  {
156
191
  "id": "claude-opus-4-1",
157
192
  "inputPer1M": 15,
@@ -477,7 +477,7 @@ export type {
477
477
  // the model reads this store, so noise here is context spent on a turn that
478
478
  // did nothing.
479
479
  export { SESSION_MEMORY_TAG, createMemoryPromoter } from './turn/index.js'
480
- export type { MemoryPromoterOptions } from './turn/index.js'
480
+ export type { MemoryPromoterOptions, SessionMemoryCategory } from './turn/index.js'
481
481
  export { createMemoryRecallStep } from './turn/memory-recall.js'
482
482
  export type { MemoryRecallOptions } from './turn/memory-recall.js'
483
483
  export {
@@ -592,6 +592,7 @@ export {
592
592
  memoryIndexLine,
593
593
  memoryLinkNames,
594
594
  memoryOrigin,
595
+ findSecretShape,
595
596
  renderMemoryIndex,
596
597
  slugifyMemoryName,
597
598
  } from './store/index.js'
@@ -1336,6 +1337,7 @@ export {
1336
1337
  consolidationEntry,
1337
1338
  isConsolidated,
1338
1339
  } from './compaction/consolidation.js'
1340
+ export type { ConsolidationScreen } from './compaction/consolidation.js'
1339
1341
  // The sibling state-bearing system message. A host that carries a turn's
1340
1342
  // conversation into a fresh query must distinguish this ledger from the fresh
1341
1343
  // identity/environment prompt floor without copying its private header string.
@@ -216,6 +216,8 @@ export type {
216
216
  Identifiable,
217
217
  MarkdownMemoryStoreConfig,
218
218
  MemoryContentRejection,
219
+ SecretScanOptions,
220
+ SecretShape,
219
221
  MemoryImportOutcome,
220
222
  RenderedMemoryIndex,
221
223
  MemoryOrigin,
@@ -177,11 +177,15 @@ export async function* finalizeTurn(
177
177
  }
178
178
 
179
179
  if (params.consolidateInto && workingStateManager) {
180
- const entry = consolidationEntry(workingStateManager.getState(), {
181
- sessionId: ctx.sessionId,
182
- turnId: ctx.turnId,
183
- at: Date.now(),
184
- })
180
+ const entry = consolidationEntry(
181
+ workingStateManager.getState(),
182
+ {
183
+ sessionId: ctx.sessionId,
184
+ turnId: ctx.turnId,
185
+ at: Date.now(),
186
+ },
187
+ params.consolidationScreen,
188
+ )
185
189
  if (entry) {
186
190
  try {
187
191
  // Same knowledge, same record: a later turn that learned what an