comisai 1.0.24 → 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 (98) hide show
  1. package/node_modules/@comis/agent/package.json +1 -1
  2. package/node_modules/@comis/channels/package.json +1 -1
  3. package/node_modules/@comis/cli/package.json +1 -1
  4. package/node_modules/@comis/core/dist/bootstrap.js +5 -0
  5. package/node_modules/@comis/core/dist/config/env-layer.d.ts +31 -0
  6. package/node_modules/@comis/core/dist/config/env-layer.js +41 -0
  7. package/node_modules/@comis/core/dist/config/layered.d.ts +9 -0
  8. package/node_modules/@comis/core/dist/config/layered.js +11 -0
  9. package/node_modules/@comis/core/package.json +1 -1
  10. package/node_modules/@comis/daemon/dist/daemon.js +3 -0
  11. package/node_modules/@comis/daemon/package.json +1 -1
  12. package/node_modules/@comis/gateway/package.json +1 -1
  13. package/node_modules/@comis/infra/package.json +1 -1
  14. package/node_modules/@comis/memory/package.json +1 -1
  15. package/node_modules/@comis/scheduler/package.json +1 -1
  16. package/node_modules/@comis/shared/package.json +1 -1
  17. package/node_modules/@comis/skills/package.json +1 -1
  18. package/node_modules/@comis/web/dist/assets/{agent-detail-BG9MGWWj.js → agent-detail-ru-AhppM.js} +270 -270
  19. package/node_modules/@comis/web/dist/assets/agent-editor-hjwRuFVp.js +2173 -0
  20. package/node_modules/@comis/web/dist/assets/{agent-list-LHCJ4rw2.js → agent-list-6Uotjatr.js} +170 -170
  21. package/node_modules/@comis/web/dist/assets/{approvals-q9VH_IKr.js → approvals-C-K6hN2U.js} +13 -13
  22. package/node_modules/@comis/web/dist/assets/billing-view-CxysXH0p.js +375 -0
  23. package/node_modules/@comis/web/dist/assets/{channel-detail-CaInesJM.js → channel-detail-BBCKtmne.js} +265 -265
  24. package/node_modules/@comis/web/dist/assets/channel-list-FkfeOLBQ.js +323 -0
  25. package/node_modules/@comis/web/dist/assets/{chat-console-CNmzl0JW.js → chat-console-BumBaIgO.js} +243 -246
  26. package/node_modules/@comis/web/dist/assets/{config-editor-DX4ITw6y.js → config-editor-C9BSwHGy.js} +477 -477
  27. package/node_modules/@comis/web/dist/assets/{context-dag-browser-BwiaF5tf.js → context-dag-browser-BHm00mJD.js} +105 -105
  28. package/node_modules/@comis/web/dist/assets/{context-engine-BZ5Am6hA.js → context-engine-BENY3pWE.js} +136 -136
  29. package/node_modules/@comis/web/dist/assets/decorate-BvWYovGE.js +38 -0
  30. package/node_modules/@comis/web/dist/assets/{delivery-view-OfBZof-m.js → delivery-view-BCnkPsAp.js} +134 -134
  31. package/node_modules/@comis/web/dist/assets/{diagnostics-view-YFwCxgr2.js → diagnostics-view-C_jQFG2H.js} +82 -82
  32. package/node_modules/@comis/web/dist/assets/directive-BOYXJ-K-.js +1 -0
  33. package/node_modules/@comis/web/dist/assets/{extract-variables-BM5qyK-s.js → extract-variables-B7-Doo7l.js} +39 -39
  34. package/node_modules/@comis/web/dist/assets/{ic-array-editor-B7m6x7-S.js → ic-array-editor-BLoEyeLS.js} +29 -29
  35. package/node_modules/@comis/web/dist/assets/{ic-breadcrumb-CUMpp3BL.js → ic-breadcrumb-DqN6G3gc.js} +16 -16
  36. package/node_modules/@comis/web/dist/assets/{ic-budget-segment-bar-BtJ6x5mN.js → ic-budget-segment-bar-zLsMzjDO.js} +20 -20
  37. package/node_modules/@comis/web/dist/assets/ic-chat-message-FdQcZsSQ.js +352 -0
  38. package/node_modules/@comis/web/dist/assets/{ic-confirm-dialog-CCDbB04e.js → ic-confirm-dialog-DGlPbV1T.js} +26 -26
  39. package/node_modules/@comis/web/dist/assets/{ic-connection-dot-CnT1b8xr.js → ic-connection-dot-BgYiK2N4.js} +13 -13
  40. package/node_modules/@comis/web/dist/assets/ic-data-table-CKIvr-ag.js +277 -0
  41. package/node_modules/@comis/web/dist/assets/ic-delivery-row-B3YwjjuM.js +67 -0
  42. package/node_modules/@comis/web/dist/assets/{ic-detail-panel-BF83r-if.js → ic-detail-panel-DiCe4hLr.js} +27 -27
  43. package/node_modules/@comis/web/dist/assets/{ic-empty-state-60l2ePhd.js → ic-empty-state-CM3Wbj2f.js} +19 -19
  44. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-ByRjij68.js +359 -0
  45. package/node_modules/@comis/web/dist/assets/ic-icon-BGNCCPpZ.js +33 -0
  46. package/node_modules/@comis/web/dist/assets/{ic-layer-waterfall-COvEYMg5.js → ic-layer-waterfall-WkaFyu-l.js} +18 -18
  47. package/node_modules/@comis/web/dist/assets/ic-relative-time-B3UAnTqg.js +12 -0
  48. package/node_modules/@comis/web/dist/assets/{ic-search-input-CSOxY9g7.js → ic-search-input-B02AGw1i.js} +22 -22
  49. package/node_modules/@comis/web/dist/assets/{ic-select-Ce-Raudx.js → ic-select-BqfZISjw.js} +29 -29
  50. package/node_modules/@comis/web/dist/assets/ic-tabs-yBjkWKJH.js +95 -0
  51. package/node_modules/@comis/web/dist/assets/ic-tag-CvMVQFRR.js +33 -0
  52. package/node_modules/@comis/web/dist/assets/{ic-time-range-picker-CypCT68y.js → ic-time-range-picker-DXbYeBmY.js} +31 -31
  53. package/node_modules/@comis/web/dist/assets/{ic-tool-call-7MaXSsCW.js → ic-tool-call-DMPHsLyx.js} +51 -51
  54. package/node_modules/@comis/web/dist/assets/index-CVEaS9aY.css +2 -0
  55. package/node_modules/@comis/web/dist/assets/index-FLPhHz8p.js +2792 -0
  56. package/node_modules/@comis/web/dist/assets/{mcp-management-BNZPnpDn.js → mcp-management-5jyScQis.js} +209 -209
  57. package/node_modules/@comis/web/dist/assets/{media-config-BBvTYxOX.js → media-config-J9oT9PPs.js} +154 -154
  58. package/node_modules/@comis/web/dist/assets/{media-test-BkK3RCRK.js → media-test-DGTCtM8-.js} +259 -259
  59. package/node_modules/@comis/web/dist/assets/{memory-inspector-1hDGCGat.js → memory-inspector-D5Re9ptG.js} +450 -450
  60. package/node_modules/@comis/web/dist/assets/{message-center-CXefwsUu.js → message-center-cRLK6ZmG.js} +290 -290
  61. package/node_modules/@comis/web/dist/assets/{models-C1qcU_j3.js → models-D5vu07MR.js} +371 -371
  62. package/node_modules/@comis/web/dist/assets/observability-types-D0tkwElU.js +1 -0
  63. package/node_modules/@comis/web/dist/assets/{observe-view-C0VBhX4C.js → observe-view-CalNNEmd.js} +399 -399
  64. package/node_modules/@comis/web/dist/assets/pipeline-builder-DUYDGwZf.js +1495 -0
  65. package/node_modules/@comis/web/dist/assets/{pipeline-history-DkfOQ6SW.js → pipeline-history-BAO8brOe.js} +124 -124
  66. package/node_modules/@comis/web/dist/assets/{pipeline-history-detail-hyHgD0ai.js → pipeline-history-detail-DectIoQt.js} +65 -65
  67. package/node_modules/@comis/web/dist/assets/{pipeline-list-BPW8hV-q.js → pipeline-list-BHlaBKww.js} +227 -227
  68. package/node_modules/@comis/web/dist/assets/{pipeline-monitor-Bip16T7e.js → pipeline-monitor-BhtpNEHf.js} +298 -298
  69. package/node_modules/@comis/web/dist/assets/{scheduler-BGgwKd06.js → scheduler-VafN_8xi.js} +486 -486
  70. package/node_modules/@comis/web/dist/assets/{security-D15st4xx.js → security-QQXMRTlo.js} +389 -389
  71. package/node_modules/@comis/web/dist/assets/{session-detail-SGEYNJ0M.js → session-detail-BpZ_8Yih.js} +294 -294
  72. package/node_modules/@comis/web/dist/assets/session-key-parser-Dkqcj2Ss.js +1 -0
  73. package/node_modules/@comis/web/dist/assets/session-list-DfCm8Cec.js +231 -0
  74. package/node_modules/@comis/web/dist/assets/{setup-wizard-nT0tz9QP.js → setup-wizard-C-z477CG.js} +486 -494
  75. package/node_modules/@comis/web/dist/assets/{skills-D8yVfSUy.js → skills-BCOGPf6s.js} +329 -329
  76. package/node_modules/@comis/web/dist/assets/{subagents-HHXMeHYo.js → subagents-l-auUraL.js} +74 -74
  77. package/node_modules/@comis/web/dist/assets/{workspace-manager-BQlr10iH.js → workspace-manager-DlvBixiq.js} +236 -236
  78. package/node_modules/@comis/web/dist/index.html +3 -2
  79. package/node_modules/@comis/web/package.json +1 -1
  80. package/package.json +15 -15
  81. package/node_modules/@comis/web/dist/assets/agent-editor-C26Q_xCs.js +0 -2173
  82. package/node_modules/@comis/web/dist/assets/billing-view-CtYvBqTE.js +0 -375
  83. package/node_modules/@comis/web/dist/assets/channel-list-B8dj3O9a.js +0 -323
  84. package/node_modules/@comis/web/dist/assets/directive-DoeGSK_T.js +0 -1
  85. package/node_modules/@comis/web/dist/assets/ic-chat-message-CFyDJd0z.js +0 -352
  86. package/node_modules/@comis/web/dist/assets/ic-data-table-CKUNTxHw.js +0 -277
  87. package/node_modules/@comis/web/dist/assets/ic-delivery-row-GP5Fkygs.js +0 -67
  88. package/node_modules/@comis/web/dist/assets/ic-graph-canvas-C8FuSMe1.js +0 -359
  89. package/node_modules/@comis/web/dist/assets/ic-icon-xeGTVhVG.js +0 -33
  90. package/node_modules/@comis/web/dist/assets/ic-relative-time-3FqpjeAI.js +0 -12
  91. package/node_modules/@comis/web/dist/assets/ic-tabs-B7QtM_v8.js +0 -95
  92. package/node_modules/@comis/web/dist/assets/ic-tag-CPPUnDLF.js +0 -33
  93. package/node_modules/@comis/web/dist/assets/index-CEcM1R_C.js +0 -2830
  94. package/node_modules/@comis/web/dist/assets/index-CIJFuItj.css +0 -1
  95. package/node_modules/@comis/web/dist/assets/observability-types-D7jUtSde.js +0 -1
  96. package/node_modules/@comis/web/dist/assets/pipeline-builder-DcUUIrm0.js +0 -1496
  97. package/node_modules/@comis/web/dist/assets/session-key-parser-DPORMVyU.js +0 -1
  98. package/node_modules/@comis/web/dist/assets/session-list-6ybUTxbY.js +0 -231
@@ -1,229 +1,4 @@
1
- import{a as g,I as c,b as n,A as h,s as f,f as _,i as x,n as y,r as p,t as w}from"./index-CEcM1R_C.js";import"./ic-breadcrumb-CUMpp3BL.js";import"./ic-confirm-dialog-CCDbB04e.js";import{e as $,s as C}from"./extract-variables-BM5qyK-s.js";import"./ic-empty-state-60l2ePhd.js";import"./ic-icon-xeGTVhVG.js";var k=Object.defineProperty,A=Object.getOwnPropertyDescriptor,d=(e,t,r,i)=>{for(var s=i>1?void 0:i?A(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(i?o(t,r,s):o(s))||s);return i&&s&&k(t,r,s),s};const b={draft:"#6b7280",running:"#06b6d4",completed:"#22c55e",failed:"#ef4444",cancelled:"#f97316"};function m(e){if(!e)return"Never";const t=Date.now()-e;if(t<0)return"just now";const r=Math.floor(t/1e3);if(r<60)return"just now";const i=Math.floor(r/60);if(i<60)return`${i}m ago`;const s=Math.floor(i/60);if(s<24)return`${s}h ago`;const a=Math.floor(s/24);return a<30?`${a}d ago`:new Date(e).toISOString().slice(0,10)}let l=class extends g{constructor(){super(...arguments),this.rpcClient=null,this._rpcStatusUnsub=null,this._pipelines=[],this._searchQuery="",this._loading=!0,this._deleteTarget=null,this._sortKey="savedAt",this._sortAsc=!1,this._showVariablePrompt=!1,this._variableNames=[],this._pendingExecuteData=null}get _breadcrumbs(){return[{label:"Pipelines"}]}connectedCallback(){super.connectedCallback()}disconnectedCallback(){super.disconnectedCallback(),this._rpcStatusUnsub?.(),this._rpcStatusUnsub=null}updated(e){e.has("rpcClient")&&this.rpcClient&&(this._rpcStatusUnsub?.(),this.rpcClient.status==="connected"?this._loadPipelines():this._rpcStatusUnsub=this.rpcClient.onStatusChange(t=>{t==="connected"&&(this._rpcStatusUnsub=null,this._loadPipelines())}))}async _loadPipelines(){this._loading=!0;let e=[],t=[];if(this.rpcClient){const[i,s]=await Promise.allSettled([this.rpcClient.call("graph.list",{limit:100}),this.rpcClient.call("graph.status",{})]);i.status==="fulfilled"&&i.value?.entries&&(e=i.value.entries.map(a=>({id:a.id,label:a.label,source:"saved",nodeCount:a.nodeCount,agentCount:0,savedAt:a.updatedAt,status:"draft"}))),s.status==="fulfilled"&&s.value?.graphs&&(t=s.value.graphs.map(a=>({id:a.graphId,label:a.label??a.graphId,source:"executed",nodeCount:0,agentCount:0,lastRun:a.startedAt,status:a.status,graphId:a.graphId})))}const r=[...e];for(const i of t){const s=r.findIndex(a=>a.label.toLowerCase()===i.label.toLowerCase());if(s>=0){const a=r[s];r[s]={...a,lastRun:i.lastRun,status:i.status,graphId:i.graphId}}else r.push(i)}this._pipelines=r,this._loading=!1}get _filtered(){let e=this._pipelines;if(this._searchQuery){const t=this._searchQuery.toLowerCase();e=e.filter(r=>r.label.toLowerCase().includes(t))}return[...e].sort((t,r)=>{const i=t[this._sortKey],s=r[this._sortKey];if(i==null&&s==null)return 0;if(i==null)return 1;if(s==null)return-1;const a=i<s?-1:i>s?1:0;return this._sortAsc?a:-a})}_navigate(e){this.dispatchEvent(new CustomEvent("navigate",{detail:e,bubbles:!0,composed:!0}))}_handleSort(e){this._sortKey===e?this._sortAsc=!this._sortAsc:(this._sortKey=e,this._sortAsc=e==="label")}_sortArrow(e){return this._sortKey!==e?"":this._sortAsc?"▲":"▼"}_sortArrowClass(e){return this._sortKey===e?"sort-arrow sort-arrow--active":"sort-arrow"}_handleRowClick(e){e.source==="executed"&&e.graphId?this._navigate(`pipelines/${e.graphId}`):this._navigate(`pipelines/${e.id}/edit`)}_handleEdit(e,t){t.stopPropagation(),this._navigate(`pipelines/${e.id}/edit`)}async _handleQuickExecute(e,t){if(t.stopPropagation(),!this.rpcClient){c.show("Not connected to daemon","error");return}let r=null;try{r=await this.rpcClient.call("graph.load",{id:e.id})}catch{c.show("Could not load pipeline from server","error");return}if(!r)return;const i=r.nodes.map(a=>a.task),s=$(i);if(s.length>0){this._pendingExecuteData=r,this._variableNames=s,this._showVariablePrompt=!0;return}await this._executeGraphPayload(r,r.nodes.map(a=>a.task))}async _onVariableConfirm(e){this._showVariablePrompt=!1;const t=this._pendingExecuteData;if(this._pendingExecuteData=null,!t||!this.rpcClient)return;const r=t.nodes.map(i=>C(i.task,e.detail.values));await this._executeGraphPayload(t,r)}async _executeGraphPayload(e,t){if(this.rpcClient)try{const r={nodes:e.nodes.map((a,o)=>({nodeId:a.nodeId??a.id,task:t[o],agentId:a.agentId,dependsOn:a.dependsOn,maxSteps:a.maxSteps,timeoutMs:a.timeoutMs,barrierMode:a.barrierMode,model:a.modelId,retries:a.retries,type_id:a.typeId,type_config:a.typeConfig,context_mode:a.contextMode})),label:e.settings.label,onFailure:e.settings.onFailure,timeoutMs:e.settings.timeoutMs,budget:e.settings.budget};if(e.nodes.some(a=>a.typeId==="approval-gate"))try{const a=await this.rpcClient.call("obs.channels.all"),o=Array.isArray(a)?a:a?.channels??[];o.length>0&&(r._callerChannelType=o[0].channelType,r._callerChannelId=o[0].channelId)}catch{}const s=await this.rpcClient.call("graph.execute",r);s?.graphId?(c.show("Pipeline started","success"),this._navigate(`pipelines/${s.graphId}`)):(c.show("Pipeline started","success"),await this._loadPipelines())}catch(r){c.show(`Failed to execute: ${r instanceof Error?r.message:"Unknown error"}`,"error")}}async _handleDuplicate(e,t){if(t.stopPropagation(),!this.rpcClient){c.show("Not connected to daemon","error");return}let r,i,s;try{const u=await this.rpcClient.call("graph.load",{id:e.id});r=u.nodes,i=u.edges,s=u.settings}catch{c.show("Could not load pipeline from server","error");return}const a=crypto.randomUUID(),o=`${s.label} (copy)`,v={...s,label:o};try{await this.rpcClient.call("graph.save",{id:a,label:o,nodes:r,edges:i,settings:v}),c.show(`Duplicated as "${o}"`,"success"),this._loadPipelines()}catch(u){c.show(`Failed to duplicate: ${u instanceof Error?u.message:"Unknown error"}`,"error")}}_handleDeleteClick(e,t){t.stopPropagation(),this._deleteTarget=e}async _confirmDelete(){if(!this._deleteTarget)return;const e=this._deleteTarget;this._deleteTarget=null;try{await this.rpcClient?.call("graph.delete",{id:e.id}),c.show(`Deleted "${e.label}"`,"success")}catch(t){c.show(`Failed to delete: ${t instanceof Error?t.message:"Unknown error"}`,"error")}this._loadPipelines()}_cancelDelete(){this._deleteTarget=null}_renderStatusDot(e){const t=b[e??"draft"]??b.draft,r=(e??"draft").charAt(0).toUpperCase()+(e??"draft").slice(1);return n`<span class="status-text">
2
- <span
3
- class="status-dot ${e==="running"?"status-dot--running":""}"
4
- style="--dot-color: ${t}"
5
- ></span>
6
- ${r}
7
- </span>`}render(){return n`
8
- <ic-breadcrumb .items=${this._breadcrumbs}></ic-breadcrumb>
9
-
10
- <div class="page-header" role="region" aria-label="Pipelines">
11
- <h1 class="page-title">Pipelines</h1>
12
- <div style="display: flex; gap: 8px; align-items: center;">
13
- <button
14
- class="history-btn"
15
- @click=${()=>this._navigate("pipelines/history")}
16
- >
17
- <ic-icon name="list" size="16px"></ic-icon>
18
- History
19
- </button>
20
- <button
21
- class="create-btn"
22
- @click=${()=>this._navigate("pipelines/new")}
23
- >
24
- <ic-icon name="plus" size="16px"></ic-icon>
25
- New Pipeline
26
- </button>
27
- </div>
28
- </div>
29
-
30
- ${this._renderContent()}
31
- ${this._deleteTarget?n`
32
- <ic-confirm-dialog
33
- open
34
- variant="danger"
35
- title="Delete Pipeline"
36
- message=${`Are you sure you want to delete "${this._deleteTarget.label}"? This cannot be undone.`}
37
- confirmLabel="Delete"
38
- @confirm=${this._confirmDelete}
39
- @cancel=${this._cancelDelete}
40
- ></ic-confirm-dialog>
41
- `:h}
42
- <ic-variable-prompt
43
- ?open=${this._showVariablePrompt}
44
- .variables=${this._variableNames}
45
- .pipelineLabel=${this._pendingExecuteData?.settings.label??""}
46
- @confirm=${this._onVariableConfirm}
47
- @cancel=${()=>{this._showVariablePrompt=!1,this._pendingExecuteData=null}}
48
- ></ic-variable-prompt>
49
- `}_renderContent(){if(this._loading)return n`<ic-skeleton-view variant="list"></ic-skeleton-view>`;if(this._pipelines.length===0)return n`
50
- <ic-empty-state
51
- icon="git-branch"
52
- message="No pipelines created"
53
- description="Build an execution graph to orchestrate multi-agent workflows."
54
- >
55
- <button
56
- class="create-btn"
57
- @click=${()=>this._navigate("pipelines/new")}
58
- >
59
- <ic-icon name="plus" size="16px"></ic-icon>
60
- New Pipeline
61
- </button>
62
- </ic-empty-state>
63
- `;const e=this._filtered;return n`
64
- <div class="search-bar">
65
- <input
66
- class="search-input"
67
- type="search"
68
- placeholder="Search pipelines..."
69
- .value=${this._searchQuery}
70
- @input=${t=>{this._searchQuery=t.target.value}}
71
- />
72
- </div>
73
-
74
- ${e.length===0?n`<div class="no-results">No pipelines match your search.</div>`:n`
75
- ${this._renderTable(e)} ${this._renderMobileList(e)}
76
- `}
77
- `}_renderTable(e){return n`
78
- <div class="grid-table" role="table">
79
- <div class="grid-header" role="row">
80
- <div
81
- class="cell"
82
- role="columnheader"
83
- @click=${()=>this._handleSort("label")}
84
- >
85
- Name
86
- <span class=${this._sortArrowClass("label")}
87
- >${this._sortArrow("label")}</span
88
- >
89
- </div>
90
- <div
91
- class="cell"
92
- role="columnheader"
93
- @click=${()=>this._handleSort("nodeCount")}
94
- >
95
- Nodes
96
- <span class=${this._sortArrowClass("nodeCount")}
97
- >${this._sortArrow("nodeCount")}</span
98
- >
99
- </div>
100
- <div
101
- class="cell"
102
- role="columnheader"
103
- @click=${()=>this._handleSort("agentCount")}
104
- >
105
- Agents
106
- <span class=${this._sortArrowClass("agentCount")}
107
- >${this._sortArrow("agentCount")}</span
108
- >
109
- </div>
110
- <div
111
- class="cell"
112
- role="columnheader"
113
- @click=${()=>this._handleSort("status")}
114
- >
115
- Status
116
- <span class=${this._sortArrowClass("status")}
117
- >${this._sortArrow("status")}</span
118
- >
119
- </div>
120
- <div
121
- class="cell"
122
- role="columnheader"
123
- @click=${()=>this._handleSort("savedAt")}
124
- >
125
- Last Run
126
- <span class=${this._sortArrowClass("savedAt")}
127
- >${this._sortArrow("savedAt")}</span
128
- >
129
- </div>
130
- <div class="cell actions-header" role="columnheader">Actions</div>
131
- </div>
132
- ${e.map(t=>this._renderRow(t))}
133
- </div>
134
- `}_renderRow(e){const t=m(e.lastRun??e.savedAt);return n`
135
- <div
136
- class="grid-row"
137
- role="row"
138
- @click=${()=>this._handleRowClick(e)}
139
- >
140
- <div class="cell" role="cell">
141
- <span class=${"pipeline-label"}>${e.label}</span>
142
- </div>
143
- <div class="cell" role="cell">${e.nodeCount}</div>
144
- <div class="cell" role="cell">${e.agentCount}</div>
145
- <div class="cell" role="cell">
146
- ${this._renderStatusDot(e.status)}
147
- </div>
148
- <div class="cell dim-text" role="cell">${t}</div>
149
- <div class="cell actions-cell" role="cell">
150
- <button
151
- class="action-btn"
152
- aria-label="Edit ${e.label}"
153
- @click=${i=>this._handleEdit(e,i)}
154
- >
155
- <ic-icon name="edit" size="16px"></ic-icon>
156
- </button>
157
- ${e.source==="saved"?n`
158
- <button
159
- class="action-btn action-btn--run"
160
- aria-label="Run ${e.label}"
161
- @click=${i=>this._handleQuickExecute(e,i)}
162
- >
163
- <ic-icon name="play" size="16px"></ic-icon>
164
- </button>
165
- <button
166
- class="action-btn"
167
- aria-label="Duplicate ${e.label}"
168
- @click=${i=>this._handleDuplicate(e,i)}
169
- >
170
- <ic-icon name="copy" size="16px"></ic-icon>
171
- </button>
172
- <button
173
- class="action-btn action-btn--danger"
174
- aria-label="Delete ${e.label}"
175
- @click=${i=>this._handleDeleteClick(e,i)}
176
- >
177
- <ic-icon name="trash" size="16px"></ic-icon>
178
- </button>
179
- `:h}
180
- </div>
181
- </div>
182
- `}_renderMobileList(e){return n`
183
- <div class="mobile-list">
184
- ${e.map(t=>n`
185
- <div
186
- class="mobile-card"
187
- @click=${()=>this._handleRowClick(t)}
188
- >
189
- <div class="card-header">
190
- <span class="card-label">${t.label}</span>
191
- ${this._renderStatusDot(t.status)}
192
- </div>
193
- <div class="card-meta">
194
- <span>${t.nodeCount} nodes</span>
195
- <span>${t.agentCount} agents</span>
196
- <span>${m(t.lastRun??t.savedAt)}</span>
197
- </div>
198
- <div class="card-actions">
199
- <button
200
- class="action-btn"
201
- aria-label="Edit ${t.label}"
202
- @click=${r=>this._handleEdit(t,r)}
203
- >
204
- <ic-icon name="edit" size="16px"></ic-icon>
205
- </button>
206
- ${t.source==="saved"?n`
207
- <button
208
- class="action-btn action-btn--run"
209
- aria-label="Run ${t.label}"
210
- @click=${r=>this._handleQuickExecute(t,r)}
211
- >
212
- <ic-icon name="play" size="16px"></ic-icon>
213
- </button>
214
- <button
215
- class="action-btn action-btn--danger"
216
- aria-label="Delete ${t.label}"
217
- @click=${r=>this._handleDeleteClick(t,r)}
218
- >
219
- <ic-icon name="trash" size="16px"></ic-icon>
220
- </button>
221
- `:h}
222
- </div>
223
- </div>
224
- `)}
225
- </div>
226
- `}};l.styles=[f,_,x`
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{a as u}from"./index-FLPhHz8p.js";import"./ic-breadcrumb-DqN6G3gc.js";import"./ic-confirm-dialog-DGlPbV1T.js";import"./ic-icon-BGNCCPpZ.js";import"./ic-empty-state-CM3Wbj2f.js";import{n as d,t as f}from"./extract-variables-B7-Doo7l.js";var p={draft:`#6b7280`,running:`#06b6d4`,completed:`#22c55e`,failed:`#ef4444`,cancelled:`#f97316`};function m(e){if(!e)return`Never`;let t=Date.now()-e;if(t<0)return`just now`;let n=Math.floor(t/1e3);if(n<60)return`just now`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);if(i<24)return`${i}h ago`;let a=Math.floor(i/24);return a<30?`${a}d ago`:new Date(e).toISOString().slice(0,10)}var h=class extends r{constructor(...e){super(...e),this.rpcClient=null,this._rpcStatusUnsub=null,this._pipelines=[],this._searchQuery=``,this._loading=!0,this._deleteTarget=null,this._sortKey=`savedAt`,this._sortAsc=!1,this._showVariablePrompt=!1,this._variableNames=[],this._pendingExecuteData=null}static{this.styles=[o,i,n`
227
2
  :host {
228
3
  display: block;
229
4
  }
@@ -515,4 +290,229 @@ import{a as g,I as c,b as n,A as h,s as f,f as _,i as x,n as y,r as p,t as w}fro
515
290
  color: var(--ic-text-dim, #6b7280);
516
291
  font-size: var(--ic-text-sm, 0.875rem);
517
292
  }
518
- `];d([y({attribute:!1})],l.prototype,"rpcClient",2);d([p()],l.prototype,"_pipelines",2);d([p()],l.prototype,"_searchQuery",2);d([p()],l.prototype,"_loading",2);d([p()],l.prototype,"_deleteTarget",2);d([p()],l.prototype,"_sortKey",2);d([p()],l.prototype,"_sortAsc",2);d([p()],l.prototype,"_showVariablePrompt",2);d([p()],l.prototype,"_variableNames",2);d([p()],l.prototype,"_pendingExecuteData",2);l=d([w("ic-pipeline-list")],l);export{l as IcPipelineList};
293
+ `]}get _breadcrumbs(){return[{label:`Pipelines`}]}connectedCallback(){super.connectedCallback()}disconnectedCallback(){super.disconnectedCallback(),this._rpcStatusUnsub?.(),this._rpcStatusUnsub=null}updated(e){e.has(`rpcClient`)&&this.rpcClient&&(this._rpcStatusUnsub?.(),this.rpcClient.status===`connected`?this._loadPipelines():this._rpcStatusUnsub=this.rpcClient.onStatusChange(e=>{e===`connected`&&(this._rpcStatusUnsub=null,this._loadPipelines())}))}async _loadPipelines(){this._loading=!0;let e=[],t=[];if(this.rpcClient){let[n,r]=await Promise.allSettled([this.rpcClient.call(`graph.list`,{limit:100}),this.rpcClient.call(`graph.status`,{})]);n.status===`fulfilled`&&n.value?.entries&&(e=n.value.entries.map(e=>({id:e.id,label:e.label,source:`saved`,nodeCount:e.nodeCount,agentCount:0,savedAt:e.updatedAt,status:`draft`}))),r.status===`fulfilled`&&r.value?.graphs&&(t=r.value.graphs.map(e=>({id:e.graphId,label:e.label??e.graphId,source:`executed`,nodeCount:0,agentCount:0,lastRun:e.startedAt,status:e.status,graphId:e.graphId})))}let n=[...e];for(let e of t){let t=n.findIndex(t=>t.label.toLowerCase()===e.label.toLowerCase());t>=0?n[t]={...n[t],lastRun:e.lastRun,status:e.status,graphId:e.graphId}:n.push(e)}this._pipelines=n,this._loading=!1}get _filtered(){let e=this._pipelines;if(this._searchQuery){let t=this._searchQuery.toLowerCase();e=e.filter(e=>e.label.toLowerCase().includes(t))}return[...e].sort((e,t)=>{let n=e[this._sortKey],r=t[this._sortKey];if(n==null&&r==null)return 0;if(n==null)return 1;if(r==null)return-1;let i=n<r?-1:+(n>r);return this._sortAsc?i:-i})}_navigate(e){this.dispatchEvent(new CustomEvent(`navigate`,{detail:e,bubbles:!0,composed:!0}))}_handleSort(e){this._sortKey===e?this._sortAsc=!this._sortAsc:(this._sortKey=e,this._sortAsc=e===`label`)}_sortArrow(e){return this._sortKey===e?this._sortAsc?`▲`:`▼`:``}_sortArrowClass(e){return this._sortKey===e?`sort-arrow sort-arrow--active`:`sort-arrow`}_handleRowClick(e){e.source===`executed`&&e.graphId?this._navigate(`pipelines/${e.graphId}`):this._navigate(`pipelines/${e.id}/edit`)}_handleEdit(e,t){t.stopPropagation(),this._navigate(`pipelines/${e.id}/edit`)}async _handleQuickExecute(e,t){if(t.stopPropagation(),!this.rpcClient){u.show(`Not connected to daemon`,`error`);return}let n=null;try{n=await this.rpcClient.call(`graph.load`,{id:e.id})}catch{u.show(`Could not load pipeline from server`,`error`);return}if(!n)return;let r=f(n.nodes.map(e=>e.task));if(r.length>0){this._pendingExecuteData=n,this._variableNames=r,this._showVariablePrompt=!0;return}await this._executeGraphPayload(n,n.nodes.map(e=>e.task))}async _onVariableConfirm(e){this._showVariablePrompt=!1;let t=this._pendingExecuteData;if(this._pendingExecuteData=null,!t||!this.rpcClient)return;let n=t.nodes.map(t=>d(t.task,e.detail.values));await this._executeGraphPayload(t,n)}async _executeGraphPayload(e,t){if(this.rpcClient)try{let n={nodes:e.nodes.map((e,n)=>({nodeId:e.nodeId??e.id,task:t[n],agentId:e.agentId,dependsOn:e.dependsOn,maxSteps:e.maxSteps,timeoutMs:e.timeoutMs,barrierMode:e.barrierMode,model:e.modelId,retries:e.retries,type_id:e.typeId,type_config:e.typeConfig,context_mode:e.contextMode})),label:e.settings.label,onFailure:e.settings.onFailure,timeoutMs:e.settings.timeoutMs,budget:e.settings.budget};if(e.nodes.some(e=>e.typeId===`approval-gate`))try{let e=await this.rpcClient.call(`obs.channels.all`),t=Array.isArray(e)?e:e?.channels??[];t.length>0&&(n._callerChannelType=t[0].channelType,n._callerChannelId=t[0].channelId)}catch{}let r=await this.rpcClient.call(`graph.execute`,n);r?.graphId?(u.show(`Pipeline started`,`success`),this._navigate(`pipelines/${r.graphId}`)):(u.show(`Pipeline started`,`success`),await this._loadPipelines())}catch(e){u.show(`Failed to execute: ${e instanceof Error?e.message:`Unknown error`}`,`error`)}}async _handleDuplicate(e,t){if(t.stopPropagation(),!this.rpcClient){u.show(`Not connected to daemon`,`error`);return}let n,r,i;try{let t=await this.rpcClient.call(`graph.load`,{id:e.id});n=t.nodes,r=t.edges,i=t.settings}catch{u.show(`Could not load pipeline from server`,`error`);return}let a=crypto.randomUUID(),o=`${i.label} (copy)`,s={...i,label:o};try{await this.rpcClient.call(`graph.save`,{id:a,label:o,nodes:n,edges:r,settings:s}),u.show(`Duplicated as "${o}"`,`success`),this._loadPipelines()}catch(e){u.show(`Failed to duplicate: ${e instanceof Error?e.message:`Unknown error`}`,`error`)}}_handleDeleteClick(e,t){t.stopPropagation(),this._deleteTarget=e}async _confirmDelete(){if(!this._deleteTarget)return;let e=this._deleteTarget;this._deleteTarget=null;try{await this.rpcClient?.call(`graph.delete`,{id:e.id}),u.show(`Deleted "${e.label}"`,`success`)}catch(e){u.show(`Failed to delete: ${e instanceof Error?e.message:`Unknown error`}`,`error`)}this._loadPipelines()}_cancelDelete(){this._deleteTarget=null}_renderStatusDot(e){let n=p[e??`draft`]??p.draft,r=(e??`draft`).charAt(0).toUpperCase()+(e??`draft`).slice(1);return t`<span class="status-text">
294
+ <span
295
+ class="status-dot ${e===`running`?`status-dot--running`:``}"
296
+ style="--dot-color: ${n}"
297
+ ></span>
298
+ ${r}
299
+ </span>`}render(){return t`
300
+ <ic-breadcrumb .items=${this._breadcrumbs}></ic-breadcrumb>
301
+
302
+ <div class="page-header" role="region" aria-label="Pipelines">
303
+ <h1 class="page-title">Pipelines</h1>
304
+ <div style="display: flex; gap: 8px; align-items: center;">
305
+ <button
306
+ class="history-btn"
307
+ @click=${()=>this._navigate(`pipelines/history`)}
308
+ >
309
+ <ic-icon name="list" size="16px"></ic-icon>
310
+ History
311
+ </button>
312
+ <button
313
+ class="create-btn"
314
+ @click=${()=>this._navigate(`pipelines/new`)}
315
+ >
316
+ <ic-icon name="plus" size="16px"></ic-icon>
317
+ New Pipeline
318
+ </button>
319
+ </div>
320
+ </div>
321
+
322
+ ${this._renderContent()}
323
+ ${this._deleteTarget?t`
324
+ <ic-confirm-dialog
325
+ open
326
+ variant="danger"
327
+ title="Delete Pipeline"
328
+ message=${`Are you sure you want to delete "${this._deleteTarget.label}"? This cannot be undone.`}
329
+ confirmLabel="Delete"
330
+ @confirm=${this._confirmDelete}
331
+ @cancel=${this._cancelDelete}
332
+ ></ic-confirm-dialog>
333
+ `:l}
334
+ <ic-variable-prompt
335
+ ?open=${this._showVariablePrompt}
336
+ .variables=${this._variableNames}
337
+ .pipelineLabel=${this._pendingExecuteData?.settings.label??``}
338
+ @confirm=${this._onVariableConfirm}
339
+ @cancel=${()=>{this._showVariablePrompt=!1,this._pendingExecuteData=null}}
340
+ ></ic-variable-prompt>
341
+ `}_renderContent(){if(this._loading)return t`<ic-skeleton-view variant="list"></ic-skeleton-view>`;if(this._pipelines.length===0)return t`
342
+ <ic-empty-state
343
+ icon="git-branch"
344
+ message="No pipelines created"
345
+ description="Build an execution graph to orchestrate multi-agent workflows."
346
+ >
347
+ <button
348
+ class="create-btn"
349
+ @click=${()=>this._navigate(`pipelines/new`)}
350
+ >
351
+ <ic-icon name="plus" size="16px"></ic-icon>
352
+ New Pipeline
353
+ </button>
354
+ </ic-empty-state>
355
+ `;let e=this._filtered;return t`
356
+ <div class="search-bar">
357
+ <input
358
+ class="search-input"
359
+ type="search"
360
+ placeholder="Search pipelines..."
361
+ .value=${this._searchQuery}
362
+ @input=${e=>{this._searchQuery=e.target.value}}
363
+ />
364
+ </div>
365
+
366
+ ${e.length===0?t`<div class="no-results">No pipelines match your search.</div>`:t`
367
+ ${this._renderTable(e)} ${this._renderMobileList(e)}
368
+ `}
369
+ `}_renderTable(e){return t`
370
+ <div class="grid-table" role="table">
371
+ <div class="grid-header" role="row">
372
+ <div
373
+ class="cell"
374
+ role="columnheader"
375
+ @click=${()=>this._handleSort(`label`)}
376
+ >
377
+ Name
378
+ <span class=${this._sortArrowClass(`label`)}
379
+ >${this._sortArrow(`label`)}</span
380
+ >
381
+ </div>
382
+ <div
383
+ class="cell"
384
+ role="columnheader"
385
+ @click=${()=>this._handleSort(`nodeCount`)}
386
+ >
387
+ Nodes
388
+ <span class=${this._sortArrowClass(`nodeCount`)}
389
+ >${this._sortArrow(`nodeCount`)}</span
390
+ >
391
+ </div>
392
+ <div
393
+ class="cell"
394
+ role="columnheader"
395
+ @click=${()=>this._handleSort(`agentCount`)}
396
+ >
397
+ Agents
398
+ <span class=${this._sortArrowClass(`agentCount`)}
399
+ >${this._sortArrow(`agentCount`)}</span
400
+ >
401
+ </div>
402
+ <div
403
+ class="cell"
404
+ role="columnheader"
405
+ @click=${()=>this._handleSort(`status`)}
406
+ >
407
+ Status
408
+ <span class=${this._sortArrowClass(`status`)}
409
+ >${this._sortArrow(`status`)}</span
410
+ >
411
+ </div>
412
+ <div
413
+ class="cell"
414
+ role="columnheader"
415
+ @click=${()=>this._handleSort(`savedAt`)}
416
+ >
417
+ Last Run
418
+ <span class=${this._sortArrowClass(`savedAt`)}
419
+ >${this._sortArrow(`savedAt`)}</span
420
+ >
421
+ </div>
422
+ <div class="cell actions-header" role="columnheader">Actions</div>
423
+ </div>
424
+ ${e.map(e=>this._renderRow(e))}
425
+ </div>
426
+ `}_renderRow(e){let n=m(e.lastRun??e.savedAt);return t`
427
+ <div
428
+ class="grid-row"
429
+ role="row"
430
+ @click=${()=>this._handleRowClick(e)}
431
+ >
432
+ <div class="cell" role="cell">
433
+ <span class=${`pipeline-label`}>${e.label}</span>
434
+ </div>
435
+ <div class="cell" role="cell">${e.nodeCount}</div>
436
+ <div class="cell" role="cell">${e.agentCount}</div>
437
+ <div class="cell" role="cell">
438
+ ${this._renderStatusDot(e.status)}
439
+ </div>
440
+ <div class="cell dim-text" role="cell">${n}</div>
441
+ <div class="cell actions-cell" role="cell">
442
+ <button
443
+ class="action-btn"
444
+ aria-label="Edit ${e.label}"
445
+ @click=${t=>this._handleEdit(e,t)}
446
+ >
447
+ <ic-icon name="edit" size="16px"></ic-icon>
448
+ </button>
449
+ ${e.source===`saved`?t`
450
+ <button
451
+ class="action-btn action-btn--run"
452
+ aria-label="Run ${e.label}"
453
+ @click=${t=>this._handleQuickExecute(e,t)}
454
+ >
455
+ <ic-icon name="play" size="16px"></ic-icon>
456
+ </button>
457
+ <button
458
+ class="action-btn"
459
+ aria-label="Duplicate ${e.label}"
460
+ @click=${t=>this._handleDuplicate(e,t)}
461
+ >
462
+ <ic-icon name="copy" size="16px"></ic-icon>
463
+ </button>
464
+ <button
465
+ class="action-btn action-btn--danger"
466
+ aria-label="Delete ${e.label}"
467
+ @click=${t=>this._handleDeleteClick(e,t)}
468
+ >
469
+ <ic-icon name="trash" size="16px"></ic-icon>
470
+ </button>
471
+ `:l}
472
+ </div>
473
+ </div>
474
+ `}_renderMobileList(e){return t`
475
+ <div class="mobile-list">
476
+ ${e.map(e=>t`
477
+ <div
478
+ class="mobile-card"
479
+ @click=${()=>this._handleRowClick(e)}
480
+ >
481
+ <div class="card-header">
482
+ <span class="card-label">${e.label}</span>
483
+ ${this._renderStatusDot(e.status)}
484
+ </div>
485
+ <div class="card-meta">
486
+ <span>${e.nodeCount} nodes</span>
487
+ <span>${e.agentCount} agents</span>
488
+ <span>${m(e.lastRun??e.savedAt)}</span>
489
+ </div>
490
+ <div class="card-actions">
491
+ <button
492
+ class="action-btn"
493
+ aria-label="Edit ${e.label}"
494
+ @click=${t=>this._handleEdit(e,t)}
495
+ >
496
+ <ic-icon name="edit" size="16px"></ic-icon>
497
+ </button>
498
+ ${e.source===`saved`?t`
499
+ <button
500
+ class="action-btn action-btn--run"
501
+ aria-label="Run ${e.label}"
502
+ @click=${t=>this._handleQuickExecute(e,t)}
503
+ >
504
+ <ic-icon name="play" size="16px"></ic-icon>
505
+ </button>
506
+ <button
507
+ class="action-btn action-btn--danger"
508
+ aria-label="Delete ${e.label}"
509
+ @click=${t=>this._handleDeleteClick(e,t)}
510
+ >
511
+ <ic-icon name="trash" size="16px"></ic-icon>
512
+ </button>
513
+ `:l}
514
+ </div>
515
+ </div>
516
+ `)}
517
+ </div>
518
+ `}};c([s({attribute:!1})],h.prototype,`rpcClient`,void 0),c([a()],h.prototype,`_pipelines`,void 0),c([a()],h.prototype,`_searchQuery`,void 0),c([a()],h.prototype,`_loading`,void 0),c([a()],h.prototype,`_deleteTarget`,void 0),c([a()],h.prototype,`_sortKey`,void 0),c([a()],h.prototype,`_sortAsc`,void 0),c([a()],h.prototype,`_showVariablePrompt`,void 0),c([a()],h.prototype,`_variableNames`,void 0),c([a()],h.prototype,`_pendingExecuteData`,void 0),h=c([e(`ic-pipeline-list`)],h);export{h as IcPipelineList};