@elevasis/sdk 1.44.2 → 1.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/dist/cli.cjs +1001 -652
  2. package/dist/index.d.ts +1045 -509
  3. package/dist/index.js +748 -690
  4. package/dist/node/index.d.ts +105 -97
  5. package/dist/test-utils/index.d.ts +42 -28
  6. package/dist/test-utils/index.js +549 -732
  7. package/dist/worker/index.d.ts +12112 -0
  8. package/dist/worker/index.js +211 -186
  9. package/package.json +6 -9
  10. package/reference/_navigation.md +151 -21
  11. package/reference/_reference-manifest.json +186 -4
  12. package/reference/claude-config.md +8 -0
  13. package/reference/core/index.mdx +3 -3
  14. package/reference/examples/organization-model.ts +117 -111
  15. package/reference/index.mdx +4 -4
  16. package/reference/rules/active-change-index.md +40 -54
  17. package/reference/rules/agent-runtime.md +81 -0
  18. package/reference/rules/agent-start-here.md +71 -163
  19. package/reference/rules/deployment.md +33 -10
  20. package/reference/rules/error-handling.md +26 -0
  21. package/reference/rules/execution.md +13 -0
  22. package/reference/rules/frontend.md +10 -3
  23. package/reference/rules/observability.md +9 -1
  24. package/reference/rules/operations.md +26 -17
  25. package/reference/rules/organization-model.md +74 -88
  26. package/reference/rules/organization-os.md +71 -88
  27. package/reference/rules/package-taxonomy.md +11 -2
  28. package/reference/rules/platform.md +13 -7
  29. package/reference/rules/shared-types.md +15 -0
  30. package/reference/rules/task-tracking.md +30 -5
  31. package/reference/rules/ui.md +145 -3
  32. package/reference/rules/vibe-intents.md +271 -0
  33. package/reference/rules/vibe.md +17 -243
  34. package/reference/scaffold/core/organization-graph.mdx +111 -97
  35. package/reference/scaffold/core/organization-model.mdx +234 -214
  36. package/reference/scaffold/operations/propagation-pipeline.md +1 -1
  37. package/reference/scaffold/operations/scaffold-maintenance.md +19 -18
  38. package/reference/scaffold/operations/workflow-recipes.md +71 -19
  39. package/reference/scaffold/recipes/add-a-feature.md +156 -146
  40. package/reference/scaffold/recipes/add-a-resource.md +123 -117
  41. package/reference/scaffold/recipes/customize-crm-actions.md +25 -10
  42. package/reference/scaffold/recipes/customize-knowledge-browser.md +52 -117
  43. package/reference/scaffold/recipes/customize-organization-model.md +161 -149
  44. package/reference/scaffold/recipes/extend-a-base-entity.md +156 -140
  45. package/reference/scaffold/recipes/extend-crm.md +16 -11
  46. package/reference/scaffold/recipes/extend-lead-gen.md +25 -7
  47. package/reference/scaffold/recipes/gate-by-feature-or-admin.md +160 -118
  48. package/reference/scaffold/recipes/index.md +2 -2
  49. package/reference/scaffold/recipes/query-the-knowledge-graph.md +23 -23
  50. package/reference/scaffold/reference/contracts.md +12 -1
  51. package/reference/scaffold/reference/glossary.md +3 -3
  52. package/reference/scaffold/reference/system-interface-capabilities.md +5 -4
  53. package/reference/scaffold/ui/composition-extensibility.mdx +271 -232
  54. package/reference/scaffold/ui/feature-flags-and-gating.md +14 -6
  55. package/reference/scaffold/ui/feature-shell.mdx +279 -62
  56. package/reference/scaffold/ui/recipes.md +229 -197
  57. package/reference/sdk/cli-management.mdx +77 -29
  58. package/reference/sdk/concepts.mdx +2 -0
  59. package/reference/sdk/define-builders.mdx +76 -0
  60. package/reference/sdk/deployment/command-center.mdx +6 -2
  61. package/reference/sdk/deployment/execution-reference.mdx +64 -186
  62. package/reference/sdk/deployment/index.mdx +2 -0
  63. package/reference/sdk/exports.mdx +4 -4
  64. package/reference/sdk/framework/agent.mdx +49 -119
  65. package/reference/sdk/framework/index.mdx +46 -65
  66. package/reference/sdk/framework/project-structure.mdx +150 -205
  67. package/reference/sdk/framework/tutorial-system.mdx +2 -2
  68. package/reference/sdk/human-in-the-loop.mdx +152 -0
  69. package/reference/sdk/index.mdx +6 -7
  70. package/reference/sdk/platform-tools/index.mdx +12 -0
  71. package/reference/sdk/platform-tools/type-safety.mdx +4 -0
  72. package/reference/sdk/project-deployment-spec.mdx +131 -0
  73. package/reference/sdk/resources/index.mdx +23 -7
  74. package/reference/sdk/resources/patterns.mdx +54 -24
  75. package/reference/sdk/resources/types.mdx +7 -4
  76. package/reference/sdk/templates/data-enrichment.mdx +7 -3
  77. package/reference/sdk/templates/email-sender.mdx +139 -135
  78. package/reference/sdk/templates/lead-scorer.mdx +5 -1
  79. package/reference/sdk/templates/pdf-generator.mdx +155 -151
  80. package/reference/sdk/templates/recurring-job.mdx +195 -189
  81. package/reference/sdk/templates/text-classifier.mdx +4 -0
  82. package/reference/sdk/templates/web-scraper.mdx +139 -135
  83. package/reference/spine/spine-primer.md +135 -96
  84. package/reference/ui/index.mdx +14 -7
  85. package/dist/types/worker/adapters/anymailfinder.d.ts +0 -14
  86. package/dist/types/worker/adapters/apify.d.ts +0 -14
  87. package/dist/types/worker/adapters/approval.d.ts +0 -23
  88. package/dist/types/worker/adapters/attio.d.ts +0 -22
  89. package/dist/types/worker/adapters/clickup.d.ts +0 -22
  90. package/dist/types/worker/adapters/create-adapter.d.ts +0 -41
  91. package/dist/types/worker/adapters/crm.d.ts +0 -20
  92. package/dist/types/worker/adapters/dropbox.d.ts +0 -14
  93. package/dist/types/worker/adapters/email.d.ts +0 -25
  94. package/dist/types/worker/adapters/execution.d.ts +0 -22
  95. package/dist/types/worker/adapters/gmail.d.ts +0 -14
  96. package/dist/types/worker/adapters/google-sheets.d.ts +0 -14
  97. package/dist/types/worker/adapters/index.d.ts +0 -33
  98. package/dist/types/worker/adapters/instantly.d.ts +0 -14
  99. package/dist/types/worker/adapters/lead.d.ts +0 -28
  100. package/dist/types/worker/adapters/list.d.ts +0 -9
  101. package/dist/types/worker/adapters/llm.d.ts +0 -45
  102. package/dist/types/worker/adapters/millionverifier.d.ts +0 -14
  103. package/dist/types/worker/adapters/notification.d.ts +0 -28
  104. package/dist/types/worker/adapters/pdf.d.ts +0 -22
  105. package/dist/types/worker/adapters/projects.d.ts +0 -20
  106. package/dist/types/worker/adapters/resend.d.ts +0 -14
  107. package/dist/types/worker/adapters/scheduler.d.ts +0 -25
  108. package/dist/types/worker/adapters/signature-api.d.ts +0 -14
  109. package/dist/types/worker/adapters/storage.d.ts +0 -33
  110. package/dist/types/worker/adapters/stripe.d.ts +0 -14
  111. package/dist/types/worker/adapters/tomba.d.ts +0 -14
  112. package/dist/types/worker/index.d.ts +0 -60
  113. package/dist/types/worker/platform.d.ts +0 -90
  114. package/dist/types/worker/utils.d.ts +0 -9
  115. package/reference/claude-config/Overview.md +0 -230
  116. package/reference/claude-config/hooks/post-edit-validate.mjs +0 -98
  117. package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +0 -187
  118. package/reference/claude-config/hooks/tool-failure-recovery.mjs +0 -73
  119. package/reference/claude-config/registries/graph-skills.json +0 -4
  120. package/reference/claude-config/registries/knowledge-flags.json +0 -154
  121. package/reference/claude-config/registries/skill-coverage.json +0 -20
  122. package/reference/claude-config/rules/active-change-index.md +0 -22
  123. package/reference/claude-config/rules/agent-start-here.md +0 -22
  124. package/reference/claude-config/rules/deployment.md +0 -22
  125. package/reference/claude-config/rules/error-handling.md +0 -22
  126. package/reference/claude-config/rules/execution.md +0 -22
  127. package/reference/claude-config/rules/frontend.md +0 -22
  128. package/reference/claude-config/rules/observability.md +0 -22
  129. package/reference/claude-config/rules/operations.md +0 -22
  130. package/reference/claude-config/rules/organization-model.md +0 -22
  131. package/reference/claude-config/rules/organization-os.md +0 -22
  132. package/reference/claude-config/rules/package-taxonomy.md +0 -22
  133. package/reference/claude-config/rules/platform.md +0 -22
  134. package/reference/claude-config/rules/shared-types.md +0 -22
  135. package/reference/claude-config/rules/task-tracking.md +0 -22
  136. package/reference/claude-config/rules/topbar-actions.md +0 -70
  137. package/reference/claude-config/rules/ui.md +0 -22
  138. package/reference/claude-config/rules/vibe.md +0 -22
  139. package/reference/claude-config/scripts/statusline-command.js +0 -18
  140. package/reference/claude-config/settings.json +0 -30
  141. package/reference/claude-config/skills/client/SKILL.md +0 -201
  142. package/reference/claude-config/skills/deploy/SKILL.md +0 -159
  143. package/reference/claude-config/skills/dsp/SKILL.md +0 -66
  144. package/reference/claude-config/skills/elevasis/SKILL.md +0 -251
  145. package/reference/claude-config/skills/explore/SKILL.md +0 -78
  146. package/reference/claude-config/skills/git-sync/SKILL.md +0 -166
  147. package/reference/claude-config/skills/om/SKILL.md +0 -475
  148. package/reference/claude-config/skills/om/operations/build.md +0 -237
  149. package/reference/claude-config/skills/om/operations/codify-level-a.md +0 -109
  150. package/reference/claude-config/skills/om/operations/codify-level-b.md +0 -159
  151. package/reference/claude-config/skills/om/operations/customers.md +0 -114
  152. package/reference/claude-config/skills/om/operations/features.md +0 -88
  153. package/reference/claude-config/skills/om/operations/goals.md +0 -123
  154. package/reference/claude-config/skills/om/operations/identity.md +0 -97
  155. package/reference/claude-config/skills/om/operations/labels.md +0 -110
  156. package/reference/claude-config/skills/om/operations/offerings.md +0 -114
  157. package/reference/claude-config/skills/om/operations/roles.md +0 -104
  158. package/reference/claude-config/skills/om/operations/scaffold.md +0 -163
  159. package/reference/claude-config/skills/om/operations/techStack.md +0 -38
  160. package/reference/claude-config/skills/project/SKILL.md +0 -1114
  161. package/reference/claude-config/skills/run-ui/SKILL.md +0 -73
  162. package/reference/claude-config/skills/save/SKILL.md +0 -183
  163. package/reference/claude-config/skills/setup/SKILL.md +0 -290
  164. package/reference/claude-config/skills/status/SKILL.md +0 -59
  165. package/reference/claude-config/skills/submit-request/SKILL.md +0 -180
  166. package/reference/claude-config/skills/sync/SKILL.md +0 -47
  167. package/reference/claude-config/skills/tutorial/SKILL.md +0 -259
  168. package/reference/claude-config/skills/tutorial/progress-template.md +0 -74
  169. package/reference/claude-config/skills/tutorial/technical.md +0 -1303
  170. package/reference/claude-config/skills/tutorial/vibe-coder.md +0 -890
  171. package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +0 -27
  172. package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +0 -30
  173. package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +0 -73
  174. package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +0 -86
  175. package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +0 -55
  176. package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +0 -97
  177. package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +0 -112
  178. package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +0 -93
  179. package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +0 -58
  180. package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +0 -56
  181. package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +0 -71
  182. package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +0 -83
  183. package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +0 -59
  184. package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +0 -42
  185. package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +0 -60
  186. package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +0 -37
  187. package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +0 -34
  188. package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +0 -38
  189. package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +0 -32
  190. package/reference/claude-config/sync-notes/2026-05-09-command-system.md +0 -33
  191. package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +0 -69
  192. package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +0 -30
  193. package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +0 -45
  194. package/reference/claude-config/sync-notes/2026-05-15-om-skill-rename-and-write-family.md +0 -52
  195. package/reference/claude-config/sync-notes/2026-05-17-sdk-boundary-consolidation.md +0 -33
  196. package/reference/claude-config/sync-notes/2026-05-20-om-define-helpers.md +0 -32
  197. package/reference/claude-config/sync-notes/2026-05-22-access-model-and-right-panel.md +0 -43
  198. package/reference/claude-config/sync-notes/2026-05-22-lead-gen-tenant-config.md +0 -40
  199. package/reference/claude-config/sync-notes/2026-05-22-org-model-multi-file-split.md +0 -61
  200. package/reference/claude-config/sync-notes/2026-05-23-branding-names-to-identity.md +0 -49
  201. package/reference/claude-config/sync-notes/2026-05-23-lead-gen-manage-access.md +0 -31
  202. package/reference/claude-config/sync-notes/2026-05-23-om-deployment-drift-detection.md +0 -42
  203. package/reference/claude-config/sync-notes/2026-05-23-om-full-model-deploy-contract.md +0 -33
  204. package/reference/claude-config/sync-notes/2026-05-23-ui-sdk-package-fixes.md +0 -37
  205. package/reference/claude-config/sync-notes/2026-05-24-platform-invite-router-core-baseline.md +0 -28
  206. package/reference/claude-config/sync-notes/2026-05-24-system-interface-readiness.md +0 -43
  207. package/reference/claude-config/sync-notes/2026-05-25-invitation-login-loader.md +0 -26
  208. package/reference/claude-config/sync-notes/2026-05-25-om-topbar-requests.md +0 -33
  209. package/reference/claude-config/sync-notes/2026-05-25-system-interface-profile-registry-and-substrate.md +0 -35
  210. package/reference/claude-config/sync-notes/2026-05-25-tenant-om-scaffold-cli.md +0 -49
  211. package/reference/claude-config/sync-notes/2026-05-25-vibe-operate-intent.md +0 -47
  212. package/reference/claude-config/sync-notes/2026-05-28-om-snapshot-sdk-workflow-config.md +0 -33
  213. package/reference/claude-config/sync-notes/2026-05-30-client-source-and-om-profiles.md +0 -39
  214. package/reference/claude-config/sync-notes/2026-06-02-knowledge-nested-group-routing.md +0 -27
  215. package/reference/claude-config/sync-notes/2026-06-02-nest-projects-under-platform.md +0 -45
  216. package/reference/claude-config/sync-notes/2026-06-03-skill-autogen-and-client-skill.md +0 -34
  217. package/reference/claude-config/sync-notes/2026-06-04-scaffold-registry-lane-severity.md +0 -34
  218. package/reference/claude-config/sync-notes/2026-06-05-appearance-app-mode-decouple.md +0 -29
  219. package/reference/claude-config/sync-notes/2026-06-05-ontology-endpoint-rename-and-knowledge-browser-ui.md +0 -86
  220. package/reference/claude-config/sync-notes/2026-06-06-om-build-systems-scaffold.md +0 -47
  221. package/reference/claude-config/sync-notes/2026-06-06-om-item-copy-references.md +0 -50
  222. package/reference/claude-config/sync-notes/2026-06-08-knowledge-base-page-not-found-fix.md +0 -76
  223. package/reference/claude-config/sync-notes/2026-06-09-agent-sessions-public-agent-chat-route.md +0 -75
  224. package/reference/claude-config/sync-notes/2026-06-09-sdk-cli-load-org-model-resolution.md +0 -42
  225. package/reference/claude-config/sync-notes/2026-06-12-agent-grants-visualizer-operations.md +0 -30
  226. package/reference/claude-config/sync-notes/2026-06-14-session-ux-and-project-cli-json.md +0 -33
  227. package/reference/claude-config/sync-notes/2026-06-14-shared-session-conversation-view.md +0 -26
  228. package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +0 -46
  229. package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +0 -34
  230. package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +0 -52
  231. package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +0 -47
  232. package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +0 -75
  233. package/reference/claude-config/sync-notes/2026-07-23-agent-session-memory.md +0 -49
  234. package/reference/claude-config/sync-notes/2026-07-23-workos-org-marker.md +0 -50
  235. package/reference/claude-config/sync-notes/2026-07-24-claude-5-models-and-session-surface-fixes.md +0 -116
  236. package/reference/claude-config/sync-notes/2026-07-27-agent-strict-output-and-turn-drift.md +0 -73
  237. package/reference/claude-config/sync-notes/2026-07-28-agent-reply-is-its-own-field.md +0 -84
  238. package/reference/claude-config/sync-notes/2026-07-30-login-screen-and-member-provisioning-state.md +0 -114
  239. package/reference/claude-config/sync-notes/2026-08-02-auth-guard-defaults-and-truncation-fix.md +0 -122
  240. package/reference/claude-config/sync-notes/2026-08-03-cli-gateway-errors-and-request-timeout.md +0 -120
  241. package/reference/claude-config/sync-notes/README.md +0 -43
  242. package/reference/sdk/framework/interaction-guidance.mdx +0 -182
  243. package/reference/sdk/framework/memory.mdx +0 -326
  244. package/reference/sdk/framework/resource-documentation.mdx +0 -90
  245. package/reference/sdk/roadmap.mdx +0 -164
@@ -2465,6 +2465,23 @@ var Workflow = class {
2465
2465
 
2466
2466
  // ../core/src/execution/engine/agent/observability/logging.ts
2467
2467
  function createAgentLogger(logger, agentId, sessionId) {
2468
+ function emitAction(actionType, message, iteration, startTime, endTime, duration) {
2469
+ const event = {
2470
+ type: "agent",
2471
+ agentId,
2472
+ lifecycle: "iteration",
2473
+ eventType: "action",
2474
+ iteration,
2475
+ actionType,
2476
+ startTime,
2477
+ endTime,
2478
+ duration,
2479
+ data: { message },
2480
+ ...sessionId && { sessionId }
2481
+ // Include sessionId if present
2482
+ };
2483
+ logger.info("action", event);
2484
+ }
2468
2485
  return {
2469
2486
  lifecycle(lifecycle, stage, data) {
2470
2487
  let event;
@@ -2531,21 +2548,15 @@ function createAgentLogger(logger, agentId, sessionId) {
2531
2548
  logger.info("reasoning", event);
2532
2549
  },
2533
2550
  action(actionType, message, iteration, startTime, endTime, duration) {
2534
- const event = {
2535
- type: "agent",
2536
- agentId,
2537
- lifecycle: "iteration",
2538
- eventType: "action",
2539
- iteration,
2540
- actionType,
2541
- startTime,
2542
- endTime,
2543
- duration,
2544
- data: { message },
2545
- ...sessionId && { sessionId }
2546
- // Include sessionId if present
2547
- };
2548
- logger.info("action", event);
2551
+ emitAction(actionType, message, iteration, startTime, endTime, duration);
2552
+ },
2553
+ async timed(actionType, iteration, work, message) {
2554
+ const startTime = Date.now();
2555
+ const result = await work();
2556
+ const endTime = Date.now();
2557
+ const resolvedActionType = typeof actionType === "function" ? actionType(result) : actionType;
2558
+ emitAction(resolvedActionType, message(result), iteration, startTime, endTime, endTime - startTime);
2559
+ return result;
2549
2560
  },
2550
2561
  toolCall(toolName, iteration, startTime, endTime, duration, success, error, input, output) {
2551
2562
  const event = {
@@ -2601,6 +2612,11 @@ every response:
2601
2612
  and never continue the response envelope in the reasoning text -- nextActions is a separate field
2602
2613
  that you fill separately. A response carrying reasoning alone is discarded and retried.
2603
2614
 
2615
+ **Prose fields take real characters, never escape sequences.** A line break in ${includeMessage ? "message or reasoning" : "reasoning"} is
2616
+ a real line break -- not the two characters \\n. A quotation mark is the character ", not \\". The
2617
+ response is serialized for you; typing the escape yourself puts those literal characters into the
2618
+ stored text and in front of the reader.
2619
+
2604
2620
  ## Rules
2605
2621
 
2606
2622
  - Batch independent tool calls in one iteration (faster execution)
@@ -3166,7 +3182,7 @@ function buildIterationResponseSchemaUncached(tools, capabilities) {
3166
3182
  if (capabilities.message !== "off") {
3167
3183
  properties.message = {
3168
3184
  type: "string",
3169
- description: "Your reply to the user, as plain prose. This is the ONLY field the user sees. Use an empty string only when this iteration just calls tools and you have nothing to say yet."
3185
+ description: 'Your reply to the user, as plain prose. This is the ONLY field the user sees. Use an empty string only when this iteration just calls tools and you have nothing to say yet. Write real line breaks and real quotation marks -- the two characters \\n are not a line break, and \\" is not a quotation mark. Serialization is handled for you.'
3170
3186
  };
3171
3187
  }
3172
3188
  properties.reasoning = { type: "string", description: "Your reasoning process" };
@@ -3186,7 +3202,15 @@ function buildIterationResponseSchemaUncached(tools, capabilities) {
3186
3202
  type: "object",
3187
3203
  properties: {
3188
3204
  key: { type: "string" },
3189
- value: { type: "string" }
3205
+ value: {
3206
+ type: "string",
3207
+ // `memoryOps` has NO framework prompt section -- a grep across `prompt-sections/`
3208
+ // returns zero memory references -- so this description is the only framework-owned
3209
+ // lever on how a memory value is written. It matters more here than in `message`:
3210
+ // a session-memory value is re-sent on every iteration of every subsequent turn and
3211
+ // never ages out, so one literal escape stored here is one the model re-reads forever.
3212
+ description: "Stored verbatim and replayed to you on every later turn. Write real line breaks and real quotation marks -- the two characters \\n are not a line break."
3213
+ }
3190
3214
  },
3191
3215
  required: ["key", "value"],
3192
3216
  additionalProperties: false
@@ -3205,6 +3229,59 @@ function buildIterationResponseSchemaUncached(tools, capabilities) {
3205
3229
  };
3206
3230
  }
3207
3231
 
3232
+ // ../core/src/execution/engine/agent/reasoning/adapters/prose-escapes.ts
3233
+ var BACKSLASH = String.fromCharCode(92);
3234
+ function normalizeProseEscapes(text) {
3235
+ if (!text.includes(BACKSLASH)) return text;
3236
+ let out = "";
3237
+ let i = 0;
3238
+ while (i < text.length) {
3239
+ const char = text[i];
3240
+ if (char !== BACKSLASH || i + 1 >= text.length) {
3241
+ out += char;
3242
+ i += 1;
3243
+ continue;
3244
+ }
3245
+ switch (text[i + 1]) {
3246
+ case BACKSLASH:
3247
+ out += BACKSLASH + BACKSLASH;
3248
+ i += 2;
3249
+ break;
3250
+ case "n":
3251
+ out += "\n";
3252
+ i += 2;
3253
+ break;
3254
+ case "r":
3255
+ if (text[i + 2] === BACKSLASH && text[i + 3] === "n") {
3256
+ out += "\n";
3257
+ i += 4;
3258
+ } else {
3259
+ out += "\n";
3260
+ i += 2;
3261
+ }
3262
+ break;
3263
+ case "t":
3264
+ out += " ";
3265
+ i += 2;
3266
+ break;
3267
+ case '"':
3268
+ out += '"';
3269
+ i += 2;
3270
+ break;
3271
+ default:
3272
+ out += char;
3273
+ i += 1;
3274
+ }
3275
+ }
3276
+ return out;
3277
+ }
3278
+ function normalizeMemoryValue(value) {
3279
+ if (typeof value !== "string") return value;
3280
+ const trimmed = value.trim();
3281
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) return value;
3282
+ return normalizeProseEscapes(value);
3283
+ }
3284
+
3208
3285
  // ../core/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts
3209
3286
  var MemoryKeyValuePairSchema = z.object({ key: z.string(), value: z.any() });
3210
3287
  var MemorySetSchema = z.union([z.record(z.string(), z.any()), z.array(MemoryKeyValuePairSchema)]).transform((value) => {
@@ -3216,13 +3293,33 @@ var MemoryOperationsSchema = z.object({
3216
3293
  // Accept any value type - framework will stringify
3217
3294
  delete: z.array(z.string()).optional()
3218
3295
  });
3219
- var AgentIterationOutputSchema = z.object({
3296
+ var AgentIterationOutputObjectSchema = z.object({
3220
3297
  reasoning: z.string(),
3221
3298
  message: z.string().optional(),
3222
3299
  memoryOps: MemoryOperationsSchema.optional(),
3223
3300
  nextActions: z.array(AgentActionSchema)
3224
3301
  });
3225
- var REQUIRED_ITERATION_KEYS = Object.entries(AgentIterationOutputSchema.shape).filter(([, fieldSchema]) => !fieldSchema.isOptional()).map(([key]) => key);
3302
+ function normalizeIterationProse(output) {
3303
+ const normalized = { ...output };
3304
+ normalized.reasoning = normalizeProseEscapes(output.reasoning);
3305
+ if (typeof output.message === "string") {
3306
+ normalized.message = normalizeProseEscapes(output.message);
3307
+ }
3308
+ if (output.memoryOps?.set) {
3309
+ normalized.memoryOps = {
3310
+ ...output.memoryOps,
3311
+ set: Object.fromEntries(
3312
+ Object.entries(output.memoryOps.set).map(([key, value]) => [key, normalizeMemoryValue(value)])
3313
+ )
3314
+ };
3315
+ }
3316
+ normalized.nextActions = output.nextActions.map(
3317
+ (action) => action.type === "message" ? { ...action, text: normalizeProseEscapes(action.text) } : action
3318
+ );
3319
+ return normalized;
3320
+ }
3321
+ var AgentIterationOutputSchema = AgentIterationOutputObjectSchema.transform(normalizeIterationProse);
3322
+ var REQUIRED_ITERATION_KEYS = Object.entries(AgentIterationOutputObjectSchema.shape).filter(([, fieldSchema]) => !fieldSchema.isOptional()).map(([key]) => key);
3226
3323
  function withSynthesizedMessage(nextActions, message) {
3227
3324
  const text = message?.trim();
3228
3325
  if (!text) {
@@ -3357,66 +3454,21 @@ async function processReasoning(iterationContext) {
3357
3454
  reasoning: response.reasoning
3358
3455
  });
3359
3456
  iterationContext.logger.reasoning(response.reasoning, iterationContext.iteration, startTime, endTime, duration);
3360
- const memoryStartTime = Date.now();
3361
- iterationContext.memoryManager.addToHistory({
3362
- type: "reasoning",
3363
- content: response.reasoning,
3364
- turnNumber: iterationContext.executionContext.sessionTurnNumber ?? null,
3365
- iterationNumber: iterationContext.iteration,
3366
- source: "model"
3367
- });
3368
- const memoryEndTime = Date.now();
3369
- const memoryDuration = memoryEndTime - memoryStartTime;
3370
- iterationContext.logger.action(
3457
+ await iterationContext.logger.timed(
3371
3458
  "memory-reasoning",
3372
- `Stored reasoning (${response.reasoning.length} chars), history size: ${iterationContext.memoryManager.getHistoryLength()}, actions: ${response.nextActions.map((a) => a.type).join(", ")}`,
3373
3459
  iterationContext.iteration,
3374
- memoryStartTime,
3375
- memoryEndTime,
3376
- memoryDuration
3460
+ () => iterationContext.memoryManager.addToHistory({
3461
+ type: "reasoning",
3462
+ content: response.reasoning,
3463
+ turnNumber: iterationContext.executionContext.sessionTurnNumber ?? null,
3464
+ iterationNumber: iterationContext.iteration,
3465
+ source: "model"
3466
+ }),
3467
+ () => `Stored reasoning (${response.reasoning.length} chars), history size: ${iterationContext.memoryManager.getHistoryLength()}, actions: ${response.nextActions.map((a) => a.type).join(", ")}`
3377
3468
  );
3378
3469
  return response;
3379
3470
  }
3380
3471
 
3381
- // ../core/src/execution/engine/agent/memory/domains.ts
3382
- var MEMORY_DOMAINS = {
3383
- /**
3384
- * Tool-owned keys
3385
- * Updated automatically by tools as side effects
3386
- * LLM cannot modify these via memoryOps
3387
- *
3388
- * Tools manage complex structured data (caches, indexes, etc.)
3389
- * that would be error-prone for LLM to update via JSON strings.
3390
- *
3391
- * No tool currently writes these three keys, so in practice the guard reserves the names
3392
- * against the LLM rather than arbitrating a live conflict. That is still enforcement --
3393
- * see `validateMemoryKeyOwnership` in `./utils` -- not dead code.
3394
- */
3395
- TOOL_OWNED: [
3396
- "notion-pages-cache",
3397
- // Notion tools manage page hierarchy
3398
- "github-repo-cache",
3399
- // GitHub tools manage repository structure
3400
- "slack-channel-cache"
3401
- // Slack tools manage channel data
3402
- ]
3403
- /**
3404
- * LLM-owned keys
3405
- * All keys NOT in TOOL_OWNED
3406
- * Managed via memoryOps by agent reasoning
3407
- *
3408
- * LLM manages semantic memory (business context, decisions, etc.)
3409
- * that requires understanding and judgment.
3410
- */
3411
- };
3412
- function isToolOwnedKey(key) {
3413
- return MEMORY_DOMAINS.TOOL_OWNED.includes(key);
3414
- }
3415
- function getKeyOwner(key) {
3416
- if (isToolOwnedKey(key)) return "tool";
3417
- return "llm";
3418
- }
3419
-
3420
3472
  // ../core/src/execution/engine/agent/memory/utils.ts
3421
3473
  function addToolError(memoryManager, action, errorMessage, iteration, turnNumber = null, metadata) {
3422
3474
  memoryManager.addToHistory({
@@ -3440,11 +3492,10 @@ function addToolError(memoryManager, action, errorMessage, iteration, turnNumber
3440
3492
  });
3441
3493
  }
3442
3494
  function validateMemoryKeyOwnership(key, logger, iteration) {
3443
- if (isToolOwnedKey(key)) {
3444
- const owner = getKeyOwner(key);
3495
+ if (key.startsWith("_")) {
3445
3496
  logger.action(
3446
3497
  "memory-set-rejected",
3447
- `Rejected LLM update to ${owner}-managed key: ${key}`,
3498
+ `Rejected LLM update to framework-reserved key: ${key}`,
3448
3499
  iteration,
3449
3500
  Date.now(),
3450
3501
  Date.now(),
@@ -3686,25 +3737,19 @@ async function executeToolCall(iterationContext, action) {
3686
3737
  action.input,
3687
3738
  boundedResult
3688
3739
  );
3689
- const memoryStartTime = Date.now();
3690
3740
  const memoryContent = typeof boundedResult === "string" ? boundedResult : JSON.stringify(boundedResult);
3691
- iterationContext.memoryManager.addToHistory({
3692
- type: "tool-result",
3693
- content: memoryContent,
3694
- toolName: action.name,
3695
- turnNumber: iterationContext.executionContext.sessionTurnNumber ?? null,
3696
- iterationNumber: iterationContext.iteration,
3697
- source: "tool"
3698
- });
3699
- const memoryEndTime = Date.now();
3700
- const memoryDuration = memoryEndTime - memoryStartTime;
3701
- iterationContext.logger.action(
3741
+ await iterationContext.logger.timed(
3702
3742
  "memory-tool-result",
3703
- `Stored tool-result for ${action.name} (${memoryContent.length} chars), history size: ${iterationContext.memoryManager.getHistoryLength()}`,
3704
3743
  iterationContext.iteration,
3705
- memoryStartTime,
3706
- memoryEndTime,
3707
- memoryDuration
3744
+ () => iterationContext.memoryManager.addToHistory({
3745
+ type: "tool-result",
3746
+ content: memoryContent,
3747
+ toolName: action.name,
3748
+ turnNumber: iterationContext.executionContext.sessionTurnNumber ?? null,
3749
+ iterationNumber: iterationContext.iteration,
3750
+ source: "tool"
3751
+ }),
3752
+ () => `Stored tool-result for ${action.name} (${memoryContent.length} chars), history size: ${iterationContext.memoryManager.getHistoryLength()}`
3708
3753
  );
3709
3754
  } catch (error) {
3710
3755
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -3727,29 +3772,25 @@ async function executeToolCall(iterationContext, action) {
3727
3772
  action.input,
3728
3773
  void 0
3729
3774
  );
3730
- const memoryStartTime = Date.now();
3731
- const metadata = error instanceof ToolingError ? {
3732
- errorType: error.errorType,
3733
- severity: error.severity,
3734
- isRetryable: error.isRetryable()
3735
- } : void 0;
3736
- addToolError(
3737
- iterationContext.memoryManager,
3738
- action,
3739
- errorMessage,
3740
- iterationContext.iteration,
3741
- iterationContext.executionContext.sessionTurnNumber ?? null,
3742
- metadata
3743
- );
3744
- const memoryEndTime = Date.now();
3745
- const memoryDuration = memoryEndTime - memoryStartTime;
3746
- iterationContext.logger.action(
3775
+ await iterationContext.logger.timed(
3747
3776
  "memory-tool-error",
3748
- `Stored error for ${action.name}: ${errorMessage}, history size: ${iterationContext.memoryManager.getHistoryLength()}`,
3749
3777
  iterationContext.iteration,
3750
- memoryStartTime,
3751
- memoryEndTime,
3752
- memoryDuration
3778
+ () => {
3779
+ const metadata = error instanceof ToolingError ? {
3780
+ errorType: error.errorType,
3781
+ severity: error.severity,
3782
+ isRetryable: error.isRetryable()
3783
+ } : void 0;
3784
+ addToolError(
3785
+ iterationContext.memoryManager,
3786
+ action,
3787
+ errorMessage,
3788
+ iterationContext.iteration,
3789
+ iterationContext.executionContext.sessionTurnNumber ?? null,
3790
+ metadata
3791
+ );
3792
+ },
3793
+ () => `Stored error for ${action.name}: ${errorMessage}, history size: ${iterationContext.memoryManager.getHistoryLength()}`
3753
3794
  );
3754
3795
  }
3755
3796
  }
@@ -3987,11 +4028,13 @@ async function processMemory(memoryManager, response, logger, iteration) {
3987
4028
  if (!validateMemoryKeyOwnership(key, logger, iteration)) {
3988
4029
  continue;
3989
4030
  }
3990
- const startTime = Date.now();
3991
- const stringValue = typeof content === "string" ? content : JSON.stringify(content);
3992
- memoryManager.set(key, stringValue);
3993
- const endTime = Date.now();
3994
- logger.action("memory-set", `Set: ${key}`, iteration, startTime, endTime, endTime - startTime);
4031
+ await logger.timed(
4032
+ "memory-set",
4033
+ iteration,
4034
+ // Auto-stringify non-string values (arrays, objects, etc.)
4035
+ () => memoryManager.set(key, typeof content === "string" ? content : JSON.stringify(content)),
4036
+ () => `Set: ${key}`
4037
+ );
3995
4038
  }
3996
4039
  }
3997
4040
  if (memoryOps.delete) {
@@ -3999,21 +4042,12 @@ async function processMemory(memoryManager, response, logger, iteration) {
3999
4042
  if (!validateMemoryKeyOwnership(key, logger, iteration)) {
4000
4043
  continue;
4001
4044
  }
4002
- const startTime = Date.now();
4003
- const deleted = memoryManager.delete(key);
4004
- const endTime = Date.now();
4005
- if (deleted) {
4006
- logger.action("memory-delete", `Deleted: ${key}`, iteration, startTime, endTime, endTime - startTime);
4007
- } else {
4008
- logger.action(
4009
- "memory-delete-missing",
4010
- `Attempted to delete non-existent key: ${key}`,
4011
- iteration,
4012
- startTime,
4013
- endTime,
4014
- endTime - startTime
4015
- );
4016
- }
4045
+ await logger.timed(
4046
+ (deleted) => deleted ? "memory-delete" : "memory-delete-missing",
4047
+ iteration,
4048
+ () => memoryManager.delete(key),
4049
+ (deleted) => deleted ? `Deleted: ${key}` : `Attempted to delete non-existent key: ${key}`
4050
+ );
4017
4051
  }
4018
4052
  }
4019
4053
  }
@@ -4140,7 +4174,6 @@ var MemoryManager = class {
4140
4174
  this.constraints = constraints;
4141
4175
  this.logger = logger;
4142
4176
  }
4143
- cachedSnapshot;
4144
4177
  /**
4145
4178
  * Rolling correction for `estimateTokens`'s bias, learned from real provider usage.
4146
4179
  * `undefined` until the first `recordActualUsage` call -- the cold-start state, where
@@ -4429,21 +4462,15 @@ var MemoryManager = class {
4429
4462
  };
4430
4463
  }
4431
4464
  /**
4432
- * Create memory snapshot for persistence
4433
- * Caches snapshot internally for later retrieval
4465
+ * Create a memory snapshot for persistence.
4466
+ *
4467
+ * Stateless: every call returns a fresh `structuredClone` of the current memory, so the caller
4468
+ * owns caching if it needs to hold onto the result across calls (see `Agent.memorySnapshot`).
4469
+ *
4434
4470
  * @returns Deep copy of current memory state
4435
4471
  */
4436
- toSnapshot() {
4437
- this.cachedSnapshot = structuredClone(this.memory);
4438
- return this.cachedSnapshot;
4439
- }
4440
- /**
4441
- * Get cached memory snapshot
4442
- * Returns snapshot created by toSnapshot()
4443
- * @returns Cached snapshot (undefined if toSnapshot() not called yet)
4444
- */
4445
- getSnapshot() {
4446
- return this.cachedSnapshot;
4472
+ snapshot() {
4473
+ return structuredClone(this.memory);
4447
4474
  }
4448
4475
  /**
4449
4476
  * Build the framework framing and the untrusted data envelope for an LLM call.
@@ -4575,6 +4602,12 @@ var Agent = class {
4575
4602
  * reading memory history after the fact, because the emit is the user-visible event and memory
4576
4603
  * can be compacted or restructured without changing whether the turn spoke. */
4577
4604
  spokeThisTurn = false;
4605
+ /** Cached result of `memoryManager.snapshot()` -- `MemoryManager.snapshot()` itself is stateless
4606
+ * (a fresh `structuredClone` every call), so caching the LAST one taken is this class's job. Set
4607
+ * once, in the `finally` around `iterate()` and again in `complete()` -- see `getMemorySnapshot()`
4608
+ * for why `undefined`-before-first-iteration is a contract other callers (`session.ts`, the SDK
4609
+ * worker) depend on. */
4610
+ memorySnapshot;
4578
4611
  /**
4579
4612
  * Create a new agent instance from definition
4580
4613
  * Memory will be initialized during execution
@@ -4615,7 +4648,7 @@ var Agent = class {
4615
4648
  try {
4616
4649
  await this.iterate(this.executionContext);
4617
4650
  } finally {
4618
- this.memoryManager.toSnapshot();
4651
+ this.memorySnapshot = this.memoryManager.snapshot();
4619
4652
  }
4620
4653
  }
4621
4654
  const output = await this.complete();
@@ -4728,22 +4761,21 @@ var Agent = class {
4728
4761
  async initializeMemoryManager(context) {
4729
4762
  const memory = await this.resolveInitialMemory(context);
4730
4763
  const memoryManager = new MemoryManager(memory, this.config.constraints, this.logger);
4731
- const inputStartTime = Date.now();
4732
- memoryManager.addToHistory({
4733
- type: "input",
4734
- content: this.currentInput,
4735
- turnNumber: context.sessionTurnNumber ?? null,
4736
- iterationNumber: 0,
4737
- source: "user"
4738
- });
4739
- const inputEndTime = Date.now();
4740
- this.logger.action(
4764
+ await this.logger.timed(
4741
4765
  "memory-input",
4742
- `Added input entry to history`,
4743
4766
  0,
4744
- inputStartTime,
4745
- inputEndTime,
4746
- inputEndTime - inputStartTime
4767
+ // Kept in history even though the input also travels as its own message: history is what
4768
+ // later iterations and later turns read, and `autoCompact` anchors on `history[0]` as the
4769
+ // original input. `toContextParts` excludes this entry from the current turn's envelope so
4770
+ // the model does not see the same text twice.
4771
+ () => memoryManager.addToHistory({
4772
+ type: "input",
4773
+ content: this.currentInput,
4774
+ turnNumber: context.sessionTurnNumber ?? null,
4775
+ iterationNumber: 0,
4776
+ source: "user"
4777
+ }),
4778
+ () => `Added input entry to history`
4747
4779
  );
4748
4780
  flowLog("agent.initialize", {
4749
4781
  resourceId: this.config.resourceId,
@@ -4765,32 +4797,20 @@ var Agent = class {
4765
4797
  */
4766
4798
  async resolveInitialMemory(context) {
4767
4799
  if (this.initialMemory) {
4768
- const restoreStartTime = Date.now();
4769
- const memory = structuredClone(this.initialMemory);
4770
- const restoreEndTime = Date.now();
4771
- this.logger.action(
4800
+ return this.logger.timed(
4772
4801
  "memory-restore",
4773
- `Restored ${Object.keys(memory.sessionMemory).length} session memory entries`,
4774
4802
  0,
4775
- restoreStartTime,
4776
- restoreEndTime,
4777
- restoreEndTime - restoreStartTime
4803
+ () => structuredClone(this.initialMemory),
4804
+ (memory) => `Restored ${Object.keys(memory.sessionMemory).length} session memory entries`
4778
4805
  );
4779
- return memory;
4780
4806
  }
4781
4807
  if (this.definition.preloadMemory) {
4782
- const preloadStartTime = Date.now();
4783
- const memory = await this.definition.preloadMemory(context);
4784
- const preloadEndTime = Date.now();
4785
- this.logger.action(
4808
+ return this.logger.timed(
4786
4809
  "memory-preload",
4787
- `Preloaded ${Object.keys(memory.sessionMemory).length} session memory entries`,
4788
4810
  0,
4789
- preloadStartTime,
4790
- preloadEndTime,
4791
- preloadEndTime - preloadStartTime
4811
+ () => this.definition.preloadMemory(context),
4812
+ (memory) => `Preloaded ${Object.keys(memory.sessionMemory).length} session memory entries`
4792
4813
  );
4793
- return memory;
4794
4814
  }
4795
4815
  return { sessionMemory: {}, history: [] };
4796
4816
  }
@@ -4924,8 +4944,8 @@ var Agent = class {
4924
4944
  0
4925
4945
  );
4926
4946
  }
4927
- this.memoryManager.toSnapshot();
4928
- const snapshot = this.memoryManager.getSnapshot();
4947
+ const snapshot = this.memoryManager.snapshot();
4948
+ this.memorySnapshot = snapshot;
4929
4949
  const completionEndTime = Date.now();
4930
4950
  this.logger.lifecycle("completion", "completed", {
4931
4951
  startTime: completionStartTime,
@@ -5141,12 +5161,17 @@ Fix the errors and generate a valid output.
5141
5161
  `.trim();
5142
5162
  }
5143
5163
  /**
5144
- * Get memory snapshot after execution
5145
- * Delegates to MemoryManager.getSnapshot()
5146
- * @returns Memory snapshot (only available after execute() completes)
5164
+ * Get memory snapshot after execution.
5165
+ *
5166
+ * `undefined` until the `finally` around `iterate()` (or `complete()`) takes the first snapshot --
5167
+ * `session.ts` and the SDK worker both rely on this to distinguish "no memory produced yet" (a
5168
+ * throw during `initialize()`, before any iteration ran) from "memory exists".
5169
+ *
5170
+ * @returns Memory snapshot (only available after execute() completes, or after a mid-turn throw
5171
+ * past the point `iterate()` began)
5147
5172
  */
5148
5173
  getMemorySnapshot() {
5149
- return this.memoryManager.getSnapshot();
5174
+ return this.memorySnapshot;
5150
5175
  }
5151
5176
  /**
5152
5177
  * How the just-finished turn ended -- see `AgentStopReason`. Set once `iterate()` returns,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/sdk",
3
- "version": "1.44.2",
3
+ "version": "1.45.0",
4
4
  "description": "SDK for building Elevasis organization resources",
5
5
  "type": "module",
6
6
  "bin": {
@@ -12,7 +12,7 @@
12
12
  "import": "./dist/index.js"
13
13
  },
14
14
  "./worker": {
15
- "types": "./dist/types/worker/index.d.ts",
15
+ "types": "./dist/worker/index.d.ts",
16
16
  "import": "./dist/worker/index.js"
17
17
  },
18
18
  "./test-utils": {
@@ -28,10 +28,7 @@
28
28
  "dist/index.js",
29
29
  "dist/index.d.ts",
30
30
  "dist/worker/index.js",
31
- "dist/types/worker/index.d.ts",
32
- "dist/types/worker/platform.d.ts",
33
- "dist/types/worker/utils.d.ts",
34
- "dist/types/worker/adapters/",
31
+ "dist/worker/index.d.ts",
35
32
  "dist/test-utils/index.js",
36
33
  "dist/test-utils/index.d.ts",
37
34
  "dist/node/",
@@ -58,9 +55,9 @@
58
55
  "tsup": "^8.0.0",
59
56
  "typescript": "5.9.2",
60
57
  "zod": "^4.1.0",
61
- "@repo/core": "0.59.0",
62
- "@repo/typescript-config": "0.0.0",
63
- "@repo/eslint-config": "0.0.0"
58
+ "@repo/core": "0.60.0",
59
+ "@repo/eslint-config": "0.0.0",
60
+ "@repo/typescript-config": "0.0.0"
64
61
  },
65
62
  "scripts": {
66
63
  "lint": "eslint src --max-warnings 0",