@rubytech/create-realagent 1.0.829 → 1.0.831

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 (121) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/config/brand.json +1 -1
  3. package/payload/platform/lib/oauth-llm/dist/index.d.ts +9 -2
  4. package/payload/platform/lib/oauth-llm/dist/index.d.ts.map +1 -1
  5. package/payload/platform/lib/oauth-llm/dist/index.js +26 -1
  6. package/payload/platform/lib/oauth-llm/dist/index.js.map +1 -1
  7. package/payload/platform/lib/oauth-llm/src/index.ts +43 -4
  8. package/payload/platform/neo4j/migrations/007-conversation-archive-source.ts +116 -0
  9. package/payload/platform/neo4j/migrations/008-adminuser-accountid-backfill.ts +85 -0
  10. package/payload/platform/neo4j/schema.cypher +12 -3
  11. package/payload/platform/plugins/admin/hooks/__tests__/archive-ingest-surface-gate.test.sh +54 -39
  12. package/payload/platform/plugins/admin/hooks/archive-ingest-surface-gate.sh +64 -26
  13. package/payload/platform/plugins/admin/mcp/dist/index.js +25 -3
  14. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  15. package/payload/platform/plugins/contacts/mcp/dist/index.js +5 -5
  16. package/payload/platform/plugins/contacts/mcp/dist/index.js.map +1 -1
  17. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts +1 -1
  18. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.d.ts.map +1 -1
  19. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js +29 -23
  20. package/payload/platform/plugins/contacts/mcp/dist/tools/contact-create.js.map +1 -1
  21. package/payload/platform/plugins/docs/references/internals.md +1 -1
  22. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
  23. package/payload/platform/plugins/memory/PLUGIN.md +2 -1
  24. package/payload/platform/plugins/memory/bin/conversation-archive-ingest.mjs +564 -0
  25. package/payload/platform/plugins/memory/bin/conversation-archive-ingest.sh +106 -0
  26. package/payload/platform/plugins/memory/mcp/dist/index.js +30 -16
  27. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  28. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/llm-classifier.test.js +4 -3
  29. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/llm-classifier.test.js.map +1 -1
  30. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js +11 -6
  31. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js.map +1 -1
  32. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.d.ts +5 -0
  33. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.d.ts.map +1 -0
  34. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.js +30 -0
  35. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/index.js.map +1 -0
  36. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/timestamp-scanner.d.ts +49 -0
  37. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/timestamp-scanner.d.ts.map +1 -0
  38. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/timestamp-scanner.js +35 -0
  39. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/timestamp-scanner.js.map +1 -0
  40. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.d.ts +47 -0
  41. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.d.ts.map +1 -0
  42. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.js +31 -0
  43. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/types.js.map +1 -0
  44. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/whatsapp-text.d.ts +3 -0
  45. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/whatsapp-text.d.ts.map +1 -0
  46. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/whatsapp-text.js +155 -0
  47. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-normalisers/whatsapp-text.js.map +1 -0
  48. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/delta-cursor.d.ts +11 -0
  49. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/delta-cursor.d.ts.map +1 -0
  50. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/delta-cursor.js +20 -0
  51. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/delta-cursor.js.map +1 -0
  52. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.d.ts +14 -0
  53. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.d.ts.map +1 -0
  54. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.js +38 -0
  55. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/derive-keys.js.map +1 -0
  56. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sender-bind.d.ts +16 -0
  57. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sender-bind.d.ts.map +1 -0
  58. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sender-bind.js +59 -0
  59. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sender-bind.js.map +1 -0
  60. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sessionize.d.ts +9 -0
  61. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sessionize.d.ts.map +1 -0
  62. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sessionize.js +32 -0
  63. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/sessionize.js.map +1 -0
  64. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/to-turn-text.d.ts +3 -0
  65. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/to-turn-text.d.ts.map +1 -0
  66. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/to-turn-text.js +29 -0
  67. package/payload/platform/plugins/memory/mcp/dist/lib/conversation-pipeline/to-turn-text.js.map +1 -0
  68. package/payload/platform/plugins/memory/mcp/dist/lib/document-chunker.d.ts +45 -0
  69. package/payload/platform/plugins/memory/mcp/dist/lib/document-chunker.d.ts.map +1 -0
  70. package/payload/platform/plugins/memory/mcp/dist/lib/document-chunker.js +125 -0
  71. package/payload/platform/plugins/memory/mcp/dist/lib/document-chunker.js.map +1 -0
  72. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.d.ts +34 -9
  73. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.d.ts.map +1 -1
  74. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.js +360 -35
  75. package/payload/platform/plugins/memory/mcp/dist/lib/llm-classifier.js.map +1 -1
  76. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.d.ts +3 -2
  77. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.d.ts.map +1 -1
  78. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.js +46 -17
  79. package/payload/platform/plugins/memory/mcp/dist/lib/llm-ranker.js.map +1 -1
  80. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-source-agnosticism.test.d.ts +2 -0
  81. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-source-agnosticism.test.d.ts.map +1 -0
  82. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-source-agnosticism.test.js +73 -0
  83. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-source-agnosticism.test.js.map +1 -0
  84. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-whatsapp-text.test.d.ts +2 -0
  85. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-whatsapp-text.test.d.ts.map +1 -0
  86. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-whatsapp-text.test.js +109 -0
  87. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-normalisers-whatsapp-text.test.js.map +1 -0
  88. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest.test.js +34 -3
  89. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-ingest.test.js.map +1 -1
  90. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +17 -0
  91. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
  92. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +34 -13
  93. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
  94. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.d.ts +18 -7
  95. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.d.ts.map +1 -1
  96. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js +24 -8
  97. package/payload/platform/plugins/memory/mcp/dist/tools/memory-ingest.js.map +1 -1
  98. package/payload/platform/plugins/memory/mcp/dist/tools/memory-rank.js +2 -2
  99. package/payload/platform/plugins/memory/mcp/dist/tools/memory-rank.js.map +1 -1
  100. package/payload/platform/plugins/memory/references/schema-base.md +2 -2
  101. package/payload/platform/plugins/memory/skills/conversation-archive/SKILL.md +133 -0
  102. package/payload/platform/plugins/memory/skills/document-ingest/SKILL.md +5 -2
  103. package/payload/platform/plugins/whatsapp/PLUGIN.md +1 -1
  104. package/payload/platform/scripts/seed-neo4j.sh +15 -15
  105. package/payload/platform/templates/specialists/agents/database-operator.md +8 -9
  106. package/payload/server/chunk-7BO5HDJC.js +10093 -0
  107. package/payload/server/chunk-BCFM2UPH.js +2305 -0
  108. package/payload/server/chunk-CV3HPX46.js +10097 -0
  109. package/payload/server/chunk-EL4DZ56X.js +1116 -0
  110. package/payload/server/chunk-J6YWEJBN.js +1116 -0
  111. package/payload/server/chunk-OCPJGZ6S.js +654 -0
  112. package/payload/server/chunk-QOJ2D26Z.js +654 -0
  113. package/payload/server/chunk-RC46ZYGT.js +2305 -0
  114. package/payload/server/client-pool-7NTEFNVQ.js +32 -0
  115. package/payload/server/client-pool-ZNGN66GN.js +32 -0
  116. package/payload/server/cloudflare-task-tracker-MHALDN54.js +19 -0
  117. package/payload/server/cloudflare-task-tracker-WE77WXSI.js +19 -0
  118. package/payload/server/maxy-edge.js +3 -3
  119. package/payload/server/neo4j-migrations-4XPNJNM6.js +490 -0
  120. package/payload/server/neo4j-migrations-6RW423E2.js +530 -0
  121. package/payload/server/server.js +30 -19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-realagent",
3
- "version": "1.0.829",
3
+ "version": "1.0.831",
4
4
  "description": "Install Real Agent — Built for agents. By agents.",
5
5
  "bin": {
6
6
  "create-realagent": "./dist/index.js"
@@ -44,7 +44,7 @@
44
44
  "plugins": {
45
45
  "core": ["admin", "memory", "docs", "cloudflare", "anthropic", "workflows", "tasks", "business-assistant", "contacts", "scheduling", "email"],
46
46
  "defaultEnabled": ["sales"],
47
- "available": ["deep-research", "waitlist", "projects", "whatsapp", "replicate", "linkedin-import", "whatsapp-import"],
47
+ "available": ["deep-research", "waitlist", "projects", "whatsapp", "replicate", "linkedin-import"],
48
48
  "excluded": ["telegram"]
49
49
  }
50
50
  }
@@ -65,16 +65,23 @@ export interface CallOauthLlmParams {
65
65
  /** Force the model to call this tool. Required when `tools` is provided. */
66
66
  toolChoiceName?: string;
67
67
  }
68
- /** Result when the call did not declare any tool — only text or fallback. */
68
+ /** Result when the call did not declare any tool — only text or fallback.
69
+ * Task 897: `stopReason` and `outputTokens` are exposed so callers can
70
+ * distinguish a `max_tokens`-truncated response (which can produce a
71
+ * one-sided fence) from a clean `end_turn`. */
69
72
  export type CallOauthLlmTextResult = {
70
73
  kind: "ok";
71
74
  text: string;
75
+ stopReason?: string;
76
+ outputTokens?: number;
72
77
  } | CallOauthLlmFallback;
73
78
  /** Result when the call forced a tool — only the tool input or fallback. */
74
79
  export type CallOauthLlmToolResult = {
75
80
  kind: "ok-tool";
76
81
  toolName: string;
77
82
  input: Record<string, unknown>;
83
+ stopReason?: string;
84
+ outputTokens?: number;
78
85
  } | CallOauthLlmFallback;
79
86
  /** Discriminated union of every possible result. Returned by the no-overload form. */
80
87
  export type CallOauthLlmResult = CallOauthLlmTextResult | CallOauthLlmToolResult;
@@ -83,7 +90,7 @@ export interface CallOauthLlmFallback {
83
90
  /** Human-readable single-line reason (for operator-visible blocker). */
84
91
  reason: string;
85
92
  /** Stable classifier — callers can pattern-match for retry/abort policy. */
86
- cause: "missing-creds" | "dead-token" | "refresh-failed" | "auth-error" | "rate-limit" | "server-error" | "network-error" | "timeout" | "empty-response" | "malformed-response" | "unexpected";
93
+ cause: "missing-creds" | "dead-token" | "refresh-failed" | "auth-error" | "rate-limit" | "server-error" | "network-error" | "timeout" | "empty-response" | "malformed-response" | "input-too-large" | "unexpected";
87
94
  }
88
95
  /**
89
96
  * Call an Anthropic model via OAuth bearer auth.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAgBH,QAAA,MAAM,iBAAiB,qBAAqB,CAAC;AAe7C,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5B,oBAAoB,CAAC;AAEzB,4EAA4E;AAC5E,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACrE,oBAAoB,CAAC;AAEzB,sFAAsF;AACtF,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,KAAK,EACD,eAAe,GACf,YAAY,GACZ,gBAAgB,GAChB,YAAY,GACZ,YAAY,GACZ,cAAc,GACd,eAAe,GACf,SAAS,GACT,gBAAgB,GAChB,oBAAoB,GACpB,YAAY,CAAC;CAClB;AAuND;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,gBAAgB,CAAC,GAC3D,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACnC,wBAAgB,YAAY,CAC1B,MAAM,EAAE,kBAAkB,GAAG;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC7E,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACnC,wBAAgB,YAAY,CAC1B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAwK/B,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAgBH,QAAA,MAAM,iBAAiB,qBAAqB,CAAC;AAe7C,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;gDAGgD;AAChD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE,oBAAoB,CAAC;AAEzB,4EAA4E;AAC5E,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACjH,oBAAoB,CAAC;AAEzB,sFAAsF;AACtF,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,KAAK,EACD,eAAe,GACf,YAAY,GACZ,gBAAgB,GAChB,YAAY,GACZ,YAAY,GACZ,cAAc,GACd,eAAe,GACf,SAAS,GACT,gBAAgB,GAChB,oBAAoB,GACpB,iBAAiB,GACjB,YAAY,CAAC;CAClB;AA8OD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,gBAAgB,CAAC,GAC3D,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACnC,wBAAgB,YAAY,CAC1B,MAAM,EAAE,kBAAkB,GAAG;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC7E,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACnC,wBAAgB,YAAY,CAC1B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAoL/B,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -47,6 +47,20 @@ const OAUTH_BETA_HEADER = "oauth-2025-04-20";
47
47
  exports.OAUTH_BETA_HEADER = OAUTH_BETA_HEADER;
48
48
  /** Refresh proactively when the token expires within this window. */
49
49
  const EXPIRING_THRESHOLD_MS = 5 * 60 * 1000;
50
+ // Anthropic's 400 response carries a JSON body whose `error.message` names the
51
+ // failure. The three phrases below are the load-bearing markers for an oversize
52
+ // input across the SDK's vocabulary; matching any one promotes the generic
53
+ // status=400 into a typed cause callers can act on (chunk, defer, surface
54
+ // remediation). Generic 400s still fall through to cause:"unexpected".
55
+ const INPUT_TOO_LARGE_MARKERS = [
56
+ "prompt is too long",
57
+ "context_length_exceeded",
58
+ "too many tokens",
59
+ ];
60
+ function isInputTooLargeBody(body) {
61
+ const lower = body.toLowerCase();
62
+ return INPUT_TOO_LARGE_MARKERS.some((m) => lower.includes(m));
63
+ }
50
64
  // ---------------------------------------------------------------------------
51
65
  // Credential reading + refresh — minimal duplicate of platform/ui claude-auth.
52
66
  // We duplicate (not import) so this lib stays self-contained and importable
@@ -294,6 +308,13 @@ async function callOauthLlm(params) {
294
308
  reason: `Anthropic server error (status=${res.status}): ${body.slice(0, 200)}`,
295
309
  };
296
310
  }
311
+ if (res.status === 400 && isInputTooLargeBody(body)) {
312
+ return {
313
+ kind: "fallback",
314
+ cause: "input-too-large",
315
+ reason: `Input exceeds Haiku context window (status=400 body=${body.slice(0, 200)}). Split the source into smaller segments.`,
316
+ };
317
+ }
297
318
  return {
298
319
  kind: "fallback",
299
320
  cause: "unexpected",
@@ -318,6 +339,8 @@ async function callOauthLlm(params) {
318
339
  reason: `Anthropic API error: ${payload.error.type ?? "unknown"} ${payload.error.message ?? ""}`,
319
340
  };
320
341
  }
342
+ const stopReason = typeof payload.stop_reason === "string" ? payload.stop_reason : undefined;
343
+ const outputTokens = typeof payload.usage?.output_tokens === "number" ? payload.usage.output_tokens : undefined;
321
344
  // When the caller forced a tool, prefer the tool_use block — its input
322
345
  // is the structured output the caller wants.
323
346
  if (toolChoiceName) {
@@ -333,6 +356,8 @@ async function callOauthLlm(params) {
333
356
  kind: "ok-tool",
334
357
  toolName: toolBlock.name ?? toolChoiceName,
335
358
  input: toolBlock.input,
359
+ stopReason,
360
+ outputTokens,
336
361
  };
337
362
  }
338
363
  const textBlock = payload.content?.find((block) => {
@@ -348,6 +373,6 @@ async function callOauthLlm(params) {
348
373
  reason: "Model returned no text content.",
349
374
  };
350
375
  }
351
- return { kind: "ok", text: textBlock.text };
376
+ return { kind: "ok", text: textBlock.text, stopReason, outputTokens };
352
377
  }
353
378
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -96,14 +96,17 @@ export interface CallOauthLlmParams {
96
96
  toolChoiceName?: string;
97
97
  }
98
98
 
99
- /** Result when the call did not declare any tool — only text or fallback. */
99
+ /** Result when the call did not declare any tool — only text or fallback.
100
+ * Task 897: `stopReason` and `outputTokens` are exposed so callers can
101
+ * distinguish a `max_tokens`-truncated response (which can produce a
102
+ * one-sided fence) from a clean `end_turn`. */
100
103
  export type CallOauthLlmTextResult =
101
- | { kind: "ok"; text: string }
104
+ | { kind: "ok"; text: string; stopReason?: string; outputTokens?: number }
102
105
  | CallOauthLlmFallback;
103
106
 
104
107
  /** Result when the call forced a tool — only the tool input or fallback. */
105
108
  export type CallOauthLlmToolResult =
106
- | { kind: "ok-tool"; toolName: string; input: Record<string, unknown> }
109
+ | { kind: "ok-tool"; toolName: string; input: Record<string, unknown>; stopReason?: string; outputTokens?: number }
107
110
  | CallOauthLlmFallback;
108
111
 
109
112
  /** Discriminated union of every possible result. Returned by the no-overload form. */
@@ -125,9 +128,26 @@ export interface CallOauthLlmFallback {
125
128
  | "timeout"
126
129
  | "empty-response"
127
130
  | "malformed-response"
131
+ | "input-too-large"
128
132
  | "unexpected";
129
133
  }
130
134
 
135
+ // Anthropic's 400 response carries a JSON body whose `error.message` names the
136
+ // failure. The three phrases below are the load-bearing markers for an oversize
137
+ // input across the SDK's vocabulary; matching any one promotes the generic
138
+ // status=400 into a typed cause callers can act on (chunk, defer, surface
139
+ // remediation). Generic 400s still fall through to cause:"unexpected".
140
+ const INPUT_TOO_LARGE_MARKERS = [
141
+ "prompt is too long",
142
+ "context_length_exceeded",
143
+ "too many tokens",
144
+ ] as const;
145
+
146
+ function isInputTooLargeBody(body: string): boolean {
147
+ const lower = body.toLowerCase();
148
+ return INPUT_TOO_LARGE_MARKERS.some((m) => lower.includes(m));
149
+ }
150
+
131
151
  // ---------------------------------------------------------------------------
132
152
  // Credential reading + refresh — minimal duplicate of platform/ui claude-auth.
133
153
  // We duplicate (not import) so this lib stays self-contained and importable
@@ -334,6 +354,13 @@ interface AnthropicMessagesResponse {
334
354
  | { type: "tool_use"; name?: string; input?: Record<string, unknown> }
335
355
  | { type: string }
336
356
  >;
357
+ /** Anthropic stop_reason — `end_turn`, `max_tokens`, `stop_sequence`,
358
+ * `tool_use`, or `pause_turn`. Surfaced as `stopReason` on `ok`/`ok-tool`
359
+ * results so callers can distinguish a truncated response from a clean
360
+ * end (Task 897 sub-scope G — fence-handling structurally). */
361
+ stop_reason?: string;
362
+ /** Anthropic output_tokens billing surface, exposed as `outputTokens`. */
363
+ usage?: { output_tokens?: number };
337
364
  error?: { type?: string; message?: string };
338
365
  }
339
366
 
@@ -465,6 +492,13 @@ export async function callOauthLlm(
465
492
  reason: `Anthropic server error (status=${res.status}): ${body.slice(0, 200)}`,
466
493
  };
467
494
  }
495
+ if (res.status === 400 && isInputTooLargeBody(body)) {
496
+ return {
497
+ kind: "fallback",
498
+ cause: "input-too-large",
499
+ reason: `Input exceeds Haiku context window (status=400 body=${body.slice(0, 200)}). Split the source into smaller segments.`,
500
+ };
501
+ }
468
502
  return {
469
503
  kind: "fallback",
470
504
  cause: "unexpected",
@@ -491,6 +525,9 @@ export async function callOauthLlm(
491
525
  };
492
526
  }
493
527
 
528
+ const stopReason = typeof payload.stop_reason === "string" ? payload.stop_reason : undefined;
529
+ const outputTokens = typeof payload.usage?.output_tokens === "number" ? payload.usage.output_tokens : undefined;
530
+
494
531
  // When the caller forced a tool, prefer the tool_use block — its input
495
532
  // is the structured output the caller wants.
496
533
  if (toolChoiceName) {
@@ -509,6 +546,8 @@ export async function callOauthLlm(
509
546
  kind: "ok-tool",
510
547
  toolName: toolBlock.name ?? toolChoiceName,
511
548
  input: toolBlock.input,
549
+ stopReason,
550
+ outputTokens,
512
551
  };
513
552
  }
514
553
 
@@ -526,7 +565,7 @@ export async function callOauthLlm(
526
565
  reason: "Model returned no text content.",
527
566
  };
528
567
  }
529
- return { kind: "ok", text: textBlock.text };
568
+ return { kind: "ok", text: textBlock.text, stopReason, outputTokens };
530
569
  }
531
570
 
532
571
  // ---------------------------------------------------------------------------
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Migration 007 — Backfill `source` and rename provenance on existing
3
+ * :ConversationArchive parents and :Section:Conversation chunks (Task 894).
4
+ *
5
+ * Pre-Task-894 the conversation-archive write path stamped every node with
6
+ * `createdByAgent = 'whatsapp-import'` and `source = 'whatsapp'`. Task 894
7
+ * generalises the path: `createdByAgent` becomes `'conversation-archive'`
8
+ * (one orchestrator, one skill, regardless of source); `source` is a property
9
+ * carrying the source format ('whatsapp', 'telegram', 'slack', …).
10
+ *
11
+ * Without this migration the diagnostic surface fragments — queries that
12
+ * filter by createdByAgent return only post-894 data; the new
13
+ * (accountId, source) index is empty for legacy archives. This migration
14
+ * rewrites both sides idempotently:
15
+ *
16
+ * 1. :ConversationArchive without `source` → SET source='whatsapp'
17
+ * (every pre-894 archive came from the whatsapp-import bin script).
18
+ * 2. :ConversationArchive.createdByAgent='whatsapp-import' →
19
+ * SET createdByAgent='conversation-archive'.
20
+ * 3. :Section:Conversation without `source` → SET source='whatsapp'.
21
+ * 4. :Section:Conversation.createdByAgent='whatsapp-import' →
22
+ * SET createdByAgent='conversation-archive'.
23
+ * 5. :HAS_SECTION / :NEXT / :PARTICIPANT_IN edges with
24
+ * createdByAgent='whatsapp-import' → SET createdByAgent='conversation-archive'.
25
+ *
26
+ * Re-runs are no-ops (each WHERE clause excludes the post-rename state).
27
+ *
28
+ * Observability:
29
+ * `[migration:conversation-archive-source]
30
+ * archives-source-set=N archives-agent-renamed=N
31
+ * chunks-source-set=N chunks-agent-renamed=N edges-agent-renamed=N`
32
+ *
33
+ * REMOVE WHEN: every install we ship has been booted once on a version
34
+ * ≥ Task 894 AND no live archive carries the legacy provenance string.
35
+ */
36
+
37
+ type Neo4jDriverLike = {
38
+ session(): {
39
+ run(
40
+ cypher: string,
41
+ params?: Record<string, unknown>,
42
+ ): Promise<{ records: Array<{ get(key: string): unknown }> }>;
43
+ close(): Promise<void>;
44
+ };
45
+ };
46
+
47
+ export async function backfillConversationArchiveSource(
48
+ driver: Neo4jDriverLike,
49
+ ): Promise<void> {
50
+ const session = driver.session();
51
+ try {
52
+ const archivesSourceSet = await runCount(
53
+ session,
54
+ `MATCH (a:ConversationArchive)
55
+ WHERE a.source IS NULL
56
+ SET a.source = 'whatsapp'
57
+ RETURN count(a) AS n`,
58
+ );
59
+
60
+ const archivesAgentRenamed = await runCount(
61
+ session,
62
+ `MATCH (a:ConversationArchive)
63
+ WHERE a.createdByAgent = 'whatsapp-import'
64
+ SET a.createdByAgent = 'conversation-archive'
65
+ RETURN count(a) AS n`,
66
+ );
67
+
68
+ const chunksSourceSet = await runCount(
69
+ session,
70
+ `MATCH (c:Section:Conversation)
71
+ WHERE c.source IS NULL
72
+ SET c.source = 'whatsapp'
73
+ RETURN count(c) AS n`,
74
+ );
75
+
76
+ const chunksAgentRenamed = await runCount(
77
+ session,
78
+ `MATCH (c:Section:Conversation)
79
+ WHERE c.createdByAgent = 'whatsapp-import'
80
+ SET c.createdByAgent = 'conversation-archive'
81
+ RETURN count(c) AS n`,
82
+ );
83
+
84
+ const edgesAgentRenamed = await runCount(
85
+ session,
86
+ `MATCH (a:ConversationArchive)-[r]-()
87
+ WHERE r.createdByAgent = 'whatsapp-import'
88
+ SET r.createdByAgent = 'conversation-archive'
89
+ RETURN count(r) AS n`,
90
+ );
91
+
92
+ console.error(
93
+ `[migration:conversation-archive-source] ` +
94
+ `archives-source-set=${archivesSourceSet} ` +
95
+ `archives-agent-renamed=${archivesAgentRenamed} ` +
96
+ `chunks-source-set=${chunksSourceSet} ` +
97
+ `chunks-agent-renamed=${chunksAgentRenamed} ` +
98
+ `edges-agent-renamed=${edgesAgentRenamed}`,
99
+ );
100
+ } finally {
101
+ await session.close();
102
+ }
103
+ }
104
+
105
+ async function runCount(
106
+ session: { run(c: string, p?: Record<string, unknown>): Promise<{ records: Array<{ get(k: string): unknown }> }> },
107
+ cypher: string,
108
+ ): Promise<number> {
109
+ const res = await session.run(cypher);
110
+ const v = res.records[0]?.get("n");
111
+ if (typeof v === "number") return v;
112
+ if (v && typeof (v as { toNumber?: () => number }).toNumber === "function") {
113
+ return (v as { toNumber: () => number }).toNumber();
114
+ }
115
+ return 0;
116
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Migration 008 — Backfill `accountId` on legacy `:AdminUser` nodes (Task 897).
3
+ *
4
+ * Pre-Task-897 the `admin-add` MERGE in admin/mcp/src/index.ts stamped only
5
+ * `userId/name/createdAt` on `:AdminUser` ON CREATE. Migration 004
6
+ * (pruneAlienAccounts) DETACH DELETEs every node whose `accountId` is not
7
+ * a valid on-disk account UUID, including null-accountId :AdminUser entries
8
+ * — silently wiping the admin's pin and Person ownership.
9
+ *
10
+ * The fix in admin/mcp/src/index.ts now stamps `accountId` ON CREATE and
11
+ * COALESCEs ON MATCH. This migration cleans the existing graphs that already
12
+ * carry the legacy null-accountId fingerprint, by reading the surviving
13
+ * `:ADMIN_OF` edge to `:LocalBusiness` and copying the LocalBusiness's
14
+ * `accountId` onto the orphan AdminUser.
15
+ *
16
+ * Migration ordering: this runs AFTER pruneAlienAccounts (migration 004).
17
+ * pruneAlienAccounts only deletes nodes whose `accountId` is *non-null but
18
+ * unknown* — null-accountId nodes survive its sweep and reach this backfill.
19
+ * After backfill, any remaining null-accountId AdminUser is a structural bug
20
+ * (no ADMIN_OF edge → cannot derive accountId) and the boot fails loudly.
21
+ *
22
+ * Observability:
23
+ * `[migration:adminuser-accountid] backfilled=N residual-null=M` — info
24
+ * once per boot. residual-null > 0 throws and crashes boot.
25
+ *
26
+ * REMOVE WHEN: every install we ship has been booted at least once on a
27
+ * version ≥ Task 897 AND no live `:AdminUser` carries a null accountId.
28
+ */
29
+
30
+ type Neo4jDriverLike = {
31
+ session(): {
32
+ run(
33
+ cypher: string,
34
+ params?: Record<string, unknown>,
35
+ ): Promise<{ records: Array<{ get(key: string): unknown }> }>;
36
+ close(): Promise<void>;
37
+ };
38
+ };
39
+
40
+ export async function backfillAdminUserAccountId(
41
+ driver: Neo4jDriverLike,
42
+ ): Promise<void> {
43
+ const session = driver.session();
44
+ try {
45
+ const backfilled = await runCount(
46
+ session,
47
+ `MATCH (au:AdminUser) WHERE au.accountId IS NULL
48
+ OPTIONAL MATCH (au)-[:ADMIN_OF]->(b:LocalBusiness)
49
+ WITH au, b WHERE b IS NOT NULL AND b.accountId IS NOT NULL
50
+ SET au.accountId = b.accountId
51
+ RETURN count(au) AS n`,
52
+ );
53
+
54
+ const residualNull = await runCount(
55
+ session,
56
+ `MATCH (au:AdminUser) WHERE au.accountId IS NULL
57
+ RETURN count(au) AS n`,
58
+ );
59
+
60
+ console.error(
61
+ `[migration:adminuser-accountid] backfilled=${backfilled} residual-null=${residualNull}`,
62
+ );
63
+
64
+ if (residualNull > 0) {
65
+ throw new Error(
66
+ `migration:adminuser-accountid: ${residualNull} :AdminUser node(s) still carry a null accountId after backfill — no ADMIN_OF edge to derive from. Manual reconciliation required (cypher-shell into the graph; either DELETE the orphan or attach a valid ADMIN_OF edge and re-run boot).`,
67
+ );
68
+ }
69
+ } finally {
70
+ await session.close();
71
+ }
72
+ }
73
+
74
+ async function runCount(
75
+ session: { run(c: string, p?: Record<string, unknown>): Promise<{ records: Array<{ get(k: string): unknown }> }> },
76
+ cypher: string,
77
+ ): Promise<number> {
78
+ const res = await session.run(cypher);
79
+ const v = res.records[0]?.get("n");
80
+ if (typeof v === "number") return v;
81
+ if (v && typeof (v as { toNumber?: () => number }).toNumber === "function") {
82
+ return (v as { toNumber: () => number }).toNumber();
83
+ }
84
+ return 0;
85
+ }
@@ -259,7 +259,10 @@ OPTIONS {
259
259
  };
260
260
 
261
261
  // ----------------------------------------------------------
262
- // ConversationArchive — chunked WhatsApp/messaging archive (Task 891).
262
+ // ConversationArchive — chunked conversation archive (Task 894 generalises
263
+ // Task 891). Source-agnostic: WhatsApp `_chat.txt`, Telegram, Signal,
264
+ // LinkedIn DMs, Zoom transcript, meeting minutes, iMessage, Slack — every
265
+ // source flows through the same shape with `source` as the discriminator.
263
266
  //
264
267
  // :ConversationArchive parent + :Section:Conversation chunks (HAS_SECTION + NEXT chain).
265
268
  // MERGE-keyed on conversationIdentity = sha256(accountId + ":" + sortedParticipantElementIds).
@@ -269,8 +272,11 @@ OPTIONS {
269
272
  //
270
273
  // :PARTICIPANT_IN edges from :Person/:AdminUser to :ConversationArchive are
271
274
  // MERGEd on every ingest (idempotent); the operator confirms each participant
272
- // up front via the document-ingest skill's chat-mode participant flow
273
- // (Task 894 — supersedes the prior whatsapp-import skill).
275
+ // up front via the conversation-archive skill flow.
276
+ //
277
+ // `source` is a closed enum ('whatsapp' | 'telegram' | 'signal' |
278
+ // 'linkedin-messages' | 'zoom-transcript' | 'meeting-minutes' | 'imessage' |
279
+ // 'slack' | 'other') — see `conversation-normalisers/types.ts`.
274
280
  // ----------------------------------------------------------
275
281
 
276
282
  CREATE CONSTRAINT conversation_archive_identity_unique IF NOT EXISTS
@@ -282,6 +288,9 @@ FOR (a:ConversationArchive) ON (a.accountId);
282
288
  CREATE INDEX conversation_archive_session IF NOT EXISTS
283
289
  FOR (a:ConversationArchive) ON (a.createdBySession);
284
290
 
291
+ CREATE INDEX conversation_archive_account_source IF NOT EXISTS
292
+ FOR (a:ConversationArchive) ON (a.accountId, a.source);
293
+
285
294
  CREATE VECTOR INDEX conversation_archive_embedding IF NOT EXISTS
286
295
  FOR (a:ConversationArchive) ON (a.embedding)
287
296
  OPTIONS {