comisai 1.0.23 → 1.0.25

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 (106) hide show
  1. package/node_modules/@comis/agent/dist/executor/pi-executor.js +17 -0
  2. package/node_modules/@comis/agent/dist/index.d.ts +2 -1
  3. package/node_modules/@comis/agent/dist/index.js +1 -1
  4. package/node_modules/@comis/agent/dist/model/auth-storage-adapter.d.ts +21 -0
  5. package/node_modules/@comis/agent/dist/model/auth-storage-adapter.js +15 -1
  6. package/node_modules/@comis/agent/dist/model/model-registry-adapter.d.ts +46 -0
  7. package/node_modules/@comis/agent/dist/model/model-registry-adapter.js +108 -0
  8. package/node_modules/@comis/agent/package.json +1 -1
  9. package/node_modules/@comis/channels/package.json +1 -1
  10. package/node_modules/@comis/cli/package.json +1 -1
  11. package/node_modules/@comis/core/dist/bootstrap.js +5 -0
  12. package/node_modules/@comis/core/dist/config/env-layer.d.ts +31 -0
  13. package/node_modules/@comis/core/dist/config/env-layer.js +41 -0
  14. package/node_modules/@comis/core/dist/config/layered.d.ts +9 -0
  15. package/node_modules/@comis/core/dist/config/layered.js +11 -0
  16. package/node_modules/@comis/core/package.json +1 -1
  17. package/node_modules/@comis/daemon/dist/daemon.js +3 -0
  18. package/node_modules/@comis/daemon/dist/wiring/setup-agents.js +15 -3
  19. package/node_modules/@comis/daemon/package.json +1 -1
  20. package/node_modules/@comis/gateway/package.json +1 -1
  21. package/node_modules/@comis/infra/package.json +1 -1
  22. package/node_modules/@comis/memory/package.json +1 -1
  23. package/node_modules/@comis/scheduler/package.json +1 -1
  24. package/node_modules/@comis/shared/package.json +1 -1
  25. package/node_modules/@comis/skills/package.json +1 -1
  26. package/node_modules/@comis/web/dist/assets/{agent-detail-BG9MGWWj.js → agent-detail-ru-AhppM.js} +270 -270
  27. package/node_modules/@comis/web/dist/assets/agent-editor-hjwRuFVp.js +2173 -0
  28. package/node_modules/@comis/web/dist/assets/{agent-list-LHCJ4rw2.js → agent-list-6Uotjatr.js} +170 -170
  29. package/node_modules/@comis/web/dist/assets/{approvals-q9VH_IKr.js → approvals-C-K6hN2U.js} +13 -13
  30. package/node_modules/@comis/web/dist/assets/billing-view-CxysXH0p.js +375 -0
  31. package/node_modules/@comis/web/dist/assets/{channel-detail-CaInesJM.js → channel-detail-BBCKtmne.js} +265 -265
  32. package/node_modules/@comis/web/dist/assets/channel-list-FkfeOLBQ.js +323 -0
  33. package/node_modules/@comis/web/dist/assets/{chat-console-CNmzl0JW.js → chat-console-BumBaIgO.js} +243 -246
  34. package/node_modules/@comis/web/dist/assets/{config-editor-DX4ITw6y.js → config-editor-C9BSwHGy.js} +477 -477
  35. package/node_modules/@comis/web/dist/assets/{context-dag-browser-BwiaF5tf.js → context-dag-browser-BHm00mJD.js} +105 -105
  36. package/node_modules/@comis/web/dist/assets/{context-engine-BZ5Am6hA.js → context-engine-BENY3pWE.js} +136 -136
  37. package/node_modules/@comis/web/dist/assets/decorate-BvWYovGE.js +38 -0
  38. package/node_modules/@comis/web/dist/assets/{delivery-view-OfBZof-m.js → delivery-view-BCnkPsAp.js} +134 -134
  39. package/node_modules/@comis/web/dist/assets/{diagnostics-view-YFwCxgr2.js → diagnostics-view-C_jQFG2H.js} +82 -82
  40. package/node_modules/@comis/web/dist/assets/directive-BOYXJ-K-.js +1 -0
  41. package/node_modules/@comis/web/dist/assets/{extract-variables-BM5qyK-s.js → extract-variables-B7-Doo7l.js} +39 -39
  42. package/node_modules/@comis/web/dist/assets/{ic-array-editor-B7m6x7-S.js → ic-array-editor-BLoEyeLS.js} +29 -29
  43. package/node_modules/@comis/web/dist/assets/{ic-breadcrumb-CUMpp3BL.js → ic-breadcrumb-DqN6G3gc.js} +16 -16
  44. package/node_modules/@comis/web/dist/assets/{ic-budget-segment-bar-BtJ6x5mN.js → ic-budget-segment-bar-zLsMzjDO.js} +20 -20
  45. package/node_modules/@comis/web/dist/assets/ic-chat-message-FdQcZsSQ.js +352 -0
  46. package/node_modules/@comis/web/dist/assets/{ic-confirm-dialog-CCDbB04e.js → ic-confirm-dialog-DGlPbV1T.js} +26 -26
  47. package/node_modules/@comis/web/dist/assets/{ic-connection-dot-CnT1b8xr.js → ic-connection-dot-BgYiK2N4.js} +13 -13
  48. package/node_modules/@comis/web/dist/assets/ic-data-table-CKIvr-ag.js +277 -0
  49. package/node_modules/@comis/web/dist/assets/ic-delivery-row-B3YwjjuM.js +67 -0
  50. package/node_modules/@comis/web/dist/assets/{ic-detail-panel-BF83r-if.js → ic-detail-panel-DiCe4hLr.js} +27 -27
  51. package/node_modules/@comis/web/dist/assets/{ic-empty-state-60l2ePhd.js → ic-empty-state-CM3Wbj2f.js} +19 -19
  52. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-ByRjij68.js +359 -0
  53. package/node_modules/@comis/web/dist/assets/ic-icon-BGNCCPpZ.js +33 -0
  54. package/node_modules/@comis/web/dist/assets/{ic-layer-waterfall-COvEYMg5.js → ic-layer-waterfall-WkaFyu-l.js} +18 -18
  55. package/node_modules/@comis/web/dist/assets/ic-relative-time-B3UAnTqg.js +12 -0
  56. package/node_modules/@comis/web/dist/assets/{ic-search-input-CSOxY9g7.js → ic-search-input-B02AGw1i.js} +22 -22
  57. package/node_modules/@comis/web/dist/assets/{ic-select-Ce-Raudx.js → ic-select-BqfZISjw.js} +29 -29
  58. package/node_modules/@comis/web/dist/assets/ic-tabs-yBjkWKJH.js +95 -0
  59. package/node_modules/@comis/web/dist/assets/ic-tag-CvMVQFRR.js +33 -0
  60. package/node_modules/@comis/web/dist/assets/{ic-time-range-picker-CypCT68y.js → ic-time-range-picker-DXbYeBmY.js} +31 -31
  61. package/node_modules/@comis/web/dist/assets/{ic-tool-call-7MaXSsCW.js → ic-tool-call-DMPHsLyx.js} +51 -51
  62. package/node_modules/@comis/web/dist/assets/index-CVEaS9aY.css +2 -0
  63. package/node_modules/@comis/web/dist/assets/index-FLPhHz8p.js +2792 -0
  64. package/node_modules/@comis/web/dist/assets/{mcp-management-BNZPnpDn.js → mcp-management-5jyScQis.js} +209 -209
  65. package/node_modules/@comis/web/dist/assets/{media-config-BBvTYxOX.js → media-config-J9oT9PPs.js} +154 -154
  66. package/node_modules/@comis/web/dist/assets/{media-test-BkK3RCRK.js → media-test-DGTCtM8-.js} +259 -259
  67. package/node_modules/@comis/web/dist/assets/{memory-inspector-1hDGCGat.js → memory-inspector-D5Re9ptG.js} +450 -450
  68. package/node_modules/@comis/web/dist/assets/{message-center-CXefwsUu.js → message-center-cRLK6ZmG.js} +290 -290
  69. package/node_modules/@comis/web/dist/assets/{models-C1qcU_j3.js → models-D5vu07MR.js} +371 -371
  70. package/node_modules/@comis/web/dist/assets/observability-types-D0tkwElU.js +1 -0
  71. package/node_modules/@comis/web/dist/assets/{observe-view-C0VBhX4C.js → observe-view-CalNNEmd.js} +399 -399
  72. package/node_modules/@comis/web/dist/assets/pipeline-builder-DUYDGwZf.js +1495 -0
  73. package/node_modules/@comis/web/dist/assets/{pipeline-history-DkfOQ6SW.js → pipeline-history-BAO8brOe.js} +124 -124
  74. package/node_modules/@comis/web/dist/assets/{pipeline-history-detail-hyHgD0ai.js → pipeline-history-detail-DectIoQt.js} +65 -65
  75. package/node_modules/@comis/web/dist/assets/{pipeline-list-BPW8hV-q.js → pipeline-list-BHlaBKww.js} +227 -227
  76. package/node_modules/@comis/web/dist/assets/{pipeline-monitor-Bip16T7e.js → pipeline-monitor-BhtpNEHf.js} +298 -298
  77. package/node_modules/@comis/web/dist/assets/{scheduler-BGgwKd06.js → scheduler-VafN_8xi.js} +486 -486
  78. package/node_modules/@comis/web/dist/assets/{security-D15st4xx.js → security-QQXMRTlo.js} +389 -389
  79. package/node_modules/@comis/web/dist/assets/{session-detail-SGEYNJ0M.js → session-detail-BpZ_8Yih.js} +294 -294
  80. package/node_modules/@comis/web/dist/assets/session-key-parser-Dkqcj2Ss.js +1 -0
  81. package/node_modules/@comis/web/dist/assets/session-list-DfCm8Cec.js +231 -0
  82. package/node_modules/@comis/web/dist/assets/{setup-wizard-nT0tz9QP.js → setup-wizard-C-z477CG.js} +486 -494
  83. package/node_modules/@comis/web/dist/assets/{skills-D8yVfSUy.js → skills-BCOGPf6s.js} +329 -329
  84. package/node_modules/@comis/web/dist/assets/{subagents-HHXMeHYo.js → subagents-l-auUraL.js} +74 -74
  85. package/node_modules/@comis/web/dist/assets/{workspace-manager-BQlr10iH.js → workspace-manager-DlvBixiq.js} +236 -236
  86. package/node_modules/@comis/web/dist/index.html +3 -2
  87. package/node_modules/@comis/web/package.json +1 -1
  88. package/package.json +15 -15
  89. package/node_modules/@comis/web/dist/assets/agent-editor-C26Q_xCs.js +0 -2173
  90. package/node_modules/@comis/web/dist/assets/billing-view-CtYvBqTE.js +0 -375
  91. package/node_modules/@comis/web/dist/assets/channel-list-B8dj3O9a.js +0 -323
  92. package/node_modules/@comis/web/dist/assets/directive-DoeGSK_T.js +0 -1
  93. package/node_modules/@comis/web/dist/assets/ic-chat-message-CFyDJd0z.js +0 -352
  94. package/node_modules/@comis/web/dist/assets/ic-data-table-CKUNTxHw.js +0 -277
  95. package/node_modules/@comis/web/dist/assets/ic-delivery-row-GP5Fkygs.js +0 -67
  96. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-C8FuSMe1.js +0 -359
  97. package/node_modules/@comis/web/dist/assets/ic-icon-xeGTVhVG.js +0 -33
  98. package/node_modules/@comis/web/dist/assets/ic-relative-time-3FqpjeAI.js +0 -12
  99. package/node_modules/@comis/web/dist/assets/ic-tabs-B7QtM_v8.js +0 -95
  100. package/node_modules/@comis/web/dist/assets/ic-tag-CPPUnDLF.js +0 -33
  101. package/node_modules/@comis/web/dist/assets/index-CEcM1R_C.js +0 -2830
  102. package/node_modules/@comis/web/dist/assets/index-CIJFuItj.css +0 -1
  103. package/node_modules/@comis/web/dist/assets/observability-types-D7jUtSde.js +0 -1
  104. package/node_modules/@comis/web/dist/assets/pipeline-builder-DcUUIrm0.js +0 -1496
  105. package/node_modules/@comis/web/dist/assets/session-key-parser-DPORMVyU.js +0 -1
  106. package/node_modules/@comis/web/dist/assets/session-list-6ybUTxbY.js +0 -231
@@ -1,13 +1,4 @@
1
- import{s as f,f as _,i as y,n as m,a as x,b as i,t as $,A as h,r as n}from"./index-CEcM1R_C.js";import"./ic-data-table-CKUNTxHw.js";import"./ic-tag-CPPUnDLF.js";import"./ic-relative-time-3FqpjeAI.js";import"./ic-search-input-CSOxY9g7.js";import"./ic-detail-panel-BF83r-if.js";import"./ic-confirm-dialog-CCDbB04e.js";var C=Object.defineProperty,S=Object.getOwnPropertyDescriptor,w=(e,t,r,c)=>{for(var a=c>1?void 0:c?S(t,r):t,d=e.length-1,l;d>=0;d--)(l=e[d])&&(a=(c?l(t,r,a):l(a))||a);return c&&a&&C(t,r,a),a};let u=class extends x{constructor(){super(...arguments),this.entries=[],this.selectable=!1}_hasScores(){return this.entries.some(e=>e.score!==void 0&&e.score!==null)}_getColumns(){const e=[];return this._hasScores()&&e.push({key:"score",label:"Score",sortable:!0,render:t=>{const r=t;return r==null?"":i`<span class="score-cell">${r.toFixed(3)}</span>`}}),e.push({key:"content",label:"Content",sortable:!1,render:t=>i`<span class="content-cell">${String(t??"")}</span>`},{key:"memoryType",label:"Type",sortable:!0,render:t=>{const r=this._typeVariant(String(t??""));return i`<ic-tag variant=${r}>${t}</ic-tag>`}},{key:"trustLevel",label:"Trust",sortable:!0,render:t=>{const r=this._trustVariant(String(t??""));return i`<ic-tag variant=${r}>${t}</ic-tag>`}},{key:"agentId",label:"Agent",sortable:!0},{key:"createdAt",label:"Age",sortable:!0,render:t=>{const r=t;return r?i`<ic-relative-time .timestamp=${r}></ic-relative-time>`:""}}),e}_typeVariant(e){const t=(e??"").toLowerCase();return t==="working"||t==="episodic"?"info":t==="semantic"?"success":t==="procedural"?"warning":"default"}_trustVariant(e){const t=(e??"").toLowerCase();return t==="system"?"success":t==="learned"?"info":t==="external"?"warning":"default"}_handleRowClick(e){this.dispatchEvent(new CustomEvent("detail-requested",{detail:e.detail,bubbles:!0,composed:!0}))}_handleSelectionChange(e){this.dispatchEvent(new CustomEvent("selection-change",{detail:e.detail,bubbles:!0,composed:!0}))}render(){const e=this._getColumns();return i`
2
- <ic-data-table
3
- .columns=${e}
4
- .rows=${this.entries}
5
- ?selectable=${this.selectable}
6
- emptyMessage="No memory entries found"
7
- @row-click=${this._handleRowClick}
8
- @selection-change=${this._handleSelectionChange}
9
- ></ic-data-table>
10
- `}};u.styles=[f,_,y`
1
+ import{c as e,f as t,h as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"./decorate-BvWYovGE.js";import"./index-FLPhHz8p.js";import"./ic-tag-CvMVQFRR.js";import"./ic-confirm-dialog-DGlPbV1T.js";import"./ic-relative-time-B3UAnTqg.js";import"./ic-data-table-CKIvr-ag.js";import"./ic-search-input-B02AGw1i.js";import"./ic-detail-panel-DiCe4hLr.js";var u=class extends r{constructor(...e){super(...e),this.entries=[],this.selectable=!1}static{this.styles=[o,i,n`
11
2
  :host {
12
3
  display: block;
13
4
  }
@@ -24,96 +15,16 @@ import{s as f,f as _,i as y,n as m,a as x,b as i,t as $,A as h,r as n}from"./ind
24
15
  text-overflow: ellipsis;
25
16
  white-space: nowrap;
26
17
  }
27
- `];w([m({attribute:!1})],u.prototype,"entries",2);w([m({type:Boolean})],u.prototype,"selectable",2);u=w([$("ic-memory-table")],u);var E=Object.defineProperty,T=Object.getOwnPropertyDescriptor,k=(e,t,r,c)=>{for(var a=c>1?void 0:c?T(t,r):t,d=e.length-1,l;d>=0;d--)(l=e[d])&&(a=(c?l(t,r,a):l(a))||a);return c&&a&&E(t,r,a),a};let v=class extends x{constructor(){super(...arguments),this.entry=null}_typeVariant(e){const t=(e??"").toLowerCase();return t==="working"||t==="episodic"?"info":t==="semantic"?"success":t==="procedural"?"warning":"default"}_trustVariant(e){const t=(e??"").toLowerCase();return t==="system"?"success":t==="learned"?"info":t==="external"?"warning":"default"}_formatTimestamp(e){return new Date(e).toLocaleString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}_handleDelete(){this.entry&&this.dispatchEvent(new CustomEvent("delete-requested",{detail:this.entry.id,bubbles:!0,composed:!0}))}_handleClose(){this.dispatchEvent(new CustomEvent("close",{bubbles:!0,composed:!0}))}render(){if(!this.entry)return i`<div class="empty-state">No entry selected</div>`;const e=this.entry;return i`
28
- <!-- ID -->
29
- <div class="detail-section">
30
- <div class="detail-label">ID</div>
31
- <div class="detail-id">${e.id}</div>
32
- </div>
33
-
34
- <!-- Score (only if present) -->
35
- ${e.score!==void 0&&e.score!==null?i`
36
- <div class="detail-section">
37
- <div class="detail-label">Relevance Score</div>
38
- <div class="score-display">${e.score.toFixed(4)}</div>
39
- </div>
40
- `:h}
41
-
42
- <!-- Content -->
43
- <div class="detail-section">
44
- <div class="detail-label">Content</div>
45
- <div class="content-block">${e.content}</div>
46
- </div>
47
-
48
- <!-- Classification -->
49
- <div class="detail-section">
50
- <div class="detail-label">Classification</div>
51
- <div class="badges-row">
52
- <ic-tag variant=${this._typeVariant(e.memoryType)}>${e.memoryType}</ic-tag>
53
- <ic-tag variant=${this._trustVariant(e.trustLevel)}>${e.trustLevel}</ic-tag>
54
- </div>
55
- </div>
56
-
57
- <!-- Agent -->
58
- <div class="detail-section">
59
- <div class="detail-label">Agent</div>
60
- <div class="detail-value">${e.agentId}</div>
61
- </div>
62
-
63
- <!-- Source (if available) -->
64
- ${e.source?i`
65
- <div class="detail-section">
66
- <div class="detail-label">Source</div>
67
- <div class="detail-value">${e.source}</div>
68
- </div>
69
- `:h}
70
-
71
- <!-- Tags (if present) -->
72
- ${e.tags&&e.tags.length>0?i`
73
- <div class="detail-section">
74
- <div class="detail-label">Tags</div>
75
- <div class="tags-list">
76
- ${e.tags.map(t=>i`<ic-tag variant="default">${t}</ic-tag>`)}
77
- </div>
78
- </div>
79
- `:h}
80
-
81
- <!-- Embedding status -->
82
- <div class="detail-section">
83
- <div class="detail-label">Embedding</div>
84
- <div class="embedding-status">
85
- ${e.hasEmbedding?i`
86
- <span class="embedding-icon embedding-icon--yes">&#x2713;</span>
87
- <span>Indexed</span>
88
- ${e.embeddingDims?i`<span class="embedding-dims">(${e.embeddingDims} dims)</span>`:h}
89
- `:i`
90
- <span class="embedding-icon embedding-icon--no">&#x2717;</span>
91
- <span>Not indexed</span>
92
- `}
93
- </div>
94
- </div>
95
-
96
- <!-- Created timestamp -->
97
- <div class="detail-section">
98
- <div class="detail-label">Created</div>
99
- <div class="timestamp-value">${this._formatTimestamp(e.createdAt)}</div>
100
- </div>
101
-
102
- <!-- Updated timestamp (if exists) -->
103
- ${e.updatedAt?i`
104
- <div class="detail-section">
105
- <div class="detail-label">Updated</div>
106
- <div class="timestamp-value">${this._formatTimestamp(e.updatedAt)}</div>
107
- </div>
108
- `:h}
109
-
110
- <!-- Delete button -->
111
- <div class="detail-section">
112
- <button class="delete-btn" @click=${this._handleDelete}>
113
- Delete Entry
114
- </button>
115
- </div>
116
- `}};v.styles=[f,_,y`
18
+ `]}_hasScores(){return this.entries.some(e=>e.score!==void 0&&e.score!==null)}_getColumns(){let e=[];return this._hasScores()&&e.push({key:`score`,label:`Score`,sortable:!0,render:e=>{let n=e;return n==null?``:t`<span class="score-cell">${n.toFixed(3)}</span>`}}),e.push({key:`content`,label:`Content`,sortable:!1,render:e=>t`<span class="content-cell">${String(e??``)}</span>`},{key:`memoryType`,label:`Type`,sortable:!0,render:e=>t`<ic-tag variant=${this._typeVariant(String(e??``))}>${e}</ic-tag>`},{key:`trustLevel`,label:`Trust`,sortable:!0,render:e=>t`<ic-tag variant=${this._trustVariant(String(e??``))}>${e}</ic-tag>`},{key:`agentId`,label:`Agent`,sortable:!0},{key:`createdAt`,label:`Age`,sortable:!0,render:e=>{let n=e;return n?t`<ic-relative-time .timestamp=${n}></ic-relative-time>`:``}}),e}_typeVariant(e){let t=(e??``).toLowerCase();return t===`working`||t===`episodic`?`info`:t===`semantic`?`success`:t===`procedural`?`warning`:`default`}_trustVariant(e){let t=(e??``).toLowerCase();return t===`system`?`success`:t===`learned`?`info`:t===`external`?`warning`:`default`}_handleRowClick(e){this.dispatchEvent(new CustomEvent(`detail-requested`,{detail:e.detail,bubbles:!0,composed:!0}))}_handleSelectionChange(e){this.dispatchEvent(new CustomEvent(`selection-change`,{detail:e.detail,bubbles:!0,composed:!0}))}render(){return t`
19
+ <ic-data-table
20
+ .columns=${this._getColumns()}
21
+ .rows=${this.entries}
22
+ ?selectable=${this.selectable}
23
+ emptyMessage="No memory entries found"
24
+ @row-click=${this._handleRowClick}
25
+ @selection-change=${this._handleSelectionChange}
26
+ ></ic-data-table>
27
+ `}};c([s({attribute:!1})],u.prototype,`entries`,void 0),c([s({type:Boolean})],u.prototype,`selectable`,void 0),u=c([e(`ic-memory-table`)],u);var d=class extends r{constructor(...e){super(...e),this.entry=null}static{this.styles=[o,i,n`
117
28
  :host {
118
29
  display: block;
119
30
  }
@@ -234,370 +145,96 @@ import{s as f,f as _,i as y,n as m,a as x,b as i,t as $,A as h,r as n}from"./ind
234
145
  text-align: center;
235
146
  padding: var(--ic-space-xl);
236
147
  }
237
- `];k([m({attribute:!1})],v.prototype,"entry",2);v=k([$("ic-memory-detail")],v);var F=Object.defineProperty,D=Object.getOwnPropertyDescriptor,o=(e,t,r,c)=>{for(var a=c>1?void 0:c?D(t,r):t,d=e.length-1,l;d>=0;d--)(l=e[d])&&(a=(c?l(t,r,a):l(a))||a);return c&&a&&F(t,r,a),a};const b=["working","episodic","semantic","procedural"],g=["system","learned","external"];let s=class extends x{constructor(){super(...arguments),this.apiClient=null,this.rpcClient=null,this._mode="search",this._query="",this._results=[],this._loading=!1,this._searched=!1,this._error="",this._stats=null,this._statsLoaded=!1,this._selectedEntry=null,this._selectedIds=[],this._typeFilter=new Set(b),this._trustFilter=new Set(g),this._agentFilter="",this._dateFrom="",this._dateTo="",this._browseOffset=0,this._browseLimit=25,this._total=0,this._agents=[],this._confirmOpen=!1,this._createOpen=!1,this._createContent="",this._createTags="",this._createTrustLevel="learned",this._createProvenance="",this._createSubmitting=!1,this._createMessage="",this._createMessageType="success",this._embeddingStats=null,this._embeddingLoading=!1,this._flushDialogOpen=!1,this._flushAgentId="",this._flushSubmitting=!1}connectedCallback(){super.connectedCallback()}updated(e){e.has("apiClient")&&this.apiClient&&(this._loadStats(),this._loadAgents()),e.has("rpcClient")&&this.rpcClient&&this._loadEmbeddingStats()}_normalizeEntry(e){return{id:String(e.id??""),content:String(e.content??""),memoryType:String(e.memoryType??e.type??"unknown"),trustLevel:String(e.trustLevel??e.trust??"unknown"),agentId:String(e.agentId??"unknown"),tenantId:String(e.tenantId??"default"),source:typeof e.source=="string"?e.source:void 0,tags:Array.isArray(e.tags)?e.tags:void 0,score:typeof e.score=="number"?e.score:void 0,hasEmbedding:!!(e.hasEmbedding??!1),embeddingDims:typeof e.embeddingDims=="number"?e.embeddingDims:void 0,createdAt:typeof e.createdAt=="number"?e.createdAt:Date.now(),updatedAt:typeof e.updatedAt=="number"?e.updatedAt:void 0}}async _loadStats(){if(this.apiClient)try{const t=await this.apiClient.getMemoryStats(),r=typeof t.stats=="object"&&t.stats!==null?t.stats:t;this._stats={totalEntries:r.totalEntries??0,totalSessions:r.totalSessions??0,embeddedEntries:r.embeddedEntries??0,dbSizeBytes:r.dbSizeBytes??0,byType:r.byType,byTrustLevel:r.byTrustLevel,byAgent:r.byAgent,oldestCreatedAt:r.oldestCreatedAt},this._statsLoaded=!0}catch{this._statsLoaded=!0}}async _loadAgents(){if(this.apiClient)try{const e=await this.apiClient.getAgents();this._agents=e.map(t=>t.id)}catch{}}async _loadEmbeddingStats(){if(!(!this.rpcClient||this._embeddingLoading)){this._embeddingLoading=!0;try{const e=await this.rpcClient.call("memory.embeddingCache");this._embeddingStats=e}catch{}finally{this._embeddingLoading=!1}}}async _search(){const e=this._query.trim();if(!(!e||!this.apiClient||this._loading)){this._loading=!0,this._error="",this._selectedIds=[];try{const t=await this.apiClient.searchMemory(e,50);this._results=t.map(r=>this._normalizeEntry(r)),this._searched=!0}catch(t){this._error=t instanceof Error&&!t.message.startsWith("Request failed")?t.message:"Search failed. Please try again.",this._results=[]}finally{this._loading=!1}}}async _browse(){if(!(!this.apiClient||this._loading)){this._loading=!0,this._error="",this._selectedIds=[];try{const e={offset:this._browseOffset,limit:this._browseLimit};this._typeFilter.size<b.length&&(e.type=[...this._typeFilter].join(",")),this._trustFilter.size<g.length&&(e.trust=[...this._trustFilter].join(",")),this._agentFilter&&(e.agentId=this._agentFilter),this._dateFrom&&(e.from=new Date(this._dateFrom).getTime()),this._dateTo&&(e.to=new Date(this._dateTo).getTime());const t=await this.apiClient.browseMemory(e);this._results=t.entries.map(r=>this._normalizeEntry(r)),this._total=t.total,this._searched=!0}catch(e){this._error=e instanceof Error&&!e.message.startsWith("Request failed")?e.message:"Browse failed. Please try again.",this._results=[]}finally{this._loading=!1}}}_applyFilters(e){return e.filter(t=>{if(!this._typeFilter.has(t.memoryType)||!this._trustFilter.has(t.trustLevel)||this._agentFilter&&t.agentId!==this._agentFilter)return!1;if(this._dateFrom){const r=new Date(this._dateFrom).getTime();if(t.createdAt<r)return!1}if(this._dateTo){const r=new Date(this._dateTo).getTime()+864e5;if(t.createdAt>r)return!1}return!0})}_getFilteredResults(){return this._mode==="search"?this._applyFilters(this._results):this._results}_toggleTypeFilter(e){const t=new Set(this._typeFilter);t.has(e)?t.delete(e):t.add(e),this._typeFilter=t}_toggleTrustFilter(e){const t=new Set(this._trustFilter);t.has(e)?t.delete(e):t.add(e),this._trustFilter=t}_handleModeChange(e){this._mode!==e&&(this._mode=e,this._results=[],this._searched=!1,this._error="",this._selectedIds=[],this._browseOffset=0,e==="browse"&&this._browse())}_handleSearchEvent(e){this._query=e.detail,this._query.trim()&&this._search()}_handleDetailRequested(e){this._selectedEntry=e.detail}_handleDetailClose(){this._selectedEntry=null}_handleSelectionChange(e){this._selectedIds=e.detail}_handleAgentFilterChange(e){this._agentFilter=e.target.value,this._mode==="browse"&&(this._browseOffset=0,this._browse())}_handleDateFromChange(e){this._dateFrom=e.target.value,this._mode==="browse"&&(this._browseOffset=0,this._browse())}_handleDateToChange(e){this._dateTo=e.target.value,this._mode==="browse"&&(this._browseOffset=0,this._browse())}_toggleCreateForm(){this._createOpen=!this._createOpen,this._createOpen||(this._createContent="",this._createTags="",this._createTrustLevel="learned",this._createProvenance="",this._createMessage="")}async _submitCreate(){const e=this._createContent.trim();if(!(!e||!this.rpcClient||this._createSubmitting)){this._createSubmitting=!0,this._createMessage="";try{const t=this._createTags.split(",").map(r=>r.trim()).filter(Boolean);this._createProvenance.trim()&&t.push(`provenance:${this._createProvenance.trim()}`),await this.rpcClient.call("memory.store",{content:e,tags:t.length>0?t:void 0,trustLevel:this._createTrustLevel}),this._createMessage="Memory entry created successfully.",this._createMessageType="success",this._createContent="",this._createTags="",this._createProvenance="",this._loadStats(),this._mode==="browse"&&this._browse()}catch(t){this._createMessage=t instanceof Error?t.message:"Failed to create memory entry.",this._createMessageType="error"}finally{this._createSubmitting=!1}}}_openFlushDialog(){this._flushAgentId="",this._flushDialogOpen=!0}async _confirmFlush(){if(this._flushDialogOpen=!1,!(!this.rpcClient||this._flushSubmitting)){this._flushSubmitting=!0;try{await this.rpcClient.call("memory.flush",{agent_id:this._flushAgentId||void 0}),this._loadStats(),this._results=[],this._searched=!1,this._mode==="browse"&&this._browse()}catch(e){this._error=e instanceof Error?e.message:"Flush failed. Please try again."}finally{this._flushSubmitting=!1}}}_cancelFlush(){this._flushDialogOpen=!1}_handleBulkDelete(){this._confirmOpen=!0}async _confirmBulkDelete(){if(this._confirmOpen=!1,!(!this.apiClient||this._selectedIds.length===0))try{await this.apiClient.deleteMemoryBulk(this._selectedIds);const e=new Set(this._selectedIds);this._results=this._results.filter(t=>!e.has(t.id)),this._selectedIds=[],this._loadStats()}catch(e){this._error=e instanceof Error?e.message:"Delete failed. Please try again."}}_cancelBulkDelete(){this._confirmOpen=!1}async _handleExport(e){if(this.apiClient)try{const t=await this.apiClient.exportMemory(e),r=new Blob([t],{type:"application/jsonl"}),c=URL.createObjectURL(r),a=document.createElement("a");a.href=c,a.download=`memory-export-${Date.now()}.jsonl`,a.click(),URL.revokeObjectURL(c)}catch(t){this._error=t instanceof Error?t.message:"Export failed. Please try again."}}_handleExportAll(){this._handleExport()}_handleExportSelected(){this._handleExport(this._selectedIds)}async _handleEntryDeleted(e){if(!this.apiClient)return;const t=e.detail;try{await this.apiClient.deleteMemory(t),this._results=this._results.filter(r=>r.id!==t),this._selectedEntry=null,this._loadStats()}catch(r){this._error=r instanceof Error?r.message:"Delete failed. Please try again."}}_handleBrowsePrev(){this._browseOffset=Math.max(0,this._browseOffset-this._browseLimit),this._browse()}_handleBrowseNext(){this._browseOffset+=this._browseLimit,this._browse()}_formatBytes(e){if(e===0)return"0 B";const t=["B","KB","MB","GB"],r=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,r)).toFixed(r===0?0:1)} ${t[r]}`}_formatNumber(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}_formatRelativeTime(e){const r=Date.now()-e,c=Math.floor(r/1e3),a=Math.floor(c/60),d=Math.floor(a/60),l=Math.floor(d/24);if(l>365){const p=Math.floor(l/365);return`${p} year${p!==1?"s":""} ago`}if(l>30){const p=Math.floor(l/30);return`${p} month${p!==1?"s":""} ago`}return l>0?`${l} day${l!==1?"s":""} ago`:d>0?`${d} hour${d!==1?"s":""} ago`:a>0?`${a} min${a!==1?"s":""} ago`:"just now"}_formatFullDate(e){return new Date(e).toLocaleString()}_renderAgentChart(){const e=this._stats?.byAgent;if(!e)return h;const t=Object.entries(e).sort(([,d],[,l])=>l-d);if(t.length===0)return h;const r=t[0][1],c=t.slice(0,10),a=t.length-c.length;return i`
238
- <div class="agent-chart">
239
- <div class="agent-chart-title">Entries by Agent</div>
240
- ${c.map(([d,l])=>i`
241
- <div class="bar-container">
242
- <div class="bar-label" title=${d}>${d}</div>
243
- <div class="bar-track">
244
- <div
245
- class="bar-fill"
246
- style="width: ${r>0?l/r*100:0}%"
247
- ></div>
248
- </div>
249
- <div class="bar-value">${this._formatNumber(l)}</div>
250
- </div>
251
- `)}
252
- ${a>0?i`<div class="agent-chart-overflow">and ${a} more</div>`:h}
253
- </div>
254
- `}_renderEmbeddingSection(){if(!this._embeddingStats)return h;const e=this._embeddingStats,t=e.circuitBreaker.state,r=t==="closed"?"success":t==="halfOpen"?"warning":t==="open"?"error":"default",c=t==="closed"?"Closed (Healthy)":t==="halfOpen"?"Half-Open (Recovering)":t==="open"?"Open (Failing)":"Unknown",a=e.vecAvailable?"success":"error",d=e.vecAvailable?"Active":"Unavailable";if(!e.enabled)return i`
255
- <div class="embedding-section">
256
- <div class="section-heading">Embedding Infrastructure</div>
257
- <div class="embedding-disabled">
258
- <span>Embedding cache not configured</span>
259
- <span>Vec: <ic-tag variant=${a}>${d}</ic-tag></span>
260
- <span>CB: <ic-tag variant=${r}>${c}</ic-tag></span>
261
- </div>
262
- </div>
263
- `;const l=e.l1?(e.l1.hitRate*100).toFixed(1)+"%":"N/A",p=e.l1?`${e.l1.entries}/${e.l1.maxEntries}`:"N/A";return i`
264
- <div class="embedding-section">
265
- <div class="section-heading">Embedding Infrastructure</div>
266
- <div class="stats-row">
267
- <ic-stat-card label="Provider" value=${e.provider??"N/A"}></ic-stat-card>
268
- <ic-stat-card label="L1 Hit Rate" value=${l}></ic-stat-card>
269
- <ic-stat-card label="L1 Entries" value=${p}></ic-stat-card>
270
- <ic-stat-card label="Vector Search" value=${d}></ic-stat-card>
271
- </div>
272
- <div class="stats-row">
273
- <ic-stat-card label="L1 Hits" value=${this._formatNumber(e.l1?.hits??0)}></ic-stat-card>
274
- <ic-stat-card label="L1 Misses" value=${this._formatNumber(e.l1?.misses??0)}></ic-stat-card>
275
- <ic-stat-card label="Circuit Breaker" value=${c}></ic-stat-card>
276
- </div>
148
+ `]}_typeVariant(e){let t=(e??``).toLowerCase();return t===`working`||t===`episodic`?`info`:t===`semantic`?`success`:t===`procedural`?`warning`:`default`}_trustVariant(e){let t=(e??``).toLowerCase();return t===`system`?`success`:t===`learned`?`info`:t===`external`?`warning`:`default`}_formatTimestamp(e){return new Date(e).toLocaleString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}_handleDelete(){this.entry&&this.dispatchEvent(new CustomEvent(`delete-requested`,{detail:this.entry.id,bubbles:!0,composed:!0}))}_handleClose(){this.dispatchEvent(new CustomEvent(`close`,{bubbles:!0,composed:!0}))}render(){if(!this.entry)return t`<div class="empty-state">No entry selected</div>`;let e=this.entry;return t`
149
+ <!-- ID -->
150
+ <div class="detail-section">
151
+ <div class="detail-label">ID</div>
152
+ <div class="detail-id">${e.id}</div>
277
153
  </div>
278
- `}render(){const e=this._getFilteredResults();return i`
279
- <div class="page-header">Memory Inspector</div>
280
154
 
281
- <!-- Stat cards -->
282
- ${this._statsLoaded&&this._stats?i`
283
- <div class="stats-row">
284
- <ic-stat-card
285
- label="Total Entries"
286
- value=${this._formatNumber(this._stats.totalEntries)}
287
- ></ic-stat-card>
288
- <ic-stat-card
289
- label="Sessions"
290
- value=${this._formatNumber(this._stats.totalSessions)}
291
- ></ic-stat-card>
292
- <ic-stat-card
293
- label="Vectors"
294
- value=${this._formatNumber(this._stats.embeddedEntries)}
295
- ></ic-stat-card>
296
- <ic-stat-card
297
- label="DB Size"
298
- value=${this._formatBytes(this._stats.dbSizeBytes)}
299
- ></ic-stat-card>
300
- ${this._stats.oldestCreatedAt!=null?i`
301
- <ic-stat-card
302
- label="Oldest Entry"
303
- value=${this._formatRelativeTime(this._stats.oldestCreatedAt)}
304
- title=${this._formatFullDate(this._stats.oldestCreatedAt)}
305
- ></ic-stat-card>
306
- `:h}
155
+ <!-- Score (only if present) -->
156
+ ${e.score!==void 0&&e.score!==null?t`
157
+ <div class="detail-section">
158
+ <div class="detail-label">Relevance Score</div>
159
+ <div class="score-display">${e.score.toFixed(4)}</div>
307
160
  </div>
308
- ${this._stats.byType||this._stats.byTrustLevel?i`
309
- <div class="stats-row">
310
- ${this._stats.byType?Object.entries(this._stats.byType).map(([t,r])=>i`
311
- <ic-stat-card label=${t} value=${this._formatNumber(r)}></ic-stat-card>
312
- `):h}
313
- ${this._stats.byTrustLevel?Object.entries(this._stats.byTrustLevel).map(([t,r])=>i`
314
- <ic-stat-card label=${"Trust: "+t} value=${this._formatNumber(r)}></ic-stat-card>
315
- `):h}
316
- </div>
317
- `:h}
318
- ${this._renderAgentChart()}
319
- `:h}
320
-
321
- <!-- Embedding Infrastructure -->
322
- ${this._renderEmbeddingSection()}
161
+ `:l}
323
162
 
324
- <!-- Creation form -->
325
- <button class="create-toggle" @click=${this._toggleCreateForm}>
326
- ${this._createOpen?"- Hide Create Form":"+ Create Entry"}
327
- </button>
163
+ <!-- Content -->
164
+ <div class="detail-section">
165
+ <div class="detail-label">Content</div>
166
+ <div class="content-block">${e.content}</div>
167
+ </div>
328
168
 
329
- ${this._createOpen?i`
330
- <div class="create-form">
331
- <div class="create-form-title">Create Memory Entry</div>
169
+ <!-- Classification -->
170
+ <div class="detail-section">
171
+ <div class="detail-label">Classification</div>
172
+ <div class="badges-row">
173
+ <ic-tag variant=${this._typeVariant(e.memoryType)}>${e.memoryType}</ic-tag>
174
+ <ic-tag variant=${this._trustVariant(e.trustLevel)}>${e.trustLevel}</ic-tag>
175
+ </div>
176
+ </div>
332
177
 
333
- <div class="create-field">
334
- <label class="create-label">Content *</label>
335
- <textarea
336
- class="create-textarea"
337
- placeholder="Memory content..."
338
- .value=${this._createContent}
339
- @input=${t=>{this._createContent=t.target.value}}
340
- ></textarea>
341
- </div>
178
+ <!-- Agent -->
179
+ <div class="detail-section">
180
+ <div class="detail-label">Agent</div>
181
+ <div class="detail-value">${e.agentId}</div>
182
+ </div>
342
183
 
343
- <div class="create-field">
344
- <label class="create-label">Tags</label>
345
- <input
346
- class="create-input"
347
- type="text"
348
- placeholder="tag1, tag2, ..."
349
- .value=${this._createTags}
350
- @input=${t=>{this._createTags=t.target.value}}
351
- />
352
- </div>
184
+ <!-- Source (if available) -->
185
+ ${e.source?t`
186
+ <div class="detail-section">
187
+ <div class="detail-label">Source</div>
188
+ <div class="detail-value">${e.source}</div>
189
+ </div>
190
+ `:l}
353
191
 
354
- <div class="create-field">
355
- <label class="create-label">Trust Level</label>
356
- <select
357
- class="create-select"
358
- .value=${this._createTrustLevel}
359
- @change=${t=>{this._createTrustLevel=t.target.value}}
360
- >
361
- <option value="learned">learned</option>
362
- <option value="external">external</option>
363
- </select>
192
+ <!-- Tags (if present) -->
193
+ ${e.tags&&e.tags.length>0?t`
194
+ <div class="detail-section">
195
+ <div class="detail-label">Tags</div>
196
+ <div class="tags-list">
197
+ ${e.tags.map(e=>t`<ic-tag variant="default">${e}</ic-tag>`)}
364
198
  </div>
199
+ </div>
200
+ `:l}
365
201
 
366
- <div class="create-field">
367
- <label class="create-label">Provenance</label>
368
- <input
369
- class="create-input"
370
- type="text"
371
- placeholder="Source description (optional)"
372
- .value=${this._createProvenance}
373
- @input=${t=>{this._createProvenance=t.target.value}}
374
- />
375
- </div>
202
+ <!-- Embedding status -->
203
+ <div class="detail-section">
204
+ <div class="detail-label">Embedding</div>
205
+ <div class="embedding-status">
206
+ ${e.hasEmbedding?t`
207
+ <span class="embedding-icon embedding-icon--yes">&#x2713;</span>
208
+ <span>Indexed</span>
209
+ ${e.embeddingDims?t`<span class="embedding-dims">(${e.embeddingDims} dims)</span>`:l}
210
+ `:t`
211
+ <span class="embedding-icon embedding-icon--no">&#x2717;</span>
212
+ <span>Not indexed</span>
213
+ `}
214
+ </div>
215
+ </div>
376
216
 
377
- <div class="create-actions">
378
- <button
379
- class="create-submit"
380
- ?disabled=${!this._createContent.trim()||this._createSubmitting}
381
- @click=${this._submitCreate}
382
- >
383
- ${this._createSubmitting?"Creating...":"Create"}
384
- </button>
385
- </div>
217
+ <!-- Created timestamp -->
218
+ <div class="detail-section">
219
+ <div class="detail-label">Created</div>
220
+ <div class="timestamp-value">${this._formatTimestamp(e.createdAt)}</div>
221
+ </div>
386
222
 
387
- ${this._createMessage?i`<div class="create-message create-message--${this._createMessageType}">${this._createMessage}</div>`:h}
223
+ <!-- Updated timestamp (if exists) -->
224
+ ${e.updatedAt?t`
225
+ <div class="detail-section">
226
+ <div class="detail-label">Updated</div>
227
+ <div class="timestamp-value">${this._formatTimestamp(e.updatedAt)}</div>
388
228
  </div>
389
- `:h}
229
+ `:l}
390
230
 
391
- <!-- Mode toggle + search bar + flush -->
392
- <div class="toolbar">
393
- <div class="mode-toggle">
394
- <button
395
- class="mode-btn"
396
- ?data-active=${this._mode==="search"}
397
- @click=${()=>this._handleModeChange("search")}
398
- >
399
- Search
400
- </button>
401
- <button
402
- class="mode-btn"
403
- ?data-active=${this._mode==="browse"}
404
- @click=${()=>this._handleModeChange("browse")}
405
- >
406
- Browse All
407
- </button>
408
- </div>
409
- ${this._mode==="search"?i`
410
- <div class="search-wrapper">
411
- <ic-search-input
412
- placeholder="Search memories by content, topic, or keyword..."
413
- .value=${this._query}
414
- @search=${this._handleSearchEvent}
415
- ></ic-search-input>
416
- </div>
417
- `:h}
418
- <div class="toolbar-right">
419
- <span class="filter-label">Flush scope:</span>
420
- <select
421
- class="filter-select"
422
- .value=${this._flushAgentId}
423
- @change=${t=>{this._flushAgentId=t.target.value}}
424
- >
425
- <option value="">All Agents</option>
426
- ${this._agents.map(t=>i`<option value=${t}>${t}</option>`)}
427
- </select>
428
- <button class="flush-btn" @click=${this._openFlushDialog}>Flush Memory</button>
429
- </div>
430
- </div>
431
-
432
- <!-- Filters row -->
433
- <div class="filters-row">
434
- <div class="filter-group">
435
- <span class="filter-label">Type:</span>
436
- ${b.map(t=>i`
437
- <label class="filter-checkbox">
438
- <input
439
- type="checkbox"
440
- .checked=${this._typeFilter.has(t)}
441
- @change=${()=>this._toggleTypeFilter(t)}
442
- />
443
- ${t}
444
- </label>
445
- `)}
446
- </div>
447
-
448
- <div class="filter-group">
449
- <span class="filter-label">Trust:</span>
450
- ${g.map(t=>i`
451
- <label class="filter-checkbox">
452
- <input
453
- type="checkbox"
454
- .checked=${this._trustFilter.has(t)}
455
- @change=${()=>this._toggleTrustFilter(t)}
456
- />
457
- ${t}
458
- </label>
459
- `)}
460
- </div>
461
-
462
- <div class="filter-group">
463
- <span class="filter-label">Agent:</span>
464
- <select
465
- class="filter-select"
466
- .value=${this._agentFilter}
467
- @change=${this._handleAgentFilterChange}
468
- >
469
- <option value="">All</option>
470
- ${this._agents.map(t=>i`<option value=${t}>${t}</option>`)}
471
- </select>
472
- </div>
473
-
474
- <div class="filter-group">
475
- <span class="filter-label">Date:</span>
476
- <input
477
- type="date"
478
- class="filter-date"
479
- .value=${this._dateFrom}
480
- @change=${this._handleDateFromChange}
481
- />
482
- <span class="filter-label">to</span>
483
- <input
484
- type="date"
485
- class="filter-date"
486
- .value=${this._dateTo}
487
- @change=${this._handleDateToChange}
488
- />
489
- </div>
231
+ <!-- Delete button -->
232
+ <div class="detail-section">
233
+ <button class="delete-btn" @click=${this._handleDelete}>
234
+ Delete Entry
235
+ </button>
490
236
  </div>
491
-
492
- <!-- Error -->
493
- ${this._error?i`<div class="error-message">${this._error}</div>`:h}
494
-
495
- <!-- Bulk actions bar -->
496
- ${this._selectedIds.length>0?i`
497
- <div class="bulk-bar">
498
- <span class="bulk-count">${this._selectedIds.length} selected</span>
499
- <button class="bulk-btn bulk-btn--delete" @click=${this._handleBulkDelete}>
500
- Delete Selected
501
- </button>
502
- <button class="bulk-btn bulk-btn--export" @click=${this._handleExportSelected}>
503
- Export Selected
504
- </button>
505
- </div>
506
- `:h}
507
-
508
- <!-- Results area -->
509
- ${this._loading?i`
510
- <div class="state-container">
511
- <div class="loading-spinner"></div>
512
- </div>
513
- `:this._searched?i`
514
- <!-- Results header -->
515
- <div class="results-header">
516
- <span class="result-count">
517
- ${e.length} result${e.length!==1?"s":""}
518
- ${this._mode==="browse"&&this._total>0?i` of ${this._total}`:h}
519
- </span>
520
- <button class="export-btn" @click=${this._handleExportAll}>
521
- Export JSONL
522
- </button>
523
- </div>
524
-
525
- <ic-memory-table
526
- .entries=${e}
527
- ?selectable=${!0}
528
- @detail-requested=${this._handleDetailRequested}
529
- @selection-change=${this._handleSelectionChange}
530
- ></ic-memory-table>
531
-
532
- <!-- Browse pagination controls -->
533
- ${this._mode==="browse"?i`
534
- <div class="browse-controls">
535
- <span class="browse-info">
536
- ${this._browseOffset+1}-${Math.min(this._browseOffset+this._browseLimit,this._total)}
537
- of ${this._total}
538
- </span>
539
- <div class="browse-nav">
540
- <button
541
- class="browse-btn"
542
- ?disabled=${this._browseOffset===0}
543
- @click=${this._handleBrowsePrev}
544
- >
545
- Prev
546
- </button>
547
- <button
548
- class="browse-btn"
549
- ?disabled=${this._browseOffset+this._browseLimit>=this._total}
550
- @click=${this._handleBrowseNext}
551
- >
552
- Next
553
- </button>
554
- </div>
555
- </div>
556
- `:h}
557
- `:i`
558
- <div class="empty-state">
559
- <div>Search your agent's memory</div>
560
- <div class="empty-hint">
561
- Enter a query to find stored memories by content or semantic similarity
562
- </div>
563
- </div>
564
- `}
565
-
566
- <!-- Detail panel -->
567
- <ic-detail-panel
568
- ?open=${this._selectedEntry!==null}
569
- panelTitle="Memory Entry"
570
- @close=${this._handleDetailClose}
571
- >
572
- <ic-memory-detail
573
- .entry=${this._selectedEntry}
574
- @delete-requested=${this._handleEntryDeleted}
575
- @close=${this._handleDetailClose}
576
- ></ic-memory-detail>
577
- </ic-detail-panel>
578
-
579
- <!-- Confirm dialog for bulk delete -->
580
- <ic-confirm-dialog
581
- ?open=${this._confirmOpen}
582
- title="Delete Memories"
583
- message="Are you sure you want to delete ${this._selectedIds.length} selected ${this._selectedIds.length===1?"entry":"entries"}? This cannot be undone."
584
- confirmLabel="Delete"
585
- variant="danger"
586
- @confirm=${this._confirmBulkDelete}
587
- @cancel=${this._cancelBulkDelete}
588
- ></ic-confirm-dialog>
589
-
590
- <!-- Flush confirm dialog -->
591
- <ic-confirm-dialog
592
- ?open=${this._flushDialogOpen}
593
- title="Flush Memory"
594
- .message=${"This will permanently delete "+(this._flushAgentId?`all memory entries for agent "${this._flushAgentId}"`:"ALL memory entries")+". This cannot be undone."}
595
- confirmLabel="Flush"
596
- variant="danger"
597
- @confirm=${this._confirmFlush}
598
- @cancel=${this._cancelFlush}
599
- ></ic-confirm-dialog>
600
- `}};s.styles=[f,_,y`
237
+ `}};c([s({attribute:!1})],d.prototype,`entry`,void 0),d=c([e(`ic-memory-detail`)],d);var f=[`working`,`episodic`,`semantic`,`procedural`],p=[`system`,`learned`,`external`],m=class extends r{constructor(...e){super(...e),this.apiClient=null,this.rpcClient=null,this._mode=`search`,this._query=``,this._results=[],this._loading=!1,this._searched=!1,this._error=``,this._stats=null,this._statsLoaded=!1,this._selectedEntry=null,this._selectedIds=[],this._typeFilter=new Set(f),this._trustFilter=new Set(p),this._agentFilter=``,this._dateFrom=``,this._dateTo=``,this._browseOffset=0,this._browseLimit=25,this._total=0,this._agents=[],this._confirmOpen=!1,this._createOpen=!1,this._createContent=``,this._createTags=``,this._createTrustLevel=`learned`,this._createProvenance=``,this._createSubmitting=!1,this._createMessage=``,this._createMessageType=`success`,this._embeddingStats=null,this._embeddingLoading=!1,this._flushDialogOpen=!1,this._flushAgentId=``,this._flushSubmitting=!1}static{this.styles=[o,i,n`
601
238
  :host {
602
239
  display: block;
603
240
  }
@@ -1136,4 +773,367 @@ import{s as f,f as _,i as y,n as m,a as x,b as i,t as $,A as h,r as n}from"./ind
1136
773
  align-items: center;
1137
774
  gap: var(--ic-space-md);
1138
775
  }
1139
- `];o([m({attribute:!1})],s.prototype,"apiClient",2);o([m({attribute:!1})],s.prototype,"rpcClient",2);o([n()],s.prototype,"_mode",2);o([n()],s.prototype,"_query",2);o([n()],s.prototype,"_results",2);o([n()],s.prototype,"_loading",2);o([n()],s.prototype,"_searched",2);o([n()],s.prototype,"_error",2);o([n()],s.prototype,"_stats",2);o([n()],s.prototype,"_statsLoaded",2);o([n()],s.prototype,"_selectedEntry",2);o([n()],s.prototype,"_selectedIds",2);o([n()],s.prototype,"_typeFilter",2);o([n()],s.prototype,"_trustFilter",2);o([n()],s.prototype,"_agentFilter",2);o([n()],s.prototype,"_dateFrom",2);o([n()],s.prototype,"_dateTo",2);o([n()],s.prototype,"_browseOffset",2);o([n()],s.prototype,"_browseLimit",2);o([n()],s.prototype,"_total",2);o([n()],s.prototype,"_agents",2);o([n()],s.prototype,"_confirmOpen",2);o([n()],s.prototype,"_createOpen",2);o([n()],s.prototype,"_createContent",2);o([n()],s.prototype,"_createTags",2);o([n()],s.prototype,"_createTrustLevel",2);o([n()],s.prototype,"_createProvenance",2);o([n()],s.prototype,"_createSubmitting",2);o([n()],s.prototype,"_createMessage",2);o([n()],s.prototype,"_createMessageType",2);o([n()],s.prototype,"_embeddingStats",2);o([n()],s.prototype,"_embeddingLoading",2);o([n()],s.prototype,"_flushDialogOpen",2);o([n()],s.prototype,"_flushAgentId",2);o([n()],s.prototype,"_flushSubmitting",2);s=o([$("ic-memory-inspector")],s);export{s as IcMemoryInspector};
776
+ `]}connectedCallback(){super.connectedCallback()}updated(e){e.has(`apiClient`)&&this.apiClient&&(this._loadStats(),this._loadAgents()),e.has(`rpcClient`)&&this.rpcClient&&this._loadEmbeddingStats()}_normalizeEntry(e){return{id:String(e.id??``),content:String(e.content??``),memoryType:String(e.memoryType??e.type??`unknown`),trustLevel:String(e.trustLevel??e.trust??`unknown`),agentId:String(e.agentId??`unknown`),tenantId:String(e.tenantId??`default`),source:typeof e.source==`string`?e.source:void 0,tags:Array.isArray(e.tags)?e.tags:void 0,score:typeof e.score==`number`?e.score:void 0,hasEmbedding:!!(e.hasEmbedding??!1),embeddingDims:typeof e.embeddingDims==`number`?e.embeddingDims:void 0,createdAt:typeof e.createdAt==`number`?e.createdAt:Date.now(),updatedAt:typeof e.updatedAt==`number`?e.updatedAt:void 0}}async _loadStats(){if(this.apiClient)try{let e=await this.apiClient.getMemoryStats(),t=typeof e.stats==`object`&&e.stats!==null?e.stats:e;this._stats={totalEntries:t.totalEntries??0,totalSessions:t.totalSessions??0,embeddedEntries:t.embeddedEntries??0,dbSizeBytes:t.dbSizeBytes??0,byType:t.byType,byTrustLevel:t.byTrustLevel,byAgent:t.byAgent,oldestCreatedAt:t.oldestCreatedAt},this._statsLoaded=!0}catch{this._statsLoaded=!0}}async _loadAgents(){if(this.apiClient)try{let e=await this.apiClient.getAgents();this._agents=e.map(e=>e.id)}catch{}}async _loadEmbeddingStats(){if(!(!this.rpcClient||this._embeddingLoading)){this._embeddingLoading=!0;try{let e=await this.rpcClient.call(`memory.embeddingCache`);this._embeddingStats=e}catch{}finally{this._embeddingLoading=!1}}}async _search(){let e=this._query.trim();if(!(!e||!this.apiClient||this._loading)){this._loading=!0,this._error=``,this._selectedIds=[];try{let t=await this.apiClient.searchMemory(e,50);this._results=t.map(e=>this._normalizeEntry(e)),this._searched=!0}catch(e){this._error=e instanceof Error&&!e.message.startsWith(`Request failed`)?e.message:`Search failed. Please try again.`,this._results=[]}finally{this._loading=!1}}}async _browse(){if(!(!this.apiClient||this._loading)){this._loading=!0,this._error=``,this._selectedIds=[];try{let e={offset:this._browseOffset,limit:this._browseLimit};this._typeFilter.size<f.length&&(e.type=[...this._typeFilter].join(`,`)),this._trustFilter.size<p.length&&(e.trust=[...this._trustFilter].join(`,`)),this._agentFilter&&(e.agentId=this._agentFilter),this._dateFrom&&(e.from=new Date(this._dateFrom).getTime()),this._dateTo&&(e.to=new Date(this._dateTo).getTime());let t=await this.apiClient.browseMemory(e);this._results=t.entries.map(e=>this._normalizeEntry(e)),this._total=t.total,this._searched=!0}catch(e){this._error=e instanceof Error&&!e.message.startsWith(`Request failed`)?e.message:`Browse failed. Please try again.`,this._results=[]}finally{this._loading=!1}}}_applyFilters(e){return e.filter(e=>{if(!this._typeFilter.has(e.memoryType)||!this._trustFilter.has(e.trustLevel)||this._agentFilter&&e.agentId!==this._agentFilter)return!1;if(this._dateFrom){let t=new Date(this._dateFrom).getTime();if(e.createdAt<t)return!1}if(this._dateTo){let t=new Date(this._dateTo).getTime()+864e5;if(e.createdAt>t)return!1}return!0})}_getFilteredResults(){return this._mode===`search`?this._applyFilters(this._results):this._results}_toggleTypeFilter(e){let t=new Set(this._typeFilter);t.has(e)?t.delete(e):t.add(e),this._typeFilter=t}_toggleTrustFilter(e){let t=new Set(this._trustFilter);t.has(e)?t.delete(e):t.add(e),this._trustFilter=t}_handleModeChange(e){this._mode!==e&&(this._mode=e,this._results=[],this._searched=!1,this._error=``,this._selectedIds=[],this._browseOffset=0,e===`browse`&&this._browse())}_handleSearchEvent(e){this._query=e.detail,this._query.trim()&&this._search()}_handleDetailRequested(e){this._selectedEntry=e.detail}_handleDetailClose(){this._selectedEntry=null}_handleSelectionChange(e){this._selectedIds=e.detail}_handleAgentFilterChange(e){this._agentFilter=e.target.value,this._mode===`browse`&&(this._browseOffset=0,this._browse())}_handleDateFromChange(e){this._dateFrom=e.target.value,this._mode===`browse`&&(this._browseOffset=0,this._browse())}_handleDateToChange(e){this._dateTo=e.target.value,this._mode===`browse`&&(this._browseOffset=0,this._browse())}_toggleCreateForm(){this._createOpen=!this._createOpen,this._createOpen||(this._createContent=``,this._createTags=``,this._createTrustLevel=`learned`,this._createProvenance=``,this._createMessage=``)}async _submitCreate(){let e=this._createContent.trim();if(!(!e||!this.rpcClient||this._createSubmitting)){this._createSubmitting=!0,this._createMessage=``;try{let t=this._createTags.split(`,`).map(e=>e.trim()).filter(Boolean);this._createProvenance.trim()&&t.push(`provenance:${this._createProvenance.trim()}`),await this.rpcClient.call(`memory.store`,{content:e,tags:t.length>0?t:void 0,trustLevel:this._createTrustLevel}),this._createMessage=`Memory entry created successfully.`,this._createMessageType=`success`,this._createContent=``,this._createTags=``,this._createProvenance=``,this._loadStats(),this._mode===`browse`&&this._browse()}catch(e){this._createMessage=e instanceof Error?e.message:`Failed to create memory entry.`,this._createMessageType=`error`}finally{this._createSubmitting=!1}}}_openFlushDialog(){this._flushAgentId=``,this._flushDialogOpen=!0}async _confirmFlush(){if(this._flushDialogOpen=!1,!(!this.rpcClient||this._flushSubmitting)){this._flushSubmitting=!0;try{await this.rpcClient.call(`memory.flush`,{agent_id:this._flushAgentId||void 0}),this._loadStats(),this._results=[],this._searched=!1,this._mode===`browse`&&this._browse()}catch(e){this._error=e instanceof Error?e.message:`Flush failed. Please try again.`}finally{this._flushSubmitting=!1}}}_cancelFlush(){this._flushDialogOpen=!1}_handleBulkDelete(){this._confirmOpen=!0}async _confirmBulkDelete(){if(this._confirmOpen=!1,!(!this.apiClient||this._selectedIds.length===0))try{await this.apiClient.deleteMemoryBulk(this._selectedIds);let e=new Set(this._selectedIds);this._results=this._results.filter(t=>!e.has(t.id)),this._selectedIds=[],this._loadStats()}catch(e){this._error=e instanceof Error?e.message:`Delete failed. Please try again.`}}_cancelBulkDelete(){this._confirmOpen=!1}async _handleExport(e){if(this.apiClient)try{let t=await this.apiClient.exportMemory(e),n=new Blob([t],{type:`application/jsonl`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`memory-export-${Date.now()}.jsonl`,i.click(),URL.revokeObjectURL(r)}catch(e){this._error=e instanceof Error?e.message:`Export failed. Please try again.`}}_handleExportAll(){this._handleExport()}_handleExportSelected(){this._handleExport(this._selectedIds)}async _handleEntryDeleted(e){if(!this.apiClient)return;let t=e.detail;try{await this.apiClient.deleteMemory(t),this._results=this._results.filter(e=>e.id!==t),this._selectedEntry=null,this._loadStats()}catch(e){this._error=e instanceof Error?e.message:`Delete failed. Please try again.`}}_handleBrowsePrev(){this._browseOffset=Math.max(0,this._browseOffset-this._browseLimit),this._browse()}_handleBrowseNext(){this._browseOffset+=this._browseLimit,this._browse()}_formatBytes(e){if(e===0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`],n=Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**n).toFixed(n===0?0:1)} ${t[n]}`}_formatNumber(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}_formatRelativeTime(e){let t=Date.now()-e,n=Math.floor(t/1e3),r=Math.floor(n/60),i=Math.floor(r/60),a=Math.floor(i/24);if(a>365){let e=Math.floor(a/365);return`${e} year${e===1?``:`s`} ago`}if(a>30){let e=Math.floor(a/30);return`${e} month${e===1?``:`s`} ago`}return a>0?`${a} day${a===1?``:`s`} ago`:i>0?`${i} hour${i===1?``:`s`} ago`:r>0?`${r} min${r===1?``:`s`} ago`:`just now`}_formatFullDate(e){return new Date(e).toLocaleString()}_renderAgentChart(){let e=this._stats?.byAgent;if(!e)return l;let n=Object.entries(e).sort(([,e],[,t])=>t-e);if(n.length===0)return l;let r=n[0][1],i=n.slice(0,10),a=n.length-i.length;return t`
777
+ <div class="agent-chart">
778
+ <div class="agent-chart-title">Entries by Agent</div>
779
+ ${i.map(([e,n])=>t`
780
+ <div class="bar-container">
781
+ <div class="bar-label" title=${e}>${e}</div>
782
+ <div class="bar-track">
783
+ <div
784
+ class="bar-fill"
785
+ style="width: ${r>0?n/r*100:0}%"
786
+ ></div>
787
+ </div>
788
+ <div class="bar-value">${this._formatNumber(n)}</div>
789
+ </div>
790
+ `)}
791
+ ${a>0?t`<div class="agent-chart-overflow">and ${a} more</div>`:l}
792
+ </div>
793
+ `}_renderEmbeddingSection(){if(!this._embeddingStats)return l;let e=this._embeddingStats,n=e.circuitBreaker.state,r=n===`closed`?`success`:n===`halfOpen`?`warning`:n===`open`?`error`:`default`,i=n===`closed`?`Closed (Healthy)`:n===`halfOpen`?`Half-Open (Recovering)`:n===`open`?`Open (Failing)`:`Unknown`,a=e.vecAvailable?`success`:`error`,o=e.vecAvailable?`Active`:`Unavailable`;if(!e.enabled)return t`
794
+ <div class="embedding-section">
795
+ <div class="section-heading">Embedding Infrastructure</div>
796
+ <div class="embedding-disabled">
797
+ <span>Embedding cache not configured</span>
798
+ <span>Vec: <ic-tag variant=${a}>${o}</ic-tag></span>
799
+ <span>CB: <ic-tag variant=${r}>${i}</ic-tag></span>
800
+ </div>
801
+ </div>
802
+ `;let s=e.l1?(e.l1.hitRate*100).toFixed(1)+`%`:`N/A`,c=e.l1?`${e.l1.entries}/${e.l1.maxEntries}`:`N/A`;return t`
803
+ <div class="embedding-section">
804
+ <div class="section-heading">Embedding Infrastructure</div>
805
+ <div class="stats-row">
806
+ <ic-stat-card label="Provider" value=${e.provider??`N/A`}></ic-stat-card>
807
+ <ic-stat-card label="L1 Hit Rate" value=${s}></ic-stat-card>
808
+ <ic-stat-card label="L1 Entries" value=${c}></ic-stat-card>
809
+ <ic-stat-card label="Vector Search" value=${o}></ic-stat-card>
810
+ </div>
811
+ <div class="stats-row">
812
+ <ic-stat-card label="L1 Hits" value=${this._formatNumber(e.l1?.hits??0)}></ic-stat-card>
813
+ <ic-stat-card label="L1 Misses" value=${this._formatNumber(e.l1?.misses??0)}></ic-stat-card>
814
+ <ic-stat-card label="Circuit Breaker" value=${i}></ic-stat-card>
815
+ </div>
816
+ </div>
817
+ `}render(){let e=this._getFilteredResults();return t`
818
+ <div class="page-header">Memory Inspector</div>
819
+
820
+ <!-- Stat cards -->
821
+ ${this._statsLoaded&&this._stats?t`
822
+ <div class="stats-row">
823
+ <ic-stat-card
824
+ label="Total Entries"
825
+ value=${this._formatNumber(this._stats.totalEntries)}
826
+ ></ic-stat-card>
827
+ <ic-stat-card
828
+ label="Sessions"
829
+ value=${this._formatNumber(this._stats.totalSessions)}
830
+ ></ic-stat-card>
831
+ <ic-stat-card
832
+ label="Vectors"
833
+ value=${this._formatNumber(this._stats.embeddedEntries)}
834
+ ></ic-stat-card>
835
+ <ic-stat-card
836
+ label="DB Size"
837
+ value=${this._formatBytes(this._stats.dbSizeBytes)}
838
+ ></ic-stat-card>
839
+ ${this._stats.oldestCreatedAt==null?l:t`
840
+ <ic-stat-card
841
+ label="Oldest Entry"
842
+ value=${this._formatRelativeTime(this._stats.oldestCreatedAt)}
843
+ title=${this._formatFullDate(this._stats.oldestCreatedAt)}
844
+ ></ic-stat-card>
845
+ `}
846
+ </div>
847
+ ${this._stats.byType||this._stats.byTrustLevel?t`
848
+ <div class="stats-row">
849
+ ${this._stats.byType?Object.entries(this._stats.byType).map(([e,n])=>t`
850
+ <ic-stat-card label=${e} value=${this._formatNumber(n)}></ic-stat-card>
851
+ `):l}
852
+ ${this._stats.byTrustLevel?Object.entries(this._stats.byTrustLevel).map(([e,n])=>t`
853
+ <ic-stat-card label=${`Trust: `+e} value=${this._formatNumber(n)}></ic-stat-card>
854
+ `):l}
855
+ </div>
856
+ `:l}
857
+ ${this._renderAgentChart()}
858
+ `:l}
859
+
860
+ <!-- Embedding Infrastructure -->
861
+ ${this._renderEmbeddingSection()}
862
+
863
+ <!-- Creation form -->
864
+ <button class="create-toggle" @click=${this._toggleCreateForm}>
865
+ ${this._createOpen?`- Hide Create Form`:`+ Create Entry`}
866
+ </button>
867
+
868
+ ${this._createOpen?t`
869
+ <div class="create-form">
870
+ <div class="create-form-title">Create Memory Entry</div>
871
+
872
+ <div class="create-field">
873
+ <label class="create-label">Content *</label>
874
+ <textarea
875
+ class="create-textarea"
876
+ placeholder="Memory content..."
877
+ .value=${this._createContent}
878
+ @input=${e=>{this._createContent=e.target.value}}
879
+ ></textarea>
880
+ </div>
881
+
882
+ <div class="create-field">
883
+ <label class="create-label">Tags</label>
884
+ <input
885
+ class="create-input"
886
+ type="text"
887
+ placeholder="tag1, tag2, ..."
888
+ .value=${this._createTags}
889
+ @input=${e=>{this._createTags=e.target.value}}
890
+ />
891
+ </div>
892
+
893
+ <div class="create-field">
894
+ <label class="create-label">Trust Level</label>
895
+ <select
896
+ class="create-select"
897
+ .value=${this._createTrustLevel}
898
+ @change=${e=>{this._createTrustLevel=e.target.value}}
899
+ >
900
+ <option value="learned">learned</option>
901
+ <option value="external">external</option>
902
+ </select>
903
+ </div>
904
+
905
+ <div class="create-field">
906
+ <label class="create-label">Provenance</label>
907
+ <input
908
+ class="create-input"
909
+ type="text"
910
+ placeholder="Source description (optional)"
911
+ .value=${this._createProvenance}
912
+ @input=${e=>{this._createProvenance=e.target.value}}
913
+ />
914
+ </div>
915
+
916
+ <div class="create-actions">
917
+ <button
918
+ class="create-submit"
919
+ ?disabled=${!this._createContent.trim()||this._createSubmitting}
920
+ @click=${this._submitCreate}
921
+ >
922
+ ${this._createSubmitting?`Creating...`:`Create`}
923
+ </button>
924
+ </div>
925
+
926
+ ${this._createMessage?t`<div class="create-message create-message--${this._createMessageType}">${this._createMessage}</div>`:l}
927
+ </div>
928
+ `:l}
929
+
930
+ <!-- Mode toggle + search bar + flush -->
931
+ <div class="toolbar">
932
+ <div class="mode-toggle">
933
+ <button
934
+ class="mode-btn"
935
+ ?data-active=${this._mode===`search`}
936
+ @click=${()=>this._handleModeChange(`search`)}
937
+ >
938
+ Search
939
+ </button>
940
+ <button
941
+ class="mode-btn"
942
+ ?data-active=${this._mode===`browse`}
943
+ @click=${()=>this._handleModeChange(`browse`)}
944
+ >
945
+ Browse All
946
+ </button>
947
+ </div>
948
+ ${this._mode===`search`?t`
949
+ <div class="search-wrapper">
950
+ <ic-search-input
951
+ placeholder="Search memories by content, topic, or keyword..."
952
+ .value=${this._query}
953
+ @search=${this._handleSearchEvent}
954
+ ></ic-search-input>
955
+ </div>
956
+ `:l}
957
+ <div class="toolbar-right">
958
+ <span class="filter-label">Flush scope:</span>
959
+ <select
960
+ class="filter-select"
961
+ .value=${this._flushAgentId}
962
+ @change=${e=>{this._flushAgentId=e.target.value}}
963
+ >
964
+ <option value="">All Agents</option>
965
+ ${this._agents.map(e=>t`<option value=${e}>${e}</option>`)}
966
+ </select>
967
+ <button class="flush-btn" @click=${this._openFlushDialog}>Flush Memory</button>
968
+ </div>
969
+ </div>
970
+
971
+ <!-- Filters row -->
972
+ <div class="filters-row">
973
+ <div class="filter-group">
974
+ <span class="filter-label">Type:</span>
975
+ ${f.map(e=>t`
976
+ <label class="filter-checkbox">
977
+ <input
978
+ type="checkbox"
979
+ .checked=${this._typeFilter.has(e)}
980
+ @change=${()=>this._toggleTypeFilter(e)}
981
+ />
982
+ ${e}
983
+ </label>
984
+ `)}
985
+ </div>
986
+
987
+ <div class="filter-group">
988
+ <span class="filter-label">Trust:</span>
989
+ ${p.map(e=>t`
990
+ <label class="filter-checkbox">
991
+ <input
992
+ type="checkbox"
993
+ .checked=${this._trustFilter.has(e)}
994
+ @change=${()=>this._toggleTrustFilter(e)}
995
+ />
996
+ ${e}
997
+ </label>
998
+ `)}
999
+ </div>
1000
+
1001
+ <div class="filter-group">
1002
+ <span class="filter-label">Agent:</span>
1003
+ <select
1004
+ class="filter-select"
1005
+ .value=${this._agentFilter}
1006
+ @change=${this._handleAgentFilterChange}
1007
+ >
1008
+ <option value="">All</option>
1009
+ ${this._agents.map(e=>t`<option value=${e}>${e}</option>`)}
1010
+ </select>
1011
+ </div>
1012
+
1013
+ <div class="filter-group">
1014
+ <span class="filter-label">Date:</span>
1015
+ <input
1016
+ type="date"
1017
+ class="filter-date"
1018
+ .value=${this._dateFrom}
1019
+ @change=${this._handleDateFromChange}
1020
+ />
1021
+ <span class="filter-label">to</span>
1022
+ <input
1023
+ type="date"
1024
+ class="filter-date"
1025
+ .value=${this._dateTo}
1026
+ @change=${this._handleDateToChange}
1027
+ />
1028
+ </div>
1029
+ </div>
1030
+
1031
+ <!-- Error -->
1032
+ ${this._error?t`<div class="error-message">${this._error}</div>`:l}
1033
+
1034
+ <!-- Bulk actions bar -->
1035
+ ${this._selectedIds.length>0?t`
1036
+ <div class="bulk-bar">
1037
+ <span class="bulk-count">${this._selectedIds.length} selected</span>
1038
+ <button class="bulk-btn bulk-btn--delete" @click=${this._handleBulkDelete}>
1039
+ Delete Selected
1040
+ </button>
1041
+ <button class="bulk-btn bulk-btn--export" @click=${this._handleExportSelected}>
1042
+ Export Selected
1043
+ </button>
1044
+ </div>
1045
+ `:l}
1046
+
1047
+ <!-- Results area -->
1048
+ ${this._loading?t`
1049
+ <div class="state-container">
1050
+ <div class="loading-spinner"></div>
1051
+ </div>
1052
+ `:this._searched?t`
1053
+ <!-- Results header -->
1054
+ <div class="results-header">
1055
+ <span class="result-count">
1056
+ ${e.length} result${e.length===1?``:`s`}
1057
+ ${this._mode===`browse`&&this._total>0?t` of ${this._total}`:l}
1058
+ </span>
1059
+ <button class="export-btn" @click=${this._handleExportAll}>
1060
+ Export JSONL
1061
+ </button>
1062
+ </div>
1063
+
1064
+ <ic-memory-table
1065
+ .entries=${e}
1066
+ ?selectable=${!0}
1067
+ @detail-requested=${this._handleDetailRequested}
1068
+ @selection-change=${this._handleSelectionChange}
1069
+ ></ic-memory-table>
1070
+
1071
+ <!-- Browse pagination controls -->
1072
+ ${this._mode===`browse`?t`
1073
+ <div class="browse-controls">
1074
+ <span class="browse-info">
1075
+ ${this._browseOffset+1}-${Math.min(this._browseOffset+this._browseLimit,this._total)}
1076
+ of ${this._total}
1077
+ </span>
1078
+ <div class="browse-nav">
1079
+ <button
1080
+ class="browse-btn"
1081
+ ?disabled=${this._browseOffset===0}
1082
+ @click=${this._handleBrowsePrev}
1083
+ >
1084
+ Prev
1085
+ </button>
1086
+ <button
1087
+ class="browse-btn"
1088
+ ?disabled=${this._browseOffset+this._browseLimit>=this._total}
1089
+ @click=${this._handleBrowseNext}
1090
+ >
1091
+ Next
1092
+ </button>
1093
+ </div>
1094
+ </div>
1095
+ `:l}
1096
+ `:t`
1097
+ <div class="empty-state">
1098
+ <div>Search your agent's memory</div>
1099
+ <div class="empty-hint">
1100
+ Enter a query to find stored memories by content or semantic similarity
1101
+ </div>
1102
+ </div>
1103
+ `}
1104
+
1105
+ <!-- Detail panel -->
1106
+ <ic-detail-panel
1107
+ ?open=${this._selectedEntry!==null}
1108
+ panelTitle="Memory Entry"
1109
+ @close=${this._handleDetailClose}
1110
+ >
1111
+ <ic-memory-detail
1112
+ .entry=${this._selectedEntry}
1113
+ @delete-requested=${this._handleEntryDeleted}
1114
+ @close=${this._handleDetailClose}
1115
+ ></ic-memory-detail>
1116
+ </ic-detail-panel>
1117
+
1118
+ <!-- Confirm dialog for bulk delete -->
1119
+ <ic-confirm-dialog
1120
+ ?open=${this._confirmOpen}
1121
+ title="Delete Memories"
1122
+ message="Are you sure you want to delete ${this._selectedIds.length} selected ${this._selectedIds.length===1?`entry`:`entries`}? This cannot be undone."
1123
+ confirmLabel="Delete"
1124
+ variant="danger"
1125
+ @confirm=${this._confirmBulkDelete}
1126
+ @cancel=${this._cancelBulkDelete}
1127
+ ></ic-confirm-dialog>
1128
+
1129
+ <!-- Flush confirm dialog -->
1130
+ <ic-confirm-dialog
1131
+ ?open=${this._flushDialogOpen}
1132
+ title="Flush Memory"
1133
+ .message=${`This will permanently delete `+(this._flushAgentId?`all memory entries for agent "${this._flushAgentId}"`:`ALL memory entries`)+`. This cannot be undone.`}
1134
+ confirmLabel="Flush"
1135
+ variant="danger"
1136
+ @confirm=${this._confirmFlush}
1137
+ @cancel=${this._cancelFlush}
1138
+ ></ic-confirm-dialog>
1139
+ `}};c([s({attribute:!1})],m.prototype,`apiClient`,void 0),c([s({attribute:!1})],m.prototype,`rpcClient`,void 0),c([a()],m.prototype,`_mode`,void 0),c([a()],m.prototype,`_query`,void 0),c([a()],m.prototype,`_results`,void 0),c([a()],m.prototype,`_loading`,void 0),c([a()],m.prototype,`_searched`,void 0),c([a()],m.prototype,`_error`,void 0),c([a()],m.prototype,`_stats`,void 0),c([a()],m.prototype,`_statsLoaded`,void 0),c([a()],m.prototype,`_selectedEntry`,void 0),c([a()],m.prototype,`_selectedIds`,void 0),c([a()],m.prototype,`_typeFilter`,void 0),c([a()],m.prototype,`_trustFilter`,void 0),c([a()],m.prototype,`_agentFilter`,void 0),c([a()],m.prototype,`_dateFrom`,void 0),c([a()],m.prototype,`_dateTo`,void 0),c([a()],m.prototype,`_browseOffset`,void 0),c([a()],m.prototype,`_browseLimit`,void 0),c([a()],m.prototype,`_total`,void 0),c([a()],m.prototype,`_agents`,void 0),c([a()],m.prototype,`_confirmOpen`,void 0),c([a()],m.prototype,`_createOpen`,void 0),c([a()],m.prototype,`_createContent`,void 0),c([a()],m.prototype,`_createTags`,void 0),c([a()],m.prototype,`_createTrustLevel`,void 0),c([a()],m.prototype,`_createProvenance`,void 0),c([a()],m.prototype,`_createSubmitting`,void 0),c([a()],m.prototype,`_createMessage`,void 0),c([a()],m.prototype,`_createMessageType`,void 0),c([a()],m.prototype,`_embeddingStats`,void 0),c([a()],m.prototype,`_embeddingLoading`,void 0),c([a()],m.prototype,`_flushDialogOpen`,void 0),c([a()],m.prototype,`_flushAgentId`,void 0),c([a()],m.prototype,`_flushSubmitting`,void 0),m=c([e(`ic-memory-inspector`)],m);export{m as IcMemoryInspector};