@remnic/core 9.3.768 → 9.3.770

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 (162) hide show
  1. package/dist/access-admin-ops-surface.js +29 -29
  2. package/dist/access-boundary.d.ts +2 -1
  3. package/dist/access-boundary.js +30 -30
  4. package/dist/access-cli.js +85 -83
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-errors.d.ts +5 -0
  7. package/dist/access-errors.js +8 -0
  8. package/dist/access-errors.js.map +1 -0
  9. package/dist/access-http.d.ts +51 -1
  10. package/dist/access-http.js +38 -36
  11. package/dist/access-identity-continuity-surface.js +29 -29
  12. package/dist/access-lcm-surface.js +29 -29
  13. package/dist/access-mcp.d.ts +7 -1
  14. package/dist/access-mcp.js +41 -37
  15. package/dist/access-observe-write-surface.js +29 -29
  16. package/dist/access-operations-batch.js +34 -32
  17. package/dist/access-operations.d.ts +4 -4
  18. package/dist/access-operations.js +36 -34
  19. package/dist/access-recall-surface.js +29 -29
  20. package/dist/access-schema.d.ts +68 -68
  21. package/dist/access-service.js +29 -29
  22. package/dist/access-surface-catalog.js +1 -0
  23. package/dist/access-surface-catalog.js.map +1 -1
  24. package/dist/active-recall.js +5 -5
  25. package/dist/auto-sync-2SOUW4JW.js +1 -1
  26. package/dist/briefing.js +7 -7
  27. package/dist/causal-behavior.js +5 -5
  28. package/dist/causal-chain.js +3 -3
  29. package/dist/causal-consolidation.js +11 -11
  30. package/dist/causal-retrieval.js +3 -3
  31. package/dist/causal-trajectory.js +1 -1
  32. package/dist/{chunk-R3K4CXPR.js → chunk-3JOFWTQD.js} +2 -2
  33. package/dist/{chunk-QOGXUNWL.js → chunk-3O3BZNSH.js} +4 -4
  34. package/dist/{chunk-SFNQDXXL.js → chunk-3YYWUHA7.js} +3 -3
  35. package/dist/{chunk-GLERZDM7.js → chunk-52TEPNL7.js} +29 -7
  36. package/dist/chunk-52TEPNL7.js.map +1 -0
  37. package/dist/{chunk-N4ZA2I7M.js → chunk-5ACKQLGA.js} +2 -2
  38. package/dist/{chunk-YDYC6PIS.js → chunk-5QJZLJ7Q.js} +2 -2
  39. package/dist/{chunk-ORAK3LNZ.js → chunk-6SHAUM5S.js} +5 -5
  40. package/dist/{chunk-CKNAVW34.js → chunk-7OSULYN2.js} +2 -2
  41. package/dist/{chunk-PA5ALD3S.js → chunk-7XGF5HCC.js} +106 -86
  42. package/dist/chunk-7XGF5HCC.js.map +1 -0
  43. package/dist/{chunk-6T4LTI2F.js → chunk-7XH7VJN4.js} +4 -4
  44. package/dist/{chunk-OX272PBW.js → chunk-CSHUSYUM.js} +2 -2
  45. package/dist/{chunk-UG274TNV.js → chunk-E2SPGGUI.js} +13 -8
  46. package/dist/chunk-E2SPGGUI.js.map +1 -0
  47. package/dist/{chunk-HBOPSFQQ.js → chunk-E6LXM2GE.js} +41 -41
  48. package/dist/{chunk-OAREUC7N.js → chunk-EWGMA5W5.js} +28 -28
  49. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  50. package/dist/chunk-FTYDWKO6.js +101 -0
  51. package/dist/chunk-FTYDWKO6.js.map +1 -0
  52. package/dist/{chunk-2RLECZ6J.js → chunk-IOENSSZC.js} +2 -2
  53. package/dist/{chunk-VKHZFF5P.js → chunk-KFIAFHOC.js} +2 -2
  54. package/dist/{chunk-NDXJJKT2.js → chunk-KMKBD66B.js} +2 -2
  55. package/dist/{chunk-SQNED75R.js → chunk-KYC3RLYJ.js} +1 -1
  56. package/dist/{chunk-V5RVMULT.js → chunk-MLDAD27I.js} +7 -7
  57. package/dist/{chunk-IGVKWKR2.js → chunk-O5EKTMOJ.js} +6 -6
  58. package/dist/{chunk-TVLN5EZZ.js → chunk-OP43P53G.js} +83 -8
  59. package/dist/chunk-OP43P53G.js.map +1 -0
  60. package/dist/{chunk-4HYFKIGH.js → chunk-PSNMICC2.js} +4 -4
  61. package/dist/{chunk-IVFIYAIP.js → chunk-QKUWPSU3.js} +5 -5
  62. package/dist/{chunk-4DLFJJOQ.js → chunk-QMN3CIFS.js} +2 -2
  63. package/dist/chunk-RANHFI3P.js +8 -0
  64. package/dist/chunk-RANHFI3P.js.map +1 -0
  65. package/dist/{chunk-AS2NRB45.js → chunk-RZ3KJZYE.js} +2 -2
  66. package/dist/{chunk-4JG55YV3.js → chunk-SRSPVFSJ.js} +3 -3
  67. package/dist/{chunk-DTTVX6EO.js → chunk-STN5KMSS.js} +12 -12
  68. package/dist/{chunk-J3UJJZKI.js → chunk-TGROC2UP.js} +108 -7
  69. package/dist/chunk-TGROC2UP.js.map +1 -0
  70. package/dist/{chunk-QPTP6SKC.js → chunk-U72WWTLR.js} +2 -2
  71. package/dist/{chunk-U5GFYMV7.js → chunk-W7VA5667.js} +3 -3
  72. package/dist/{chunk-X7HTU4HO.js → chunk-WB4CFKZ4.js} +2 -2
  73. package/dist/{chunk-NFWTMM2M.js → chunk-XDRJQMYL.js} +2 -2
  74. package/dist/{chunk-CVINPTKG.js → chunk-ZG4FT6IT.js} +5 -5
  75. package/dist/{chunk-MSGPLITO.js → chunk-ZT34X56N.js} +2 -2
  76. package/dist/{chunk-MSGPLITO.js.map → chunk-ZT34X56N.js.map} +1 -1
  77. package/dist/cli.js +58 -56
  78. package/dist/compounding/engine.js +7 -7
  79. package/dist/config.js +2 -2
  80. package/dist/connectors/codex-materialize-runner.js +7 -7
  81. package/dist/connectors/index.js +9 -9
  82. package/dist/consolidation-provenance-check.js +2 -2
  83. package/dist/dashboard-runtime.js +2 -2
  84. package/dist/entity-retrieval.js +7 -7
  85. package/dist/extraction.js +3 -3
  86. package/dist/index.d.ts +1 -1
  87. package/dist/index.js +141 -133
  88. package/dist/lcm/engine.js +3 -3
  89. package/dist/lcm/index.js +11 -11
  90. package/dist/maintenance/memory-governance.js +8 -8
  91. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +7 -7
  92. package/dist/maintenance/rebuild-memory-projection.js +9 -9
  93. package/dist/namespaces/migrate.js +12 -12
  94. package/dist/namespaces/search.js +4 -4
  95. package/dist/namespaces/storage.js +7 -7
  96. package/dist/operator-toolkit.js +17 -17
  97. package/dist/orchestration/maintenance.js +9 -9
  98. package/dist/orchestrator.js +85 -83
  99. package/dist/recall-timings.d.ts +26 -0
  100. package/dist/recall-timings.js +16 -0
  101. package/dist/recall-timings.js.map +1 -0
  102. package/dist/resume-bundles.js +3 -3
  103. package/dist/schemas.d.ts +84 -84
  104. package/dist/search/factory.js +3 -3
  105. package/dist/search/index.js +7 -7
  106. package/dist/semantic-consolidation.js +10 -10
  107. package/dist/semantic-rule-promotion.js +7 -7
  108. package/dist/semantic-rule-verifier.js +8 -8
  109. package/dist/shared-context/manager.d.ts +8 -8
  110. package/dist/storage.js +8 -8
  111. package/dist/tokens.d.ts +3 -1
  112. package/dist/tokens.js +3 -1
  113. package/dist/transfer/types.d.ts +66 -66
  114. package/dist/verified-recall.js +8 -8
  115. package/package.json +2 -2
  116. package/src/access-boundary.ts +2 -0
  117. package/src/access-errors.ts +2 -0
  118. package/src/access-http.test.ts +350 -0
  119. package/src/access-http.ts +192 -7
  120. package/src/access-mcp.ts +120 -3
  121. package/src/access-operations-batch.ts +19 -0
  122. package/src/access-surface-catalog.ts +1 -0
  123. package/src/index.ts +3 -0
  124. package/src/orchestration/recall-internal.ts +21 -3
  125. package/src/recall-timings-access.test.ts +301 -0
  126. package/src/recall-timings.ts +141 -0
  127. package/src/tokens.test.ts +58 -0
  128. package/src/tokens.ts +19 -8
  129. package/dist/chunk-GLERZDM7.js.map +0 -1
  130. package/dist/chunk-J3UJJZKI.js.map +0 -1
  131. package/dist/chunk-PA5ALD3S.js.map +0 -1
  132. package/dist/chunk-TVLN5EZZ.js.map +0 -1
  133. package/dist/chunk-UG274TNV.js.map +0 -1
  134. /package/dist/{chunk-R3K4CXPR.js.map → chunk-3JOFWTQD.js.map} +0 -0
  135. /package/dist/{chunk-QOGXUNWL.js.map → chunk-3O3BZNSH.js.map} +0 -0
  136. /package/dist/{chunk-SFNQDXXL.js.map → chunk-3YYWUHA7.js.map} +0 -0
  137. /package/dist/{chunk-N4ZA2I7M.js.map → chunk-5ACKQLGA.js.map} +0 -0
  138. /package/dist/{chunk-YDYC6PIS.js.map → chunk-5QJZLJ7Q.js.map} +0 -0
  139. /package/dist/{chunk-ORAK3LNZ.js.map → chunk-6SHAUM5S.js.map} +0 -0
  140. /package/dist/{chunk-CKNAVW34.js.map → chunk-7OSULYN2.js.map} +0 -0
  141. /package/dist/{chunk-6T4LTI2F.js.map → chunk-7XH7VJN4.js.map} +0 -0
  142. /package/dist/{chunk-OX272PBW.js.map → chunk-CSHUSYUM.js.map} +0 -0
  143. /package/dist/{chunk-HBOPSFQQ.js.map → chunk-E6LXM2GE.js.map} +0 -0
  144. /package/dist/{chunk-OAREUC7N.js.map → chunk-EWGMA5W5.js.map} +0 -0
  145. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  146. /package/dist/{chunk-2RLECZ6J.js.map → chunk-IOENSSZC.js.map} +0 -0
  147. /package/dist/{chunk-VKHZFF5P.js.map → chunk-KFIAFHOC.js.map} +0 -0
  148. /package/dist/{chunk-NDXJJKT2.js.map → chunk-KMKBD66B.js.map} +0 -0
  149. /package/dist/{chunk-SQNED75R.js.map → chunk-KYC3RLYJ.js.map} +0 -0
  150. /package/dist/{chunk-V5RVMULT.js.map → chunk-MLDAD27I.js.map} +0 -0
  151. /package/dist/{chunk-IGVKWKR2.js.map → chunk-O5EKTMOJ.js.map} +0 -0
  152. /package/dist/{chunk-4HYFKIGH.js.map → chunk-PSNMICC2.js.map} +0 -0
  153. /package/dist/{chunk-IVFIYAIP.js.map → chunk-QKUWPSU3.js.map} +0 -0
  154. /package/dist/{chunk-4DLFJJOQ.js.map → chunk-QMN3CIFS.js.map} +0 -0
  155. /package/dist/{chunk-AS2NRB45.js.map → chunk-RZ3KJZYE.js.map} +0 -0
  156. /package/dist/{chunk-4JG55YV3.js.map → chunk-SRSPVFSJ.js.map} +0 -0
  157. /package/dist/{chunk-DTTVX6EO.js.map → chunk-STN5KMSS.js.map} +0 -0
  158. /package/dist/{chunk-QPTP6SKC.js.map → chunk-U72WWTLR.js.map} +0 -0
  159. /package/dist/{chunk-U5GFYMV7.js.map → chunk-W7VA5667.js.map} +0 -0
  160. /package/dist/{chunk-X7HTU4HO.js.map → chunk-WB4CFKZ4.js.map} +0 -0
  161. /package/dist/{chunk-NFWTMM2M.js.map → chunk-XDRJQMYL.js.map} +0 -0
  162. /package/dist/{chunk-CVINPTKG.js.map → chunk-ZG4FT6IT.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  NamespaceStorageRouter
3
- } from "./chunk-OX272PBW.js";
3
+ } from "./chunk-CSHUSYUM.js";
4
4
  import {
5
5
  namespaceCollectionName
6
- } from "./chunk-CKNAVW34.js";
6
+ } from "./chunk-7OSULYN2.js";
7
7
  import {
8
8
  namespaceIdentityFromToken,
9
9
  namespaceIdentityToken
@@ -207,4 +207,4 @@ export {
207
207
  verifyNamespaces,
208
208
  runNamespaceMigration
209
209
  };
210
- //# sourceMappingURL=chunk-U5GFYMV7.js.map
210
+ //# sourceMappingURL=chunk-W7VA5667.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-DTTVX6EO.js";
3
+ } from "./chunk-STN5KMSS.js";
4
4
 
5
5
  // src/semantic-rule-promotion.ts
6
6
  import { createHash, randomUUID } from "crypto";
@@ -529,4 +529,4 @@ export {
529
529
  setSemanticRulePromotionTestHooks,
530
530
  promoteSemanticRuleFromMemory
531
531
  };
532
- //# sourceMappingURL=chunk-X7HTU4HO.js.map
532
+ //# sourceMappingURL=chunk-WB4CFKZ4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  resolveDefaultNamespaceRoot,
3
3
  resolveNamespaceStorageRoot
4
- } from "./chunk-OX272PBW.js";
4
+ } from "./chunk-CSHUSYUM.js";
5
5
  import {
6
6
  getConfiguredNamespaces
7
7
  } from "./chunk-BAVVI5GP.js";
@@ -2042,4 +2042,4 @@ export {
2042
2042
  runNamespaceMaintenancePlan,
2043
2043
  runNamespaceMaintenanceBatchPlan
2044
2044
  };
2045
- //# sourceMappingURL=chunk-NFWTMM2M.js.map
2045
+ //# sourceMappingURL=chunk-XDRJQMYL.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runPostConsolidationMaterialize
3
- } from "./chunk-2RLECZ6J.js";
3
+ } from "./chunk-IOENSSZC.js";
4
4
  import {
5
5
  discoverMemoryExtensions,
6
6
  renderExtensionsBlock,
@@ -12,13 +12,13 @@ import {
12
12
  import {
13
13
  resolvePipelineProcessingCapabilities
14
14
  } from "./chunk-VSF7AAGE.js";
15
+ import {
16
+ log
17
+ } from "./chunk-NU3CSQ4H.js";
15
18
  import {
16
19
  countRecallTokenOverlap,
17
20
  normalizeRecallTokens
18
21
  } from "./chunk-ZBJMUXZH.js";
19
- import {
20
- log
21
- } from "./chunk-NU3CSQ4H.js";
22
22
 
23
23
  // src/semantic-consolidation.ts
24
24
  function findSimilarClusters(memories, config) {
@@ -220,4 +220,4 @@ export {
220
220
  buildExtensionsBlockForConsolidation,
221
221
  materializeAfterSemanticConsolidation
222
222
  };
223
- //# sourceMappingURL=chunk-CVINPTKG.js.map
223
+ //# sourceMappingURL=chunk-ZG4FT6IT.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EngramAccessInputError
3
- } from "./chunk-OAREUC7N.js";
3
+ } from "./chunk-EWGMA5W5.js";
4
4
  import {
5
5
  expandTildePath
6
6
  } from "./chunk-EYIEWJNI.js";
@@ -130,4 +130,4 @@ export {
130
130
  listRegisteredOperations,
131
131
  __resetRegistryForTest
132
132
  };
133
- //# sourceMappingURL=chunk-MSGPLITO.js.map
133
+ //# sourceMappingURL=chunk-ZT34X56N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/access-boundary.ts"],"sourcesContent":["/**\n * Single input-validation and error boundary for the CLI/MCP/HTTP access\n * surfaces (issue #1525, epic #1520 Phase 1).\n *\n * Every operation that crosses the access-service facade passes through ONE\n * registry entry: a zod-validated request envelope, a shared error mapper,\n * and the \"reject invalid input and list valid options\" behavior that\n * CLAUDE.md rules 14/17/24/28/36/48/51 previously had to be re-implemented\n * per handler. The three surfaces become thin adapters — one operation\n * definition, three transports — so a validation fix lands everywhere at\n * once.\n *\n * Host-agnostic (rule 31): operation names carry no `openclaw-*`/`engram-*`\n * prefix. Session/namespace tenancy stays in the handler layer (resolved via\n * ScopePlan #1521); the boundary validates SHAPE, not tenancy.\n */\n\nimport { z } from \"zod\";\nimport { EngramAccessInputError, type EngramAccessService } from \"./access-service.js\";\nimport { expandTildePath } from \"./utils/path.js\";\n\n// ---------------------------------------------------------------------------\n// Canonical operation names — host-agnostic (rule 31)\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical operation ids. One id is shared by the MCP tool, the HTTP route,\n * and the CLI command that expose the same operation. Add to this union as\n * each domain-group migration PR (memory ops → connectors → namespaces …)\n * lands; the fitness test in `access-surface-catalog.test.ts` treats the\n * registered set as the migration state.\n */\nexport type OperationName =\n | \"memory_get\"\n | \"memory_search\"\n | \"memory_store\"\n | \"coding_decision\"\n | \"coding_architecture\"\n // codegraph parity tools (issue #1554) -- each maps to one codegraph_*\n // boundary operation that delegates to the surface handler in\n // coding/codegraph-surfaces.ts. Names match the external tool suffixes.\n | \"codegraph_index\"\n | \"codegraph_list_projects\"\n | \"codegraph_delete_project\"\n | \"codegraph_index_status\"\n | \"codegraph_search_graph\"\n | \"codegraph_trace_path\"\n | \"codegraph_detect_changes\"\n | \"codegraph_query_graph\"\n | \"codegraph_get_schema\"\n | \"codegraph_get_snippet\"\n | \"codegraph_get_architecture\"\n | \"codegraph_search_code\"\n | \"codegraph_manage_adr\"\n | \"codegraph_ingest_traces\"\n | \"memory_correct_plan\"\n | \"memory_correct_apply\"\n | \"coding_delta\"\n // Remaining MCP/HTTP handlers migrated through the boundary (issue #1525).\n | \"recall\"\n | \"recall_explain\"\n | \"set_coding_context\"\n | \"recall_tier_explain\"\n | \"recall_xray\"\n | \"wearables_status\"\n | \"wearables_sync\"\n | \"transcript_day\"\n | \"transcript_search\"\n | \"transcript_memories\"\n | \"action_confidence\"\n | \"chatgpt_memory_inspector\"\n | \"day_summary\"\n | \"capsule_export\"\n | \"capsule_import\"\n | \"capsule_list\"\n | \"memory_governance_run\"\n | \"procedure_mining_run\"\n | \"pattern_reinforcement_run\"\n | \"procedural_stats\"\n | \"memory_timeline\"\n | \"suggestion_submit\"\n | \"entity_get\"\n | \"review_queue_list\"\n | \"correction_pending\"\n | \"observe\"\n | \"lcm_search\"\n | \"lcm_compaction_flush\"\n | \"lcm_compaction_record\"\n | \"continuity_audit_generate\"\n | \"continuity_incident_open\"\n | \"continuity_incident_close\"\n | \"continuity_incident_list\"\n | \"continuity_loop_add_or_update\"\n | \"continuity_loop_review\"\n | \"identity_anchor_get\"\n | \"identity_anchor_update\"\n | \"memory_identity\"\n | \"work_task\"\n | \"work_project\"\n | \"work_board\"\n | \"shared_context_write_output\"\n | \"shared_feedback_record\"\n | \"shared_priorities_append\"\n | \"shared_context_cross_signals_run\"\n | \"shared_context_curate_daily\"\n | \"compounding_weekly_synthesize\"\n | \"compounding_promote_candidate\"\n | \"compression_guidelines_optimize\"\n | \"compression_guidelines_activate\"\n | \"memory_profile\"\n | \"memory_entities_list\"\n | \"memory_questions\"\n | \"memory_last_recall\"\n | \"memory_intent_debug\"\n | \"memory_qmd_debug\"\n | \"memory_graph_explain\"\n | \"graph_snapshot\"\n | \"memory_feedback\"\n | \"memory_promote\"\n | \"memory_outcome\"\n | \"memory_action_apply\"\n | \"context_checkpoint\"\n | \"briefing\"\n | \"review_list\"\n | \"review_resolve\"\n | \"contradiction_scan_run\"\n | \"memory_summarize_hourly\"\n | \"conversation_index_update\"\n | \"profiling_report\"\n | \"graph_edge_decay_run\"\n | \"live_connectors_run\"\n | \"peer_list\"\n | \"peer_get\"\n | \"peer_set\"\n | \"peer_delete\"\n | \"peer_profile_get\"\n | \"peer_forget\"\n | \"console_state\"\n | \"dreams_status\"\n | \"dreams_run\"\n // HTTP-only routes (no direct MCP tool equivalent).\n | \"offline_sync_snapshot\"\n | \"offline_sync_snapshot_stream\"\n | \"offline_sync_files\"\n | \"offline_sync_file_content\"\n | \"offline_sync_apply_file_content\"\n | \"offline_sync_apply\"\n | \"lcm_status\"\n | \"memory_list\"\n | \"entity_list\"\n | \"maintenance_status\"\n | \"quality_status\"\n | \"trust_zones_status\"\n | \"trust_zones_records\"\n | \"review_disposition\"\n | \"trust_zones_promote\"\n | \"trust_zones_demo_seed\"\n | \"citations_observed\"\n | \"contradiction_detail\"\n | \"graph_events\"\n // Chat surface — conversational memory inspection/correction (issue #1583).\n | \"chat_message\"\n | \"chat_events\";\n\n// ---------------------------------------------------------------------------\n// Operation context — what every handler receives\n// ---------------------------------------------------------------------------\n\n/**\n * Per-call context. `service` is the facade the handler delegates to; the\n * boundary never reaches past it. `authenticatedPrincipal` is resolved by\n * the SURFACE (MCP header / HTTP identity / CLI flag) before the boundary\n * runs, so handlers stay principal-source-agnostic. `hooks` carries\n * transport-level callbacks (e.g. HTTP write-quota enforcement) that must\n * fire atomically inside the service call; surfaces that have no such hook\n * leave it undefined.\n */\nexport interface OperationContext {\n readonly service: EngramAccessService;\n readonly authenticatedPrincipal?: string;\n readonly hooks?: OperationHooks;\n}\n\n/**\n * Transport-level callbacks a handler forwards into the service call. Kept\n * narrow on purpose: the boundary owns validation + dispatch shape, not\n * transport policy. Add fields here only when a surface genuinely needs a\n * callback the service itself consumes.\n */\nexport interface OperationHooks {\n /** HTTP write-quota gate; throws to reject the write when exhausted. */\n readonly enforceWriteQuota?: () => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Operation spec + bound operation\n// ---------------------------------------------------------------------------\n\nexport interface OperationSpec<In, Out> {\n /** Canonical operation id; matches an {@link OperationName}. */\n readonly name: OperationName;\n readonly description: string;\n /** Zod schema validating the raw request envelope. */\n readonly schema: z.ZodType<In>;\n /** Handler invoked with the parsed input; throws EngramAccessInputError for domain faults. */\n readonly handler: (input: In, ctx: OperationContext) => Promise<Out>;\n}\n\nexport interface BoundOperation<In = unknown, Out = unknown> {\n readonly spec: OperationSpec<In, Out>;\n /** Validate the raw envelope, then invoke the handler. Throws EngramAccessInputError on any validation failure. */\n readonly run: (rawInput: unknown, ctx: OperationContext) => Promise<Out>;\n}\n\n// ---------------------------------------------------------------------------\n// Shared normalizers the boundary owns (rules 17, 28, 36, 48, 51)\n// ---------------------------------------------------------------------------\n\n/**\n * Coerce boolean-like strings at the edge (rule 36). Accepts actual booleans\n * and the string spellings clients send (\"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\n * \"on\"/\"off\", case-insensitive). Rejects anything else loudly — `Boolean(\"false\")`\n * would silently be `true`, which is the bug rule 36 exists to prevent.\n *\n * `undefined`/`null`/`\"\"` → `undefined`, so callers can keep treating an\n * absent flag as \"use the default\" without a separate presence check.\n */\nexport function coerceBooleanLike(value: unknown): boolean | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.trim().toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\" || lower === \"on\") return true;\n if (lower === \"false\" || lower === \"0\" || lower === \"no\" || lower === \"off\") return false;\n }\n throw new EngramAccessInputError(\n `expected a boolean-like value (true|false|1|0|yes|no|on|off); got ${JSON.stringify(value)}`,\n );\n}\n\n/**\n * Coerce + validate a positive integer from a numeric string or number\n * (rule 28). Loosely-typed MCP/CLI clients send `\"5\"`; `typeof saved === \"number\"`\n * on read-back would reject it later, so we coerce at the edge and reject\n * booleans/objects loudly (`Number(true) === 1` would silently pass otherwise).\n *\n * `undefined`/`null`/`\"\"` → `undefined`.\n */\nexport function coercePositiveInteger(value: unknown, label: string): number | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value) || value <= 0 || !Number.isInteger(value)) {\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n }\n return value;\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!/^[+-]?\\d+$/.test(trimmed)) {\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n }\n const parsed = Number(trimmed);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n }\n return parsed;\n }\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n}\n\n/**\n * Expand `~` in a path-shaped input (rule 17). Node `fs` does NOT expand `~`;\n * ad-hoc regex drifts. `undefined`/`null`/`\"\"` → `undefined`.\n */\nexport function normalizeOptionalPath(value: unknown): string | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value !== \"string\") {\n throw new EngramAccessInputError(`expected a path string; got ${JSON.stringify(value)}`);\n }\n return expandTildePath(value);\n}\n\n// ---------------------------------------------------------------------------\n// Error formatting — rule 51: list valid options, never silently default\n// ---------------------------------------------------------------------------\n\n/**\n * Turn a zod failure into an {@link EngramAccessInputError} whose message\n * names the offending field and — for enum/union issues — lists the valid\n * options, so the caller can correct rather than guess (rule 51).\n */\nexport function formatZodIssues(error: z.ZodError): string {\n const parts: string[] = [];\n for (const issue of error.issues) {\n // Collapse array-index paths (e.g. [\"currentContextScopes\", 1]) to\n // the field name so the message reads \"field: must be ...\" not\n // \"field.1: must be ...\".\n const hasNumeric = issue.path.some((p) => typeof p === \"number\");\n const path = hasNumeric\n ? issue.path.filter((p) => typeof p === \"string\").join(\".\") || \"(root)\"\n : issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n const options = enumOptionsFromIssue(issue);\n const suffix = options ? `. Valid: ${options.join(\", \")}` : \"\";\n parts.push(`${path}: ${issue.message}${suffix}`);\n }\n return parts.length > 0\n ? `request validation failed: ${parts.join(\"; \")}`\n : \"request validation failed\";\n}\n\nfunction enumOptionsFromIssue(issue: z.ZodIssue): readonly string[] | undefined {\n // zod exposes accepted enum values on the issue for ZodEnum / ZodNativeEnum\n // and on the options of invalid_union discriminators. Reading them here\n // keeps \"list valid options\" in ONE place rather than per handler.\n if (issue.code === z.ZodIssueCode.invalid_enum_value) {\n const rawOptions = (issue as { options?: unknown }).options;\n if (Array.isArray(rawOptions)) {\n return rawOptions.map((opt) => String(opt));\n }\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst registry = new Map<OperationName, BoundOperation>();\n\n/**\n * Register an operation. Throws if the name is already registered — duplicate\n * registration is a programming error, not a runtime input fault, so it throws\n * a plain Error (not the input-error class surfaces translate for clients).\n */\n/**\n * Error map that converts Zod's generic type-mismatch messages into\n * human-readable \"must be a <type>\" messages (rule 51). Applied at the\n * boundary chokepoint so every operation gets consistent messaging\n * without per-handler boilerplate.\n */\nconst humanReadableErrorMap: z.ZodErrorMap = (issue, ctx) => {\n if (issue.code === z.ZodIssueCode.invalid_type) {\n if (issue.received === \"undefined\") return { message: ctx.defaultError };\n // Array-element type errors — collapse to field-level message.\n if (issue.path.some((p) => typeof p === \"number\")) {\n const arrField = issue.path.filter((p) => typeof p === \"string\").join(\".\");\n return { message: `${arrField} must be an array of ${issue.expected}s` };\n }\n const fieldName = issue.path.length > 0 ? String(issue.path[issue.path.length - 1]) : \"value\";\n switch (issue.expected) {\n case \"string\": return { message: `${fieldName} must be a string` };\n case \"boolean\": return { message: `${fieldName} must be a boolean` };\n case \"number\": return { message: `${fieldName} must be a number` };\n case \"array\": return { message: `${fieldName} must be an array` };\n case \"object\": return { message: `${fieldName} must be an object` };\n default: return { message: ctx.defaultError };\n }\n }\n return { message: ctx.defaultError };\n};\n\nexport function defineOperation<In, Out>(spec: OperationSpec<In, Out>): BoundOperation<In, Out> {\n if (registry.has(spec.name)) {\n throw new Error(`access-boundary: operation already registered: ${spec.name}`);\n }\n const bound: BoundOperation<In, Out> = {\n spec,\n run: async (rawInput, ctx) => {\n const parseResult = spec.schema.safeParse(rawInput, { errorMap: humanReadableErrorMap });\n if (!parseResult.success) {\n throw new EngramAccessInputError(formatZodIssues(parseResult.error));\n }\n return spec.handler(parseResult.data, ctx);\n },\n };\n // Store under the canonical name; the cast is safe because In/Out are\n // erased at the registry boundary and recovered by callers via getOperation.\n registry.set(spec.name, bound as unknown as BoundOperation);\n return bound;\n}\n\n/** Look up a registered operation by canonical name. */\nexport function getOperation(name: OperationName): BoundOperation | undefined {\n return registry.get(name);\n}\n\n/** All registered operation names. */\nexport function listRegisteredOperations(): readonly OperationName[] {\n return [...registry.keys()];\n}\n\n/** Test-only: clear the registry so pilot definitions can be re-registered. */\nexport function __resetRegistryForTest(): void {\n registry.clear();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/access-boundary.ts"],"sourcesContent":["/**\n * Single input-validation and error boundary for the CLI/MCP/HTTP access\n * surfaces (issue #1525, epic #1520 Phase 1).\n *\n * Every operation that crosses the access-service facade passes through ONE\n * registry entry: a zod-validated request envelope, a shared error mapper,\n * and the \"reject invalid input and list valid options\" behavior that\n * CLAUDE.md rules 14/17/24/28/36/48/51 previously had to be re-implemented\n * per handler. The three surfaces become thin adapters — one operation\n * definition, three transports — so a validation fix lands everywhere at\n * once.\n *\n * Host-agnostic (rule 31): operation names carry no `openclaw-*`/`engram-*`\n * prefix. Session/namespace tenancy stays in the handler layer (resolved via\n * ScopePlan #1521); the boundary validates SHAPE, not tenancy.\n */\n\nimport { z } from \"zod\";\nimport { EngramAccessInputError, type EngramAccessService } from \"./access-service.js\";\nimport { expandTildePath } from \"./utils/path.js\";\n\n// ---------------------------------------------------------------------------\n// Canonical operation names — host-agnostic (rule 31)\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical operation ids. One id is shared by the MCP tool, the HTTP route,\n * and the CLI command that expose the same operation. Add to this union as\n * each domain-group migration PR (memory ops → connectors → namespaces …)\n * lands; the fitness test in `access-surface-catalog.test.ts` treats the\n * registered set as the migration state.\n */\nexport type OperationName =\n | \"memory_get\"\n | \"memory_search\"\n | \"memory_store\"\n | \"coding_decision\"\n | \"coding_architecture\"\n // codegraph parity tools (issue #1554) -- each maps to one codegraph_*\n // boundary operation that delegates to the surface handler in\n // coding/codegraph-surfaces.ts. Names match the external tool suffixes.\n | \"codegraph_index\"\n | \"codegraph_list_projects\"\n | \"codegraph_delete_project\"\n | \"codegraph_index_status\"\n | \"codegraph_search_graph\"\n | \"codegraph_trace_path\"\n | \"codegraph_detect_changes\"\n | \"codegraph_query_graph\"\n | \"codegraph_get_schema\"\n | \"codegraph_get_snippet\"\n | \"codegraph_get_architecture\"\n | \"codegraph_search_code\"\n | \"codegraph_manage_adr\"\n | \"codegraph_ingest_traces\"\n | \"memory_correct_plan\"\n | \"memory_correct_apply\"\n | \"coding_delta\"\n // Remaining MCP/HTTP handlers migrated through the boundary (issue #1525).\n | \"recall\"\n | \"recall_explain\"\n | \"set_coding_context\"\n | \"recall_tier_explain\"\n | \"recall_xray\"\n | \"wearables_status\"\n | \"wearables_sync\"\n | \"transcript_day\"\n | \"transcript_search\"\n | \"transcript_memories\"\n | \"action_confidence\"\n | \"chatgpt_memory_inspector\"\n | \"day_summary\"\n | \"capsule_export\"\n | \"capsule_import\"\n | \"capsule_list\"\n | \"memory_governance_run\"\n | \"procedure_mining_run\"\n | \"pattern_reinforcement_run\"\n | \"procedural_stats\"\n | \"memory_timeline\"\n | \"suggestion_submit\"\n | \"entity_get\"\n | \"review_queue_list\"\n | \"correction_pending\"\n | \"observe\"\n | \"lcm_search\"\n | \"lcm_compaction_flush\"\n | \"lcm_compaction_record\"\n | \"continuity_audit_generate\"\n | \"continuity_incident_open\"\n | \"continuity_incident_close\"\n | \"continuity_incident_list\"\n | \"continuity_loop_add_or_update\"\n | \"continuity_loop_review\"\n | \"identity_anchor_get\"\n | \"identity_anchor_update\"\n | \"memory_identity\"\n | \"work_task\"\n | \"work_project\"\n | \"work_board\"\n | \"shared_context_write_output\"\n | \"shared_feedback_record\"\n | \"shared_priorities_append\"\n | \"shared_context_cross_signals_run\"\n | \"shared_context_curate_daily\"\n | \"compounding_weekly_synthesize\"\n | \"compounding_promote_candidate\"\n | \"compression_guidelines_optimize\"\n | \"compression_guidelines_activate\"\n | \"memory_profile\"\n | \"memory_entities_list\"\n | \"memory_questions\"\n | \"memory_last_recall\"\n | \"memory_intent_debug\"\n | \"memory_qmd_debug\"\n | \"memory_graph_explain\"\n | \"graph_snapshot\"\n | \"memory_feedback\"\n | \"memory_promote\"\n | \"memory_outcome\"\n | \"memory_action_apply\"\n | \"context_checkpoint\"\n | \"briefing\"\n | \"review_list\"\n | \"review_resolve\"\n | \"contradiction_scan_run\"\n | \"memory_summarize_hourly\"\n | \"conversation_index_update\"\n | \"profiling_report\"\n | \"graph_edge_decay_run\"\n | \"live_connectors_run\"\n | \"peer_list\"\n | \"peer_get\"\n | \"peer_set\"\n | \"peer_delete\"\n | \"peer_profile_get\"\n | \"peer_forget\"\n | \"console_state\"\n | \"dreams_status\"\n | \"dreams_run\"\n // HTTP-only routes (no direct MCP tool equivalent).\n | \"offline_sync_snapshot\"\n | \"offline_sync_snapshot_stream\"\n | \"offline_sync_files\"\n | \"offline_sync_file_content\"\n | \"offline_sync_apply_file_content\"\n | \"offline_sync_apply\"\n | \"lcm_status\"\n | \"memory_list\"\n | \"recall_timings\"\n | \"entity_list\"\n | \"maintenance_status\"\n | \"quality_status\"\n | \"trust_zones_status\"\n | \"trust_zones_records\"\n | \"review_disposition\"\n | \"trust_zones_promote\"\n | \"trust_zones_demo_seed\"\n | \"citations_observed\"\n | \"contradiction_detail\"\n | \"graph_events\"\n // Chat surface — conversational memory inspection/correction (issue #1583).\n | \"chat_message\"\n | \"chat_events\";\n\n// ---------------------------------------------------------------------------\n// Operation context — what every handler receives\n// ---------------------------------------------------------------------------\n\n/**\n * Per-call context. `service` is the facade the handler delegates to; the\n * boundary never reaches past it. `authenticatedPrincipal` is resolved by\n * the SURFACE (MCP header / HTTP identity / CLI flag) before the boundary\n * runs, so handlers stay principal-source-agnostic. `hooks` carries\n * transport-level callbacks (e.g. HTTP write-quota enforcement) that must\n * fire atomically inside the service call; surfaces that have no such hook\n * leave it undefined.\n */\nexport interface OperationContext {\n readonly service: EngramAccessService;\n readonly authenticatedPrincipal?: string;\n readonly operatorPrincipal?: string;\n readonly hooks?: OperationHooks;\n}\n\n/**\n * Transport-level callbacks a handler forwards into the service call. Kept\n * narrow on purpose: the boundary owns validation + dispatch shape, not\n * transport policy. Add fields here only when a surface genuinely needs a\n * callback the service itself consumes.\n */\nexport interface OperationHooks {\n /** HTTP write-quota gate; throws to reject the write when exhausted. */\n readonly enforceWriteQuota?: () => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Operation spec + bound operation\n// ---------------------------------------------------------------------------\n\nexport interface OperationSpec<In, Out> {\n /** Canonical operation id; matches an {@link OperationName}. */\n readonly name: OperationName;\n readonly description: string;\n /** Zod schema validating the raw request envelope. */\n readonly schema: z.ZodType<In>;\n /** Handler invoked with the parsed input; throws EngramAccessInputError for domain faults. */\n readonly handler: (input: In, ctx: OperationContext) => Promise<Out>;\n}\n\nexport interface BoundOperation<In = unknown, Out = unknown> {\n readonly spec: OperationSpec<In, Out>;\n /** Validate the raw envelope, then invoke the handler. Throws EngramAccessInputError on any validation failure. */\n readonly run: (rawInput: unknown, ctx: OperationContext) => Promise<Out>;\n}\n\n// ---------------------------------------------------------------------------\n// Shared normalizers the boundary owns (rules 17, 28, 36, 48, 51)\n// ---------------------------------------------------------------------------\n\n/**\n * Coerce boolean-like strings at the edge (rule 36). Accepts actual booleans\n * and the string spellings clients send (\"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\n * \"on\"/\"off\", case-insensitive). Rejects anything else loudly — `Boolean(\"false\")`\n * would silently be `true`, which is the bug rule 36 exists to prevent.\n *\n * `undefined`/`null`/`\"\"` → `undefined`, so callers can keep treating an\n * absent flag as \"use the default\" without a separate presence check.\n */\nexport function coerceBooleanLike(value: unknown): boolean | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.trim().toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\" || lower === \"on\") return true;\n if (lower === \"false\" || lower === \"0\" || lower === \"no\" || lower === \"off\") return false;\n }\n throw new EngramAccessInputError(\n `expected a boolean-like value (true|false|1|0|yes|no|on|off); got ${JSON.stringify(value)}`,\n );\n}\n\n/**\n * Coerce + validate a positive integer from a numeric string or number\n * (rule 28). Loosely-typed MCP/CLI clients send `\"5\"`; `typeof saved === \"number\"`\n * on read-back would reject it later, so we coerce at the edge and reject\n * booleans/objects loudly (`Number(true) === 1` would silently pass otherwise).\n *\n * `undefined`/`null`/`\"\"` → `undefined`.\n */\nexport function coercePositiveInteger(value: unknown, label: string): number | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value) || value <= 0 || !Number.isInteger(value)) {\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n }\n return value;\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!/^[+-]?\\d+$/.test(trimmed)) {\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n }\n const parsed = Number(trimmed);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n }\n return parsed;\n }\n throw new EngramAccessInputError(`${label} expects a positive integer; got ${JSON.stringify(value)}`);\n}\n\n/**\n * Expand `~` in a path-shaped input (rule 17). Node `fs` does NOT expand `~`;\n * ad-hoc regex drifts. `undefined`/`null`/`\"\"` → `undefined`.\n */\nexport function normalizeOptionalPath(value: unknown): string | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value !== \"string\") {\n throw new EngramAccessInputError(`expected a path string; got ${JSON.stringify(value)}`);\n }\n return expandTildePath(value);\n}\n\n// ---------------------------------------------------------------------------\n// Error formatting — rule 51: list valid options, never silently default\n// ---------------------------------------------------------------------------\n\n/**\n * Turn a zod failure into an {@link EngramAccessInputError} whose message\n * names the offending field and — for enum/union issues — lists the valid\n * options, so the caller can correct rather than guess (rule 51).\n */\nexport function formatZodIssues(error: z.ZodError): string {\n const parts: string[] = [];\n for (const issue of error.issues) {\n // Collapse array-index paths (e.g. [\"currentContextScopes\", 1]) to\n // the field name so the message reads \"field: must be ...\" not\n // \"field.1: must be ...\".\n const hasNumeric = issue.path.some((p) => typeof p === \"number\");\n const path = hasNumeric\n ? issue.path.filter((p) => typeof p === \"string\").join(\".\") || \"(root)\"\n : issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n const options = enumOptionsFromIssue(issue);\n const suffix = options ? `. Valid: ${options.join(\", \")}` : \"\";\n parts.push(`${path}: ${issue.message}${suffix}`);\n }\n return parts.length > 0\n ? `request validation failed: ${parts.join(\"; \")}`\n : \"request validation failed\";\n}\n\nfunction enumOptionsFromIssue(issue: z.ZodIssue): readonly string[] | undefined {\n // zod exposes accepted enum values on the issue for ZodEnum / ZodNativeEnum\n // and on the options of invalid_union discriminators. Reading them here\n // keeps \"list valid options\" in ONE place rather than per handler.\n if (issue.code === z.ZodIssueCode.invalid_enum_value) {\n const rawOptions = (issue as { options?: unknown }).options;\n if (Array.isArray(rawOptions)) {\n return rawOptions.map((opt) => String(opt));\n }\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst registry = new Map<OperationName, BoundOperation>();\n\n/**\n * Register an operation. Throws if the name is already registered — duplicate\n * registration is a programming error, not a runtime input fault, so it throws\n * a plain Error (not the input-error class surfaces translate for clients).\n */\n/**\n * Error map that converts Zod's generic type-mismatch messages into\n * human-readable \"must be a <type>\" messages (rule 51). Applied at the\n * boundary chokepoint so every operation gets consistent messaging\n * without per-handler boilerplate.\n */\nconst humanReadableErrorMap: z.ZodErrorMap = (issue, ctx) => {\n if (issue.code === z.ZodIssueCode.invalid_type) {\n if (issue.received === \"undefined\") return { message: ctx.defaultError };\n // Array-element type errors — collapse to field-level message.\n if (issue.path.some((p) => typeof p === \"number\")) {\n const arrField = issue.path.filter((p) => typeof p === \"string\").join(\".\");\n return { message: `${arrField} must be an array of ${issue.expected}s` };\n }\n const fieldName = issue.path.length > 0 ? String(issue.path[issue.path.length - 1]) : \"value\";\n switch (issue.expected) {\n case \"string\": return { message: `${fieldName} must be a string` };\n case \"boolean\": return { message: `${fieldName} must be a boolean` };\n case \"number\": return { message: `${fieldName} must be a number` };\n case \"array\": return { message: `${fieldName} must be an array` };\n case \"object\": return { message: `${fieldName} must be an object` };\n default: return { message: ctx.defaultError };\n }\n }\n return { message: ctx.defaultError };\n};\n\nexport function defineOperation<In, Out>(spec: OperationSpec<In, Out>): BoundOperation<In, Out> {\n if (registry.has(spec.name)) {\n throw new Error(`access-boundary: operation already registered: ${spec.name}`);\n }\n const bound: BoundOperation<In, Out> = {\n spec,\n run: async (rawInput, ctx) => {\n const parseResult = spec.schema.safeParse(rawInput, { errorMap: humanReadableErrorMap });\n if (!parseResult.success) {\n throw new EngramAccessInputError(formatZodIssues(parseResult.error));\n }\n return spec.handler(parseResult.data, ctx);\n },\n };\n // Store under the canonical name; the cast is safe because In/Out are\n // erased at the registry boundary and recovered by callers via getOperation.\n registry.set(spec.name, bound as unknown as BoundOperation);\n return bound;\n}\n\n/** Look up a registered operation by canonical name. */\nexport function getOperation(name: OperationName): BoundOperation | undefined {\n return registry.get(name);\n}\n\n/** All registered operation names. */\nexport function listRegisteredOperations(): readonly OperationName[] {\n return [...registry.keys()];\n}\n\n/** Test-only: clear the registry so pilot definitions can be re-registered. */\nexport function __resetRegistryForTest(): void {\n registry.clear();\n}\n"],"mappings":"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","names":[]}
package/dist/cli.js CHANGED
@@ -90,11 +90,12 @@ import {
90
90
  runWorkProductStatusCliCommand,
91
91
  runWorkProjectCliCommand,
92
92
  runWorkTaskCliCommand
93
- } from "./chunk-HBOPSFQQ.js";
94
- import "./chunk-MC4FJXPA.js";
93
+ } from "./chunk-E6LXM2GE.js";
95
94
  import "./chunk-LQHDIS7L.js";
96
95
  import "./chunk-7F7Z6MOS.js";
96
+ import "./chunk-MC4FJXPA.js";
97
97
  import "./chunk-JJEJJ7RK.js";
98
+ import "./chunk-UP6MOYCB.js";
98
99
  import "./chunk-7VFZTJ7K.js";
99
100
  import "./chunk-HDDRVXX4.js";
100
101
  import "./chunk-AGNBY3VG.js";
@@ -103,43 +104,42 @@ import "./chunk-OZKVVUJB.js";
103
104
  import "./chunk-2DL3OFLD.js";
104
105
  import "./chunk-G4IAEX6D.js";
105
106
  import "./chunk-2BFLDH5F.js";
106
- import "./chunk-UP6MOYCB.js";
107
107
  import "./chunk-765K3SAT.js";
108
+ import "./chunk-WIWPSQYU.js";
109
+ import "./chunk-EEC4PCG5.js";
108
110
  import "./chunk-PYIFUBRK.js";
109
111
  import "./chunk-HOJZMQ4J.js";
110
112
  import "./chunk-2PRQG7PV.js";
111
- import "./chunk-WIWPSQYU.js";
113
+ import "./chunk-KMKBD66B.js";
114
+ import "./chunk-3YYWUHA7.js";
112
115
  import "./chunk-LZZNTPLR.js";
113
- import "./chunk-EEC4PCG5.js";
114
116
  import "./chunk-WMWVO45V.js";
117
+ import "./chunk-KJTKLXTH.js";
115
118
  import "./chunk-D6RIFG4O.js";
116
119
  import "./chunk-JCK7V6SN.js";
117
- import "./chunk-NDXJJKT2.js";
118
- import "./chunk-SFNQDXXL.js";
119
- import "./chunk-KJTKLXTH.js";
120
120
  import "./chunk-CKITWVWJ.js";
121
121
  import "./chunk-OUELRE5E.js";
122
122
  import "./chunk-GQL52GQ5.js";
123
+ import "./chunk-5ACKQLGA.js";
123
124
  import "./chunk-2F6NP3NT.js";
124
125
  import "./chunk-TERNBNJB.js";
125
- import "./chunk-N4ZA2I7M.js";
126
126
  import "./chunk-QRDOSYOR.js";
127
- import "./chunk-X7HTU4HO.js";
128
- import "./chunk-VKHZFF5P.js";
129
- import "./chunk-TGQ2NTWH.js";
127
+ import "./chunk-WB4CFKZ4.js";
128
+ import "./chunk-KFIAFHOC.js";
130
129
  import "./chunk-WRBDUNSW.js";
131
130
  import "./chunk-ZRWB5D4H.js";
132
131
  import "./chunk-GY3SKOS4.js";
132
+ import "./chunk-TGQ2NTWH.js";
133
133
  import "./chunk-SFQ6QNL7.js";
134
134
  import "./chunk-DANV2HTH.js";
135
135
  import "./chunk-33JBK2XP.js";
136
- import "./chunk-IGVKWKR2.js";
137
- import "./chunk-NFWTMM2M.js";
138
- import "./chunk-U5GFYMV7.js";
139
- import "./chunk-OX272PBW.js";
136
+ import "./chunk-O5EKTMOJ.js";
137
+ import "./chunk-XDRJQMYL.js";
138
+ import "./chunk-W7VA5667.js";
139
+ import "./chunk-CSHUSYUM.js";
140
140
  import "./chunk-KFY3SGN7.js";
141
- import "./chunk-3T74IZB3.js";
142
141
  import "./chunk-CMTINOFS.js";
142
+ import "./chunk-3T74IZB3.js";
143
143
  import "./chunk-HL4DB7TO.js";
144
144
  import "./chunk-TQNRI55H.js";
145
145
  import "./chunk-6GUG4YNM.js";
@@ -148,11 +148,11 @@ import "./chunk-AV5ZEH4M.js";
148
148
  import "./chunk-BVKCV2ZY.js";
149
149
  import "./chunk-ZCWIH4LH.js";
150
150
  import "./chunk-3PY7VHV7.js";
151
- import "./chunk-6T4LTI2F.js";
151
+ import "./chunk-7XH7VJN4.js";
152
152
  import "./chunk-FZZ2QTJI.js";
153
- import "./chunk-YNDLCWXS.js";
154
- import "./chunk-AUDJPF4N.js";
153
+ import "./chunk-EZ25VE3G.js";
155
154
  import "./chunk-44442YCH.js";
155
+ import "./chunk-AUDJPF4N.js";
156
156
  import "./chunk-Y4Z4I6WK.js";
157
157
  import "./chunk-LMDRGRJ2.js";
158
158
  import "./chunk-OKTXM5H4.js";
@@ -168,7 +168,7 @@ import "./chunk-OO42R444.js";
168
168
  import "./chunk-K6MV3TRQ.js";
169
169
  import "./chunk-LBJBNWS2.js";
170
170
  import "./chunk-OADWQ5CR.js";
171
- import "./chunk-J3UJJZKI.js";
171
+ import "./chunk-TGROC2UP.js";
172
172
  import "./chunk-7WV3F5DQ.js";
173
173
  import "./chunk-SEDEKFYQ.js";
174
174
  import "./chunk-JBPKEARU.js";
@@ -177,19 +177,20 @@ import "./chunk-J64TK33U.js";
177
177
  import "./chunk-RSUYKGGZ.js";
178
178
  import "./chunk-42NQ7AVG.js";
179
179
  import "./chunk-7RXCMVFQ.js";
180
- import "./chunk-TVLN5EZZ.js";
180
+ import "./chunk-OP43P53G.js";
181
181
  import "./chunk-D24OXEPB.js";
182
- import "./chunk-4JG55YV3.js";
183
- import "./chunk-GLERZDM7.js";
184
- import "./chunk-ZQNCHPTZ.js";
182
+ import "./chunk-SRSPVFSJ.js";
183
+ import "./chunk-2MR3MFQB.js";
184
+ import "./chunk-52TEPNL7.js";
185
185
  import "./chunk-YF6FMLBT.js";
186
+ import "./chunk-ZQNCHPTZ.js";
186
187
  import "./chunk-EEKDRAWX.js";
187
188
  import "./chunk-DJECGBBM.js";
188
189
  import "./chunk-35NN3ZFA.js";
190
+ import "./chunk-FTYDWKO6.js";
189
191
  import "./chunk-T4WDJPEZ.js";
190
- import "./chunk-2MR3MFQB.js";
191
- import "./chunk-MSGPLITO.js";
192
- import "./chunk-OAREUC7N.js";
192
+ import "./chunk-ZT34X56N.js";
193
+ import "./chunk-EWGMA5W5.js";
193
194
  import "./chunk-GDASG7NC.js";
194
195
  import "./chunk-GDB4J2H3.js";
195
196
  import "./chunk-M5QKGHCR.js";
@@ -206,18 +207,18 @@ import "./chunk-2KK5WNQB.js";
206
207
  import "./chunk-SOBJ6NEY.js";
207
208
  import "./chunk-6MMONPHM.js";
208
209
  import "./chunk-BAVVI5GP.js";
209
- import "./chunk-CKNAVW34.js";
210
- import "./chunk-4HYFKIGH.js";
210
+ import "./chunk-7OSULYN2.js";
211
+ import "./chunk-PSNMICC2.js";
212
+ import "./chunk-K2I3AWBR.js";
211
213
  import "./chunk-DMKMQTBH.js";
212
214
  import "./chunk-CYEPCZN5.js";
213
215
  import "./chunk-XG4NBBRW.js";
214
216
  import "./chunk-ZZMRXJFY.js";
215
- import "./chunk-HM6UJPPO.js";
216
- import "./chunk-K2I3AWBR.js";
217
217
  import "./chunk-AER6MT24.js";
218
+ import "./chunk-HM6UJPPO.js";
218
219
  import "./chunk-CINZGPSJ.js";
219
220
  import "./chunk-EGGE52UU.js";
220
- import "./chunk-IVFIYAIP.js";
221
+ import "./chunk-QKUWPSU3.js";
221
222
  import "./chunk-DCWIQFNA.js";
222
223
  import "./chunk-XBZQRZ6G.js";
223
224
  import "./chunk-KCQA46NR.js";
@@ -232,26 +233,27 @@ import "./chunk-TQT3USCG.js";
232
233
  import "./chunk-EI6V5UXY.js";
233
234
  import "./chunk-PNLCEFE4.js";
234
235
  import "./chunk-O75CRYGF.js";
235
- import "./chunk-K5LLP4CY.js";
236
236
  import "./chunk-QDW3E4RD.js";
237
+ import "./chunk-K5LLP4CY.js";
237
238
  import "./chunk-3ONXXHQO.js";
238
239
  import "./chunk-ODPLEWB6.js";
240
+ import "./chunk-ZY2MNJR6.js";
239
241
  import "./chunk-EHQ5HO5T.js";
240
242
  import "./chunk-2LSZVONP.js";
241
243
  import "./chunk-DEUNUKTD.js";
242
- import "./chunk-SQNED75R.js";
243
- import "./chunk-R3K4CXPR.js";
244
- import "./chunk-DTTVX6EO.js";
245
- import "./chunk-M7XQSUBB.js";
244
+ import "./chunk-KYC3RLYJ.js";
245
+ import "./chunk-3JOFWTQD.js";
246
+ import "./chunk-STN5KMSS.js";
246
247
  import "./chunk-L2B3EE7B.js";
248
+ import "./chunk-M7XQSUBB.js";
247
249
  import "./chunk-5UZXUTVO.js";
248
250
  import "./chunk-5GPPACXK.js";
251
+ import "./chunk-SVOZFLIQ.js";
249
252
  import "./chunk-LTJAMRGI.js";
250
253
  import "./chunk-TKZ3AL5V.js";
251
254
  import "./chunk-6CIAGZ6X.js";
252
255
  import "./chunk-J6A3CX5N.js";
253
256
  import "./chunk-DQC3ZZYM.js";
254
- import "./chunk-SVOZFLIQ.js";
255
257
  import "./chunk-JS2HKKOK.js";
256
258
  import "./chunk-AWJ2FHCF.js";
257
259
  import "./chunk-42JKGUFJ.js";
@@ -263,30 +265,15 @@ import "./chunk-DM2T26WE.js";
263
265
  import "./chunk-LDXUBPMO.js";
264
266
  import "./chunk-YTU7WKYN.js";
265
267
  import "./chunk-AAD2ZS6P.js";
268
+ import "./chunk-G7D6GZ5J.js";
266
269
  import "./chunk-VF4XKTX3.js";
267
270
  import "./chunk-W5H6ZRPT.js";
268
- import "./chunk-G7D6GZ5J.js";
269
271
  import "./chunk-VUA4S7P6.js";
270
272
  import "./chunk-IQVQJJL7.js";
271
273
  import "./chunk-L2EXJQJP.js";
272
274
  import "./chunk-VL7DP3OW.js";
273
275
  import "./chunk-RGMVMVMF.js";
274
276
  import "./chunk-N7RWREIQ.js";
275
- import "./chunk-ZY2MNJR6.js";
276
- import "./chunk-PE6XR4GG.js";
277
- import "./chunk-U3PN77QT.js";
278
- import "./chunk-VSF7AAGE.js";
279
- import "./chunk-OEHCMALU.js";
280
- import "./chunk-PHK3HARR.js";
281
- import "./chunk-5GKPFL3S.js";
282
- import "./chunk-4DJQYKMN.js";
283
- import "./chunk-EYIEWJNI.js";
284
- import "./chunk-JUC24CTX.js";
285
- import "./chunk-6MKAMLQL.js";
286
- import "./chunk-JAKIDQB2.js";
287
- import "./chunk-TBBDFYXW.js";
288
- import "./chunk-ZBJMUXZH.js";
289
- import "./chunk-NU3CSQ4H.js";
290
277
  import "./chunk-FLVL4L3L.js";
291
278
  import "./chunk-WEHSQBFR.js";
292
279
  import "./chunk-437S3G37.js";
@@ -297,6 +284,16 @@ import "./chunk-FP2373TW.js";
297
284
  import "./chunk-Z2YFLXHU.js";
298
285
  import "./chunk-I4WBNM3M.js";
299
286
  import "./chunk-SOAU2OE2.js";
287
+ import "./chunk-PE6XR4GG.js";
288
+ import "./chunk-U3PN77QT.js";
289
+ import "./chunk-VSF7AAGE.js";
290
+ import "./chunk-OEHCMALU.js";
291
+ import "./chunk-PHK3HARR.js";
292
+ import "./chunk-5GKPFL3S.js";
293
+ import "./chunk-4DJQYKMN.js";
294
+ import "./chunk-EYIEWJNI.js";
295
+ import "./chunk-JUC24CTX.js";
296
+ import "./chunk-NU3CSQ4H.js";
300
297
  import "./chunk-X64YLC24.js";
301
298
  import "./chunk-UI3NYK34.js";
302
299
  import "./chunk-GCGJW34D.js";
@@ -304,13 +301,18 @@ import "./chunk-J2HSAU72.js";
304
301
  import "./chunk-A6XUJE5D.js";
305
302
  import "./chunk-P7FMDTKL.js";
306
303
  import "./chunk-VS2IYZRU.js";
304
+ import "./chunk-6MKAMLQL.js";
305
+ import "./chunk-JAKIDQB2.js";
306
+ import "./chunk-TBBDFYXW.js";
307
+ import "./chunk-ZBJMUXZH.js";
308
+ import "./chunk-VFUEZZBS.js";
307
309
  import "./chunk-PVGDJXVK.js";
308
310
  import "./chunk-A2IYSXDQ.js";
309
311
  import "./chunk-LPSF4OQH.js";
310
312
  import "./chunk-TVVEYCNW.js";
311
313
  import "./chunk-RFYAYKTD.js";
312
314
  import "./chunk-LBLXEFWK.js";
313
- import "./chunk-VFUEZZBS.js";
315
+ import "./chunk-RANHFI3P.js";
314
316
  import "./chunk-PZ5AY32C.js";
315
317
  export {
316
318
  emitConnectorsRunCliResult,
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  CompoundingEngine,
3
3
  defaultTierMigrationCycleBudget
4
- } from "../chunk-QPTP6SKC.js";
4
+ } from "../chunk-U72WWTLR.js";
5
5
  import "../chunk-JRZV3767.js";
6
- import "../chunk-DTTVX6EO.js";
7
- import "../chunk-M7XQSUBB.js";
6
+ import "../chunk-STN5KMSS.js";
8
7
  import "../chunk-L2B3EE7B.js";
8
+ import "../chunk-M7XQSUBB.js";
9
9
  import "../chunk-5UZXUTVO.js";
10
10
  import "../chunk-5GPPACXK.js";
11
+ import "../chunk-SVOZFLIQ.js";
11
12
  import "../chunk-LTJAMRGI.js";
12
13
  import "../chunk-TKZ3AL5V.js";
13
14
  import "../chunk-6CIAGZ6X.js";
14
15
  import "../chunk-J6A3CX5N.js";
15
16
  import "../chunk-DQC3ZZYM.js";
16
- import "../chunk-SVOZFLIQ.js";
17
17
  import "../chunk-JS2HKKOK.js";
18
18
  import "../chunk-AWJ2FHCF.js";
19
19
  import "../chunk-42JKGUFJ.js";
@@ -25,9 +25,9 @@ import "../chunk-DM2T26WE.js";
25
25
  import "../chunk-LDXUBPMO.js";
26
26
  import "../chunk-YTU7WKYN.js";
27
27
  import "../chunk-AAD2ZS6P.js";
28
+ import "../chunk-G7D6GZ5J.js";
28
29
  import "../chunk-VF4XKTX3.js";
29
30
  import "../chunk-W5H6ZRPT.js";
30
- import "../chunk-G7D6GZ5J.js";
31
31
  import "../chunk-VUA4S7P6.js";
32
32
  import "../chunk-IQVQJJL7.js";
33
33
  import "../chunk-L2EXJQJP.js";
@@ -41,13 +41,13 @@ import "../chunk-5GKPFL3S.js";
41
41
  import "../chunk-4DJQYKMN.js";
42
42
  import "../chunk-EYIEWJNI.js";
43
43
  import "../chunk-JUC24CTX.js";
44
- import "../chunk-6MKAMLQL.js";
45
- import "../chunk-JAKIDQB2.js";
46
44
  import "../chunk-NU3CSQ4H.js";
47
45
  import "../chunk-J2HSAU72.js";
48
46
  import "../chunk-A6XUJE5D.js";
49
47
  import "../chunk-P7FMDTKL.js";
50
48
  import "../chunk-VS2IYZRU.js";
49
+ import "../chunk-6MKAMLQL.js";
50
+ import "../chunk-JAKIDQB2.js";
51
51
  import "../chunk-PZ5AY32C.js";
52
52
  export {
53
53
  CompoundingEngine,
package/dist/config.js CHANGED
@@ -16,8 +16,6 @@ import "./chunk-5GKPFL3S.js";
16
16
  import "./chunk-4DJQYKMN.js";
17
17
  import "./chunk-EYIEWJNI.js";
18
18
  import "./chunk-JUC24CTX.js";
19
- import "./chunk-6MKAMLQL.js";
20
- import "./chunk-JAKIDQB2.js";
21
19
  import "./chunk-NU3CSQ4H.js";
22
20
  import "./chunk-X64YLC24.js";
23
21
  import "./chunk-UI3NYK34.js";
@@ -26,6 +24,8 @@ import "./chunk-J2HSAU72.js";
26
24
  import "./chunk-A6XUJE5D.js";
27
25
  import "./chunk-P7FMDTKL.js";
28
26
  import "./chunk-VS2IYZRU.js";
27
+ import "./chunk-6MKAMLQL.js";
28
+ import "./chunk-JAKIDQB2.js";
29
29
  import "./chunk-PZ5AY32C.js";
30
30
  export {
31
31
  DEFAULT_REASONING_MODEL,
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  runCodexMaterialize,
3
3
  runPostConsolidationMaterialize
4
- } from "../chunk-2RLECZ6J.js";
4
+ } from "../chunk-IOENSSZC.js";
5
5
  import "../chunk-UUH4YQOF.js";
6
6
  import "../chunk-3UXOZBHV.js";
7
- import "../chunk-DTTVX6EO.js";
8
- import "../chunk-M7XQSUBB.js";
7
+ import "../chunk-STN5KMSS.js";
9
8
  import "../chunk-L2B3EE7B.js";
9
+ import "../chunk-M7XQSUBB.js";
10
10
  import "../chunk-5UZXUTVO.js";
11
11
  import "../chunk-5GPPACXK.js";
12
+ import "../chunk-SVOZFLIQ.js";
12
13
  import "../chunk-LTJAMRGI.js";
13
14
  import "../chunk-TKZ3AL5V.js";
14
15
  import "../chunk-6CIAGZ6X.js";
15
16
  import "../chunk-J6A3CX5N.js";
16
17
  import "../chunk-DQC3ZZYM.js";
17
- import "../chunk-SVOZFLIQ.js";
18
18
  import "../chunk-JS2HKKOK.js";
19
19
  import "../chunk-AWJ2FHCF.js";
20
20
  import "../chunk-42JKGUFJ.js";
@@ -26,9 +26,9 @@ import "../chunk-DM2T26WE.js";
26
26
  import "../chunk-LDXUBPMO.js";
27
27
  import "../chunk-YTU7WKYN.js";
28
28
  import "../chunk-AAD2ZS6P.js";
29
+ import "../chunk-G7D6GZ5J.js";
29
30
  import "../chunk-VF4XKTX3.js";
30
31
  import "../chunk-W5H6ZRPT.js";
31
- import "../chunk-G7D6GZ5J.js";
32
32
  import "../chunk-VUA4S7P6.js";
33
33
  import "../chunk-IQVQJJL7.js";
34
34
  import "../chunk-L2EXJQJP.js";
@@ -42,13 +42,13 @@ import "../chunk-5GKPFL3S.js";
42
42
  import "../chunk-4DJQYKMN.js";
43
43
  import "../chunk-EYIEWJNI.js";
44
44
  import "../chunk-JUC24CTX.js";
45
- import "../chunk-6MKAMLQL.js";
46
- import "../chunk-JAKIDQB2.js";
47
45
  import "../chunk-NU3CSQ4H.js";
48
46
  import "../chunk-J2HSAU72.js";
49
47
  import "../chunk-A6XUJE5D.js";
50
48
  import "../chunk-P7FMDTKL.js";
51
49
  import "../chunk-VS2IYZRU.js";
50
+ import "../chunk-6MKAMLQL.js";
51
+ import "../chunk-JAKIDQB2.js";
52
52
  import "../chunk-PZ5AY32C.js";
53
53
  export {
54
54
  runCodexMaterialize,
@@ -22,11 +22,11 @@ import {
22
22
  upsertHermesConfig,
23
23
  validateMarketplaceManifest,
24
24
  writeMarketplaceManifest
25
- } from "../chunk-4DLFJJOQ.js";
26
- import "../chunk-UG274TNV.js";
25
+ } from "../chunk-QMN3CIFS.js";
26
+ import "../chunk-E2SPGGUI.js";
27
27
  import {
28
28
  runCodexMaterialize
29
- } from "../chunk-2RLECZ6J.js";
29
+ } from "../chunk-IOENSSZC.js";
30
30
  import {
31
31
  MATERIALIZE_VERSION,
32
32
  SENTINEL_FILE,
@@ -48,17 +48,17 @@ import {
48
48
  getRegistryPath
49
49
  } from "../chunk-K6MV3TRQ.js";
50
50
  import "../chunk-O75CRYGF.js";
51
- import "../chunk-DTTVX6EO.js";
52
- import "../chunk-M7XQSUBB.js";
51
+ import "../chunk-STN5KMSS.js";
53
52
  import "../chunk-L2B3EE7B.js";
53
+ import "../chunk-M7XQSUBB.js";
54
54
  import "../chunk-5UZXUTVO.js";
55
55
  import "../chunk-5GPPACXK.js";
56
+ import "../chunk-SVOZFLIQ.js";
56
57
  import "../chunk-LTJAMRGI.js";
57
58
  import "../chunk-TKZ3AL5V.js";
58
59
  import "../chunk-6CIAGZ6X.js";
59
60
  import "../chunk-J6A3CX5N.js";
60
61
  import "../chunk-DQC3ZZYM.js";
61
- import "../chunk-SVOZFLIQ.js";
62
62
  import "../chunk-JS2HKKOK.js";
63
63
  import "../chunk-AWJ2FHCF.js";
64
64
  import "../chunk-42JKGUFJ.js";
@@ -70,9 +70,9 @@ import "../chunk-DM2T26WE.js";
70
70
  import "../chunk-LDXUBPMO.js";
71
71
  import "../chunk-YTU7WKYN.js";
72
72
  import "../chunk-AAD2ZS6P.js";
73
+ import "../chunk-G7D6GZ5J.js";
73
74
  import "../chunk-VF4XKTX3.js";
74
75
  import "../chunk-W5H6ZRPT.js";
75
- import "../chunk-G7D6GZ5J.js";
76
76
  import "../chunk-VUA4S7P6.js";
77
77
  import "../chunk-IQVQJJL7.js";
78
78
  import "../chunk-L2EXJQJP.js";
@@ -89,13 +89,13 @@ import "../chunk-5GKPFL3S.js";
89
89
  import "../chunk-4DJQYKMN.js";
90
90
  import "../chunk-EYIEWJNI.js";
91
91
  import "../chunk-JUC24CTX.js";
92
- import "../chunk-6MKAMLQL.js";
93
- import "../chunk-JAKIDQB2.js";
94
92
  import "../chunk-NU3CSQ4H.js";
95
93
  import "../chunk-J2HSAU72.js";
96
94
  import "../chunk-A6XUJE5D.js";
97
95
  import "../chunk-P7FMDTKL.js";
98
96
  import "../chunk-VS2IYZRU.js";
97
+ import "../chunk-6MKAMLQL.js";
98
+ import "../chunk-JAKIDQB2.js";
99
99
  import "../chunk-PZ5AY32C.js";
100
100
  export {
101
101
  MARKETPLACE_MANIFEST_FILENAME,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  runConsolidationProvenanceCheck
3
- } from "./chunk-6T4LTI2F.js";
4
- import "./chunk-VF4XKTX3.js";
3
+ } from "./chunk-7XH7VJN4.js";
5
4
  import "./chunk-G7D6GZ5J.js";
5
+ import "./chunk-VF4XKTX3.js";
6
6
  import "./chunk-VS2IYZRU.js";
7
7
  import "./chunk-PZ5AY32C.js";
8
8
  export {
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  GraphDashboardServer
3
- } from "./chunk-YNDLCWXS.js";
4
- import "./chunk-AUDJPF4N.js";
3
+ } from "./chunk-EZ25VE3G.js";
5
4
  import "./chunk-44442YCH.js";
5
+ import "./chunk-AUDJPF4N.js";
6
6
  import "./chunk-Y4Z4I6WK.js";
7
7
  import "./chunk-PZ5AY32C.js";
8
8
  export {