@kelloggt/dsh-program-agents 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -2
  3. package/cordis.patch.yml +5 -0
  4. package/dist/app/agents.d.ts +50 -0
  5. package/dist/app/agents.js +70 -0
  6. package/dist/app/agents.js.map +1 -0
  7. package/dist/app/conversations.d.ts +8 -0
  8. package/dist/app/conversations.js +26 -0
  9. package/dist/app/conversations.js.map +1 -0
  10. package/dist/app/endpoints.d.ts +36 -0
  11. package/dist/app/endpoints.js +162 -0
  12. package/dist/app/endpoints.js.map +1 -0
  13. package/dist/app/inbox.d.ts +61 -0
  14. package/dist/app/inbox.js +253 -0
  15. package/dist/app/inbox.js.map +1 -0
  16. package/dist/app/index.d.ts +70 -0
  17. package/dist/app/index.js +147 -0
  18. package/dist/app/index.js.map +1 -0
  19. package/dist/app/mailbox.d.ts +63 -0
  20. package/dist/app/mailbox.js +173 -0
  21. package/dist/app/mailbox.js.map +1 -0
  22. package/dist/app/models.d.ts +32 -0
  23. package/dist/app/models.js +13 -0
  24. package/dist/app/models.js.map +1 -0
  25. package/dist/app/server.d.ts +36 -0
  26. package/dist/app/server.js +233 -0
  27. package/dist/app/server.js.map +1 -0
  28. package/dist/app/stream-server.d.ts +9 -0
  29. package/dist/app/stream-server.js +77 -0
  30. package/dist/app/stream-server.js.map +1 -0
  31. package/dist/app/stream.d.ts +4 -0
  32. package/dist/app/stream.js +93 -0
  33. package/dist/app/stream.js.map +1 -0
  34. package/dist/app/tools.d.ts +16 -0
  35. package/dist/app/tools.js +24 -0
  36. package/dist/app/tools.js.map +1 -0
  37. package/dist/client/controller.d.ts +21 -0
  38. package/dist/client/controller.js +140 -0
  39. package/dist/client/controller.js.map +1 -0
  40. package/dist/client/index.d.ts +22 -0
  41. package/dist/client/index.js +14 -0
  42. package/dist/client/index.js.map +1 -0
  43. package/dist/client/model.d.ts +66 -0
  44. package/dist/client/model.js +147 -0
  45. package/dist/client/model.js.map +1 -0
  46. package/dist/client/models.d.ts +11 -0
  47. package/dist/client/models.js +27 -0
  48. package/dist/client/models.js.map +1 -0
  49. package/dist/client/transport.d.ts +64 -0
  50. package/dist/client/transport.js +141 -0
  51. package/dist/client/transport.js.map +1 -0
  52. package/dist/client/view.d.ts +19 -0
  53. package/dist/client/view.js +69 -0
  54. package/dist/client/view.js.map +1 -0
  55. package/dist/client.js +673 -0
  56. package/dist/conversations.d.ts +92 -0
  57. package/dist/conversations.js +6 -0
  58. package/dist/conversations.js.map +1 -0
  59. package/dist/endpoints.d.ts +48 -0
  60. package/dist/endpoints.js +43 -0
  61. package/dist/endpoints.js.map +1 -0
  62. package/dist/examples/dashboard.js +42 -0
  63. package/dist/examples/dynamic-server.js +27 -0
  64. package/dist/examples/inbox-worker.js +22 -0
  65. package/dist/examples/model-slots.js +19 -0
  66. package/dist/examples/standalone-supervisor.js +20 -0
  67. package/dist/host/adapter.d.ts +195 -0
  68. package/dist/host/adapter.js +630 -0
  69. package/dist/host/adapter.js.map +1 -0
  70. package/dist/host/agents.d.ts +35 -0
  71. package/dist/host/agents.js +222 -0
  72. package/dist/host/agents.js.map +1 -0
  73. package/dist/host/audit.d.ts +14 -0
  74. package/dist/host/audit.js +39 -0
  75. package/dist/host/audit.js.map +1 -0
  76. package/dist/host/catalog.d.ts +53 -0
  77. package/dist/host/catalog.js +116 -0
  78. package/dist/host/catalog.js.map +1 -0
  79. package/dist/host/contracts.d.ts +38 -0
  80. package/dist/host/contracts.js +2 -0
  81. package/dist/host/contracts.js.map +1 -0
  82. package/dist/host/conversations.d.ts +41 -0
  83. package/dist/host/conversations.js +324 -0
  84. package/dist/host/conversations.js.map +1 -0
  85. package/dist/host/events.d.ts +12 -0
  86. package/dist/host/events.js +106 -0
  87. package/dist/host/events.js.map +1 -0
  88. package/dist/host/http.d.ts +14 -0
  89. package/dist/host/http.js +30 -0
  90. package/dist/host/http.js.map +1 -0
  91. package/dist/host/index.d.ts +23 -0
  92. package/dist/host/index.js +84 -0
  93. package/dist/host/index.js.map +1 -0
  94. package/dist/host/installed-v10.js +19797 -0
  95. package/dist/host/installed-v11.js +19797 -0
  96. package/dist/host/installed-v12.js +19797 -0
  97. package/dist/host/installed-v13.js +19797 -0
  98. package/dist/host/installed-v2.js +19797 -0
  99. package/dist/host/installed-v3.js +19797 -0
  100. package/dist/host/installed-v4.js +19797 -0
  101. package/dist/host/installed-v5.js +19797 -0
  102. package/dist/host/installed-v6.js +19797 -0
  103. package/dist/host/installed-v7.js +19797 -0
  104. package/dist/host/installed-v8.js +19797 -0
  105. package/dist/host/installed-v9.js +19797 -0
  106. package/dist/host/mcp.d.ts +11 -0
  107. package/dist/host/mcp.js +42 -0
  108. package/dist/host/mcp.js.map +1 -0
  109. package/dist/host/models.d.ts +37 -0
  110. package/dist/host/models.js +141 -0
  111. package/dist/host/models.js.map +1 -0
  112. package/dist/host/operations.d.ts +22 -0
  113. package/dist/host/operations.js +72 -0
  114. package/dist/host/operations.js.map +1 -0
  115. package/dist/host/plugin.js +19797 -0
  116. package/dist/host/policies.d.ts +36 -0
  117. package/dist/host/policies.js +73 -0
  118. package/dist/host/policies.js.map +1 -0
  119. package/dist/host/requests.d.ts +57 -0
  120. package/dist/host/requests.js +353 -0
  121. package/dist/host/requests.js.map +1 -0
  122. package/dist/host/tool-client.d.ts +19 -0
  123. package/dist/host/tool-client.js +62 -0
  124. package/dist/host/tool-client.js.map +1 -0
  125. package/dist/host/validation.d.ts +5 -0
  126. package/dist/host/validation.js +42 -0
  127. package/dist/host/validation.js.map +1 -0
  128. package/dist/mcp.d.ts +7 -0
  129. package/dist/mcp.js +2 -0
  130. package/dist/mcp.js.map +1 -0
  131. package/dist/models.d.ts +34 -0
  132. package/dist/models.js +53 -0
  133. package/dist/models.js.map +1 -0
  134. package/dist/monitoring/error-buffer.d.ts +89 -0
  135. package/dist/monitoring/error-buffer.js +355 -0
  136. package/dist/monitoring/error-buffer.js.map +1 -0
  137. package/dist/monitoring/fatal.d.ts +6 -0
  138. package/dist/monitoring/fatal.js +32 -0
  139. package/dist/monitoring/fatal.js.map +1 -0
  140. package/dist/monitoring/index.d.ts +7 -0
  141. package/dist/monitoring/index.js +8 -0
  142. package/dist/monitoring/index.js.map +1 -0
  143. package/dist/monitoring/logger.d.ts +45 -0
  144. package/dist/monitoring/logger.js +174 -0
  145. package/dist/monitoring/logger.js.map +1 -0
  146. package/dist/monitoring/schemas.d.ts +34 -0
  147. package/dist/monitoring/schemas.js +132 -0
  148. package/dist/monitoring/schemas.js.map +1 -0
  149. package/dist/monitoring/standard.d.ts +51 -0
  150. package/dist/monitoring/standard.js +140 -0
  151. package/dist/monitoring/standard.js.map +1 -0
  152. package/dist/monitoring/tailer.d.ts +41 -0
  153. package/dist/monitoring/tailer.js +210 -0
  154. package/dist/monitoring/tailer.js.map +1 -0
  155. package/dist/requests.d.ts +92 -0
  156. package/dist/requests.js +120 -0
  157. package/dist/requests.js.map +1 -0
  158. package/dist/runtime/bootstrap.d.ts +1 -0
  159. package/dist/runtime/bootstrap.js +25 -0
  160. package/dist/runtime/bootstrap.js.map +1 -0
  161. package/dist/runtime/definitions.d.ts +7 -0
  162. package/dist/runtime/definitions.js +138 -0
  163. package/dist/runtime/definitions.js.map +1 -0
  164. package/dist/runtime/index.d.ts +4 -0
  165. package/dist/runtime/index.js +4 -0
  166. package/dist/runtime/index.js.map +1 -0
  167. package/dist/runtime/log-file.d.ts +24 -0
  168. package/dist/runtime/log-file.js +124 -0
  169. package/dist/runtime/log-file.js.map +1 -0
  170. package/dist/runtime/protocol.d.ts +60 -0
  171. package/dist/runtime/protocol.js +155 -0
  172. package/dist/runtime/protocol.js.map +1 -0
  173. package/dist/runtime/registry.d.ts +8 -0
  174. package/dist/runtime/registry.js +38 -0
  175. package/dist/runtime/registry.js.map +1 -0
  176. package/dist/runtime/supervisor.d.ts +74 -0
  177. package/dist/runtime/supervisor.js +881 -0
  178. package/dist/runtime/supervisor.js.map +1 -0
  179. package/dist/sdk/connection.d.ts +33 -0
  180. package/dist/sdk/connection.js +265 -0
  181. package/dist/sdk/connection.js.map +1 -0
  182. package/dist/sdk/index.d.ts +8 -0
  183. package/dist/sdk/index.js +2 -0
  184. package/dist/sdk/index.js.map +1 -0
  185. package/dist/supervision.d.ts +22 -0
  186. package/dist/supervision.js +32 -0
  187. package/dist/supervision.js.map +1 -0
  188. package/dist/types.d.ts +170 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/docs/installation.md +35 -0
  192. package/docs/log-format.md +102 -0
  193. package/docs/publishing.md +45 -0
  194. package/docs/supervision.md +73 -0
  195. package/examples/dashboard.ts +31 -0
  196. package/examples/dsh-web-local.patch.yml +15 -0
  197. package/examples/dynamic-server.ts +13 -0
  198. package/examples/inbox-worker.ts +17 -0
  199. package/examples/model-slots.ts +12 -0
  200. package/examples/standalone-supervisor.ts +14 -0
  201. package/examples/watch-server.ts +12 -0
  202. package/package.json +131 -3
  203. package/schemas/dsh.http.request.v1.schema.json +14 -0
  204. package/schemas/dsh.program.error-batch.v1.schema.json +24 -0
  205. package/schemas/dsh.program.error.v1.schema.json +8 -0
  206. package/schemas/standard-log-record.v1.schema.json +26 -0
  207. package/skills/program-agents/SKILL.md +124 -0
  208. package/skills/program-agents/chat-sidebar.md +23 -0
  209. package/skills/program-agents/endpoints.md +92 -0
  210. package/skills/program-agents/inboxes.md +120 -0
  211. package/skills/program-agents/log-format.md +102 -0
  212. package/skills/program-agents/models.md +59 -0
  213. package/skills/program-agents/references/chat-sidebar/AgentSidebar.tsx +181 -0
  214. package/skills/program-agents/references/chat-sidebar/README.md +181 -0
  215. package/skills/program-agents/references/chat-sidebar/agent-sidebar.css +37 -0
  216. package/skills/program-agents/references/chat-sidebar/backend.ts +184 -0
  217. package/skills/program-agents/references/chat-sidebar/protocol.ts +214 -0
  218. package/skills/program-agents/schemas/dsh.http.request.v1.schema.json +14 -0
  219. package/skills/program-agents/schemas/dsh.program.error-batch.v1.schema.json +24 -0
  220. package/skills/program-agents/schemas/dsh.program.error.v1.schema.json +8 -0
  221. package/skills/program-agents/schemas/standard-log-record.v1.schema.json +26 -0
  222. package/skills/program-agents/ui-patterns.md +39 -0
@@ -0,0 +1,27 @@
1
+ import { createElement as h, useEffect, useState } from 'react';
2
+ const control = { font: 'inherit', color: 'inherit', background: 'var(--dsw-specific-menu, Canvas)', border: '1px solid #8885', borderRadius: 5, padding: '3px 6px', maxWidth: '100%' };
3
+ const routeKey = (route) => JSON.stringify([route.provider, route.model]);
4
+ function Slot({ slot, config, client, program, onSaved }) {
5
+ const [selected, setSelected] = useState(slot.selection), [pending, setPending] = useState(false), [error, setError] = useState('');
6
+ useEffect(() => { setSelected(slot.selection); setError(''); }, [slot.revision]);
7
+ const model = config.catalog.groups.find(g => g.id === selected.provider)?.models.find(m => m.id === selected.model), unavailable = !model;
8
+ const save = async (reset = false) => { setPending(true); setError(''); try {
9
+ await client.setModel(program, slot.id, reset ? null : selected, slot.revision, new AbortController().signal);
10
+ onSaved();
11
+ }
12
+ catch (e) {
13
+ setError(e instanceof Error ? e.message : 'Model change failed');
14
+ }
15
+ finally {
16
+ setPending(false);
17
+ } };
18
+ return h('fieldset', { style: { border: '1px solid #8884', borderRadius: 6, margin: '6px 0', padding: 8 }, disabled: pending }, h('legend', null, slot.id), h('div', { style: { opacity: .8, marginBottom: 5 } }, slot.description), h('div', { style: { display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' } }, h('label', null, 'Model ', h('select', { 'aria-label': `Model for ${slot.id}`, style: control, value: routeKey(selected), onChange: (event) => { const [provider, model] = JSON.parse(event.target.value); setSelected({ provider, model }); } }, unavailable ? h('option', { value: routeKey(selected) }, `${selected.provider} / ${selected.model} (unavailable)`) : null, ...config.catalog.groups.map(group => h('optgroup', { key: group.id, label: group.name }, ...group.models.map(item => h('option', { key: item.id, value: routeKey({ provider: group.id, model: item.id }) }, item.name))))), h('label', null, 'Reasoning ', h('select', { 'aria-label': `Reasoning for ${slot.id}`, style: control, value: selected.reasoningEffort ?? '', onChange: (event) => setSelected(({ provider, model }) => ({ provider, model, ...event.target.value ? { reasoningEffort: event.target.value } : {} })) }, h('option', { value: '' }, 'Model default'), ...(selected.reasoningEffort && !model?.reasoning?.efforts.some(e => e.id === selected.reasoningEffort) ? [h('option', { key: 'unavailable', value: selected.reasoningEffort }, selected.reasoningEffort + ' (unavailable)')] : []), ...(model?.reasoning?.efforts ?? []).map(e => h('option', { key: e.id, value: e.id }, e.name))))), h('button', { type: 'button', style: control, onClick: () => void save(), disabled: pending || unavailable }, pending ? 'Saving…' : 'Save'), h('button', { type: 'button', style: control, onClick: () => void save(true), disabled: pending || !slot.overridden }, 'Use program default')), h('div', { style: { opacity: .65, fontSize: 11, marginTop: 5 } }, `Default: ${slot.default.provider} / ${slot.default.model}${slot.default.reasoningEffort ? ' / ' + slot.default.reasoningEffort : ''}${slot.overridden ? ' · User override' : ''}`), unavailable ? h('p', { role: 'status' }, 'Saved model is unavailable. It will not silently fall back.') : null, error ? h('p', { role: 'alert' }, error) : null);
19
+ }
20
+ export function ProgramModels({ client, program, revision }) {
21
+ const [config, setConfig] = useState(), [error, setError] = useState(''), [refresh, setRefresh] = useState(0);
22
+ useEffect(() => { const abort = new AbortController(); setError(''); void client.modelConfiguration(program, abort.signal).then(value => { if (!abort.signal.aborted)
23
+ setConfig(value); }, e => { if (!abort.signal.aborted)
24
+ setError(e instanceof Error ? e.message : 'Model configuration unavailable'); }); return () => abort.abort(); }, [client, program, revision, refresh]);
25
+ return h('div', { 'aria-label': 'Program model configuration', style: { marginTop: 6 } }, h('p', { style: { opacity: .75 } }, 'Selections affect future model-slot calls and newly created conversations. Existing conversations retain their model.'), error ? h('p', { role: 'alert' }, error) : null, !config && !error ? h('p', null, 'Loading models…') : null, ...(config?.slots ?? []).map(slot => h(Slot, { key: slot.id, slot, config: config, client, program, onSaved: () => setRefresh(n => n + 1) })), ...(config?.catalog.failures ?? []).map(f => h('p', { key: f.id, role: 'status' }, `${f.name}: ${f.message}`)));
26
+ }
27
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/client/models.ts"],"names":[],"mappings":"AAAA,OAAM,EAAC,aAAa,IAAI,CAAC,EAAC,SAAS,EAAC,QAAQ,EAAC,MAAI,OAAO,CAAC;AAGzD,MAAM,OAAO,GAAC,EAAC,IAAI,EAAC,SAAS,EAAC,KAAK,EAAC,SAAS,EAAC,UAAU,EAAC,kCAAkC,EAAC,MAAM,EAAC,iBAAiB,EAAC,YAAY,EAAC,CAAC,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAC,MAAM,EAAC,CAAC;AACvK,MAAM,QAAQ,GAAC,CAAC,KAAoB,EAAC,EAAE,CAAA,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACpF,SAAS,IAAI,CAAC,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAA4G;IAC5J,MAAK,CAAC,QAAQ,EAAC,WAAW,CAAC,GAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,CAAC,GAAC,QAAQ,CAAC,KAAK,CAAC,EAAC,CAAC,KAAK,EAAC,QAAQ,CAAC,GAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxH,SAAS,CAAC,GAAE,EAAE,GAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,EAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,KAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,KAAG,QAAQ,CAAC,KAAK,CAAC,EAAC,WAAW,GAAC,CAAC,KAAK,CAAC;IAC9H,MAAM,IAAI,GAAC,KAAK,EAAC,KAAK,GAAC,KAAK,EAAC,EAAE,GAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA,IAAG,CAAC;QAAA,MAAM,MAAM,CAAC,QAAS,CAAC,OAAO,EAAC,IAAI,CAAC,EAAE,EAAC,KAAK,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,QAAQ,EAAC,IAAI,CAAC,QAAQ,EAAC,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;QAAA,OAAO,EAAE,CAAC;IAAA,CAAC;IAAA,OAAM,CAAC,EAAC,CAAC;QAAA,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,OAAO,CAAA,CAAC,CAAA,qBAAqB,CAAC,CAAC;IAAA,CAAC;YAAO,CAAC;QAAA,UAAU,CAAC,KAAK,CAAC,CAAC;IAAA,CAAC,CAAA,CAAC,CAAC;IACxR,OAAO,CAAC,CAAC,UAAU,EAAC,EAAC,KAAK,EAAC,EAAC,MAAM,EAAC,iBAAiB,EAAC,YAAY,EAAC,CAAC,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,EAAC,EAAC,QAAQ,EAAC,OAAO,EAAC,EAC9G,CAAC,CAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,EAAC,KAAK,EAAC,EAAC,OAAO,EAAC,EAAE,EAAC,YAAY,EAAC,CAAC,EAAC,EAAC,EAAC,IAAI,CAAC,WAAW,CAAC,EACtF,CAAC,CAAC,KAAK,EAAC,EAAC,KAAK,EAAC,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,GAAG,EAAC,CAAC,EAAC,UAAU,EAAC,QAAQ,EAAC,EAAC,EACzE,CAAC,CAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,EAAC,CAAC,CAAC,QAAQ,EAAC,EAAC,YAAY,EAAC,aAAa,IAAI,CAAC,EAAE,EAAE,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,CAAC,QAAQ,CAAC,EAAC,QAAQ,EAAC,CAAC,KAAS,EAAC,EAAE,GAAC,MAAK,CAAC,QAAQ,EAAC,KAAK,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,WAAW,CAAC,EAAC,QAAQ,EAAC,KAAK,EAAC,CAAC,CAAC,CAAA,CAAC,EAAC,EAC1N,WAAW,CAAA,CAAC,CAAA,CAAC,CAAC,QAAQ,EAAC,EAAC,KAAK,EAAC,QAAQ,CAAC,QAAQ,CAAC,EAAC,EAAC,GAAG,QAAQ,CAAC,QAAQ,MAAM,QAAQ,CAAC,KAAK,gBAAgB,CAAC,CAAA,CAAC,CAAA,IAAI,EAChH,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAA,EAAE,CAAA,CAAC,CAAC,UAAU,EAAC,EAAC,GAAG,EAAC,KAAK,CAAC,EAAE,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,EAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,EAAC,EAAC,GAAG,EAAC,IAAI,CAAC,EAAE,EAAC,KAAK,EAAC,QAAQ,CAAC,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAE,EAAC,KAAK,EAAC,IAAI,CAAC,EAAE,EAAC,CAAC,EAAC,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EACrM,CAAC,CAAC,OAAO,EAAC,IAAI,EAAC,YAAY,EAAC,CAAC,CAAC,QAAQ,EAAC,EAAC,YAAY,EAAC,iBAAiB,IAAI,CAAC,EAAE,EAAE,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,CAAC,eAAe,IAAE,EAAE,EAAC,QAAQ,EAAC,CAAC,KAAS,EAAC,EAAE,CAAA,WAAW,CAAC,CAAC,EAAC,QAAQ,EAAC,KAAK,EAAC,EAAC,EAAE,CAAA,CAAC,EAAC,QAAQ,EAAC,KAAK,EAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAA,CAAC,CAAA,EAAC,eAAe,EAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAC,CAAA,CAAC,CAAA,EAAE,EAAC,CAAC,CAAC,EAAC,EAAC,CAAC,CAAC,QAAQ,EAAC,EAAC,KAAK,EAAC,EAAE,EAAC,EAAC,eAAe,CAAC,EAC/S,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,KAAG,QAAQ,CAAC,eAAe,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,CAAC,QAAQ,EAAC,EAAC,GAAG,EAAC,aAAa,EAAC,KAAK,EAAC,QAAQ,CAAC,eAAe,EAAC,EAAC,QAAQ,CAAC,eAAe,GAAC,gBAAgB,CAAC,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAChN,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,IAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,EAAC,EAAC,GAAG,EAAC,CAAC,CAAC,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC,EAAE,EAAC,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EACvF,CAAC,CAAC,QAAQ,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,GAAE,EAAE,CAAA,KAAK,IAAI,EAAE,EAAC,QAAQ,EAAC,OAAO,IAAE,WAAW,EAAC,EAAC,OAAO,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,MAAM,CAAC,EACxH,CAAC,CAAC,QAAQ,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,GAAE,EAAE,CAAA,KAAK,IAAI,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAC,OAAO,IAAE,CAAC,IAAI,CAAC,UAAU,EAAC,EAAC,qBAAqB,CAAC,CAAC,EAChI,CAAC,CAAC,KAAK,EAAC,EAAC,KAAK,EAAC,EAAC,OAAO,EAAC,GAAG,EAAC,QAAQ,EAAC,EAAE,EAAC,SAAS,EAAC,CAAC,EAAC,EAAC,EAAC,YAAY,IAAI,CAAC,OAAO,CAAC,QAAQ,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAA,CAAC,CAAA,KAAK,GAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAA,CAAC,CAAA,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA,CAAC,CAAA,kBAAkB,CAAA,CAAC,CAAA,EAAE,EAAE,CAAC,EAC/N,WAAW,CAAA,CAAC,CAAA,CAAC,CAAC,GAAG,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAC,6DAA6D,CAAC,CAAA,CAAC,CAAA,IAAI,EACrG,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,GAAG,EAAC,EAAC,IAAI,EAAC,OAAO,EAAC,EAAC,KAAK,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC,CAAC;AAC1C,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,EAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAwD;IAC7G,MAAK,CAAC,MAAM,EAAC,SAAS,CAAC,GAAC,QAAQ,EAA6B,EAAC,CAAC,KAAK,EAAC,QAAQ,CAAC,GAAC,QAAQ,CAAC,EAAE,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,CAAC,GAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7H,SAAS,CAAC,GAAE,EAAE,GAAC,MAAM,KAAK,GAAC,IAAI,eAAe,EAAE,CAAC,CAAA,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA,KAAK,MAAM,CAAC,kBAAmB,CAAC,OAAO,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA,EAAE,GAAC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;QAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC,EAAC,CAAC,CAAA,EAAE,GAAC,IAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;QAAC,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,OAAO,CAAA,CAAC,CAAA,iCAAiC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA,OAAM,GAAE,EAAE,CAAA,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA,CAAC,EAAC,CAAC,MAAM,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,CAAC,CAAC,CAAC;IACnV,OAAO,CAAC,CAAC,KAAK,EAAC,EAAC,YAAY,EAAC,6BAA6B,EAAC,KAAK,EAAC,EAAC,SAAS,EAAC,CAAC,EAAC,EAAC,EAC9E,CAAC,CAAC,GAAG,EAAC,EAAC,KAAK,EAAC,EAAC,OAAO,EAAC,GAAG,EAAC,EAAC,EAAC,uHAAuH,CAAC,EACpJ,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,GAAG,EAAC,EAAC,IAAI,EAAC,OAAO,EAAC,EAAC,KAAK,CAAC,CAAA,CAAC,CAAA,IAAI,EAAC,CAAC,MAAM,IAAE,CAAC,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,GAAG,EAAC,IAAI,EAAC,iBAAiB,CAAC,CAAA,CAAC,CAAA,IAAI,EACzF,GAAG,CAAC,MAAM,EAAE,KAAK,IAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,EAAC,EAAC,GAAG,EAAC,IAAI,CAAC,EAAE,EAAC,IAAI,EAAC,MAAM,EAAC,MAAO,EAAC,MAAM,EAAC,OAAO,EAAC,OAAO,EAAC,GAAE,EAAE,CAAA,UAAU,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,GAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EACzH,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,GAAG,EAAC,EAAC,GAAG,EAAC,CAAC,CAAC,EAAE,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACvG,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { ModelSlotView, ModelSelection } from '../models.js';
2
+ import { type ProgramAction, type ProgramItem, type ProgramRun, type RunList } from './model.js';
3
+ /** Public structural face of DSH ClientConnectionRpc; supplied by ctx.connection. */
4
+ export interface RpcTransport {
5
+ call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<{
6
+ readonly ok: true;
7
+ readonly value: unknown;
8
+ } | {
9
+ readonly ok: false;
10
+ readonly error: {
11
+ readonly code: string;
12
+ readonly message: string;
13
+ };
14
+ }>;
15
+ }
16
+ export type StreamingFetch = (input: URL, init: RequestInit) => Promise<Response>;
17
+ export interface ProgramModelCatalog {
18
+ default: ModelSelection;
19
+ routableProviders: readonly string[];
20
+ groups: readonly {
21
+ id: string;
22
+ name: string;
23
+ models: readonly {
24
+ id: string;
25
+ name: string;
26
+ description?: string;
27
+ reasoning?: {
28
+ efforts: readonly {
29
+ id: string;
30
+ name: string;
31
+ }[];
32
+ defaultEffort?: string;
33
+ };
34
+ }[];
35
+ }[];
36
+ failures: readonly {
37
+ id: string;
38
+ name: string;
39
+ message: string;
40
+ }[];
41
+ }
42
+ export interface ProgramModelConfiguration {
43
+ slots: ModelSlotView[];
44
+ catalog: ProgramModelCatalog;
45
+ }
46
+ export interface ProgramClient {
47
+ readonly sessionId: string;
48
+ list(signal: AbortSignal): Promise<RunList>;
49
+ subscribe(snapshot: (value: RunList) => void, signal: AbortSignal): Promise<void>;
50
+ action(action: ProgramAction, target: ProgramItem | ProgramRun, signal: AbortSignal): Promise<void>;
51
+ modelConfiguration?(program: string, signal: AbortSignal): Promise<ProgramModelConfiguration>;
52
+ setModel?(program: string, slot: string, selection: ModelSelection | null, revision: number, signal: AbortSignal): Promise<ModelSlotView>;
53
+ }
54
+ export declare class ProgramApiError extends Error {
55
+ readonly code: string;
56
+ constructor(code: string, message: string);
57
+ }
58
+ /** Bounded SSE parser: comments are heartbeats, only complete snapshot events apply. */
59
+ export declare function consumeSnapshots(response: Response, snapshot: (value: unknown) => void, signal: AbortSignal): Promise<void>;
60
+ /** rc.2's public ConnectionHandle has RPC but no streaming HTTP facade. Use the
61
+ * documented same-origin browser carrier fallback; no private connection fields. */
62
+ export declare function createProgramClient(connection: {
63
+ rpc: RpcTransport;
64
+ } | RpcTransport, sessionId: string, streamingFetch?: StreamingFetch, timeoutMs?: number): ProgramClient;
@@ -0,0 +1,141 @@
1
+ import { CLIENT_LIMITS, parseRunList } from './model.js';
2
+ export class ProgramApiError extends Error {
3
+ code;
4
+ constructor(code, message) { super(message); this.name = 'ProgramApiError'; this.code = code; }
5
+ }
6
+ const cancelled = () => new ProgramApiError('cancelled', 'Program agents request cancelled.');
7
+ /** Abort even when a broken carrier ignores its signal. Always remove our listener. */
8
+ async function abortable(operation, signal) {
9
+ if (signal.aborted)
10
+ throw cancelled();
11
+ let onAbort;
12
+ try {
13
+ return await Promise.race([operation(), new Promise((_resolve, reject) => {
14
+ onAbort = () => reject(cancelled());
15
+ signal.addEventListener('abort', onAbort, { once: true });
16
+ if (signal.aborted)
17
+ onAbort();
18
+ })]);
19
+ }
20
+ finally {
21
+ if (onAbort)
22
+ signal.removeEventListener('abort', onAbort);
23
+ }
24
+ }
25
+ /** Bounded SSE parser: comments are heartbeats, only complete snapshot events apply. */
26
+ export async function consumeSnapshots(response, snapshot, signal) {
27
+ if (!response.ok || !/^text\/event-stream(?:\s*;|$)/i.test(response.headers.get('content-type') ?? '') || !response.body)
28
+ throw new ProgramApiError('stream', 'Program agents connection unavailable.');
29
+ const reader = response.body.getReader();
30
+ const decoder = new TextDecoder('utf-8', { fatal: true });
31
+ let line = '', event = '', data = [], frameBytes = 0;
32
+ const abort = () => { void reader.cancel().catch(() => { }); };
33
+ signal.addEventListener('abort', abort, { once: true });
34
+ const completeLine = () => {
35
+ const text = line.endsWith('\r') ? line.slice(0, -1) : line;
36
+ line = '';
37
+ if (!text) {
38
+ if (event === 'snapshot' && data.length)
39
+ snapshot(JSON.parse(data.join('\n')));
40
+ event = '';
41
+ data = [];
42
+ frameBytes = 0;
43
+ }
44
+ else if (!text.startsWith(':')) {
45
+ const separator = text.indexOf(':');
46
+ const field = separator < 0 ? text : text.slice(0, separator);
47
+ let value = separator < 0 ? '' : text.slice(separator + 1);
48
+ if (value.startsWith(' '))
49
+ value = value.slice(1);
50
+ if (field === 'event')
51
+ event = value;
52
+ if (field === 'data')
53
+ data.push(value);
54
+ }
55
+ };
56
+ try {
57
+ while (!signal.aborted) {
58
+ const { done, value } = await abortable(() => reader.read(), signal);
59
+ if (done)
60
+ break;
61
+ let start = 0;
62
+ for (let index = 0; index < value.length; index++) {
63
+ if (value[index] !== 10)
64
+ continue;
65
+ frameBytes += index + 1 - start;
66
+ if (frameBytes > CLIENT_LIMITS.frameBytes)
67
+ throw new ProgramApiError('stream', 'Program agents snapshot is too large.');
68
+ line += decoder.decode(value.subarray(start, index), { stream: true });
69
+ completeLine();
70
+ start = index + 1;
71
+ }
72
+ frameBytes += value.length - start;
73
+ if (frameBytes > CLIENT_LIMITS.frameBytes)
74
+ throw new ProgramApiError('stream', 'Program agents snapshot is too large.');
75
+ line += decoder.decode(value.subarray(start), { stream: true });
76
+ }
77
+ if (signal.aborted)
78
+ throw cancelled();
79
+ // EOF without a blank line is an incomplete event, never an authoritative state.
80
+ }
81
+ finally {
82
+ signal.removeEventListener('abort', abort);
83
+ void reader.cancel().catch(() => { });
84
+ reader.releaseLock();
85
+ }
86
+ }
87
+ /** rc.2's public ConnectionHandle has RPC but no streaming HTTP facade. Use the
88
+ * documented same-origin browser carrier fallback; no private connection fields. */
89
+ export function createProgramClient(connection, sessionId, streamingFetch = (input, init) => globalThis.fetch(input, init), timeoutMs = 20_000) {
90
+ if (!sessionId)
91
+ throw new Error('Program agents require a selected Session.');
92
+ const rpc = 'rpc' in connection ? connection.rpc : connection;
93
+ const call = async (method, payload, signal) => {
94
+ const abort = new AbortController();
95
+ const cancel = () => abort.abort();
96
+ signal.addEventListener('abort', cancel, { once: true });
97
+ if (signal.aborted)
98
+ abort.abort();
99
+ const deadline = setTimeout(cancel, timeoutMs);
100
+ try {
101
+ const reply = await abortable(() => rpc.call('/api', `programAgents/${method}`, payload, abort.signal), abort.signal);
102
+ if (!reply.ok)
103
+ throw new ProgramApiError(reply.error.code, reply.error.message);
104
+ return reply.value;
105
+ }
106
+ catch (error) {
107
+ if (abort.signal.aborted && !signal.aborted)
108
+ throw new ProgramApiError('timeout', 'Program action timed out. Check status before retrying.');
109
+ throw error;
110
+ }
111
+ finally {
112
+ clearTimeout(deadline);
113
+ signal.removeEventListener('abort', cancel);
114
+ }
115
+ };
116
+ return {
117
+ sessionId,
118
+ async modelConfiguration(program, signal) { return await call('models', { sessionId, program }, signal); },
119
+ async setModel(program, slot, selection, revision, signal) { return await call('modelSet', { sessionId, program, slot, selection, revision }, signal); },
120
+ async list(signal) { return parseRunList(await call('list', { sessionId }, signal), sessionId); },
121
+ async subscribe(snapshot, signal) {
122
+ const url = new URL('api/programAgents/events', document.baseURI);
123
+ const response = await abortable(() => streamingFetch(url, {
124
+ method: 'POST', credentials: 'same-origin', redirect: 'error', cache: 'no-store',
125
+ headers: { 'content-type': 'application/json', accept: 'text/event-stream' },
126
+ body: JSON.stringify({ sessionId }), signal,
127
+ }), signal);
128
+ await consumeSnapshots(response, value => { if (!signal.aborted)
129
+ snapshot(parseRunList(value, sessionId)); }, signal);
130
+ },
131
+ async action(action, target, signal) {
132
+ const run = 'ownerId' in target ? target : target.run;
133
+ if (run && run.ownerId !== sessionId)
134
+ throw new Error('Program does not belong to this Session.');
135
+ if (action !== 'start' && !run)
136
+ throw new Error('Program has no current run.');
137
+ await call(action, action === 'start' ? { sessionId, program: target.program } : { sessionId, id: run.id, generation: run.generation }, signal);
138
+ },
139
+ };
140
+ }
141
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuE,MAAM,YAAY,CAAC;AAoB9H,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAS;IACtB,YAAY,IAAY,EAAE,OAAe,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;CAChH;AACD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,mCAAmC,CAAC,CAAC;AAC9F,uFAAuF;AACvF,KAAK,UAAU,SAAS,CAAI,SAA2B,EAAE,MAAmB;IAC1E,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,SAAS,EAAE,CAAC;IACtC,IAAI,OAAiC,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBAC9E,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACpC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1D,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO,EAAE,CAAC;YAChC,CAAC,CAAC,CAAC,CAAC,CAAC;IACP,CAAC;YAAS,CAAC;QAAC,IAAI,OAAO;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;AAC1E,CAAC;AACD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,QAAkC,EAAE,MAAmB;IAChH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAC;IACxM,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,GAAa,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,IAAI,GAAG,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/E,KAAK,GAAG,EAAE,CAAC;YAAC,IAAI,GAAG,EAAE,CAAC;YAAC,UAAU,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,IAAI,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,OAAO;gBAAE,KAAK,GAAG,KAAK,CAAC;YACrC,IAAI,KAAK,KAAK,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YACrE,IAAI,IAAI;gBAAE,MAAM;YAChB,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;oBAAE,SAAS;gBAClC,UAAU,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;gBAChC,IAAI,UAAU,GAAG,aAAa,CAAC,UAAU;oBAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC;gBACxH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvE,YAAY,EAAE,CAAC;gBAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YACpC,CAAC;YACD,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YACnC,IAAI,UAAU,GAAG,aAAa,CAAC,UAAU;gBAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,uCAAuC,CAAC,CAAC;YACxH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,SAAS,EAAE,CAAC;QACtC,iFAAiF;IACnF,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AACD;oFACoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,UAAgD,EAAE,SAAiB,EAAE,iBAAiC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM;IAC1M,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9D,MAAM,IAAI,GAAG,KAAK,EAAE,MAAc,EAAE,OAAgB,EAAE,MAAmB,EAAoB,EAAE;QAC7F,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACtH,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChF,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,yDAAyD,CAAC,CAAC;YAC7I,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;IACpF,CAAC,CAAC;IACF,OAAO;QACL,SAAS;QACT,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAC,MAAM,IAAE,OAAO,MAAM,IAAI,CAAC,QAAQ,EAAC,EAAC,SAAS,EAAC,OAAO,EAAC,EAAC,MAAM,CAA6B,CAAC,CAAA,CAAC;QAC7H,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,MAAM,IAAE,OAAO,MAAM,IAAI,CAAC,UAAU,EAAC,EAAC,SAAS,EAAC,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,EAAC,MAAM,CAAiB,CAAC,CAAA,CAAC;QACzJ,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QACjG,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM;YAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0BAA0B,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE;gBACzD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU;gBAChF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,EAAE;gBAC5E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM;aAC5C,CAAC,EAAE,MAAM,CAAC,CAAC;YACZ,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxH,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM;YACjC,MAAM,GAAG,GAAG,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACtD,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAClG,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC/E,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,GAAI,CAAC,EAAE,EAAE,UAAU,EAAE,GAAI,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;QACpJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type CSSProperties } from 'react';
2
+ import type { ProgramClient } from './transport.js';
3
+ /** Tiny status strip in the existing Session composer slot. Foldout state is
4
+ * independent of snapshots, and rows are keyed by definition, never generation. */
5
+ export declare function ProgramAgentsPanel({ client, reconnectDelayMs }: {
6
+ client: ProgramClient;
7
+ reconnectDelayMs?: number;
8
+ }): import("react").DetailedReactHTMLElement<{
9
+ 'aria-label': string;
10
+ 'data-session-id': string;
11
+ style: CSSProperties;
12
+ }, HTMLElement>;
13
+ /** A Session switch remounts local state; no previous owner's content can flash. */
14
+ export declare function ProgramAgentsDock({ programClient }: {
15
+ programClient: ProgramClient;
16
+ }): import("react").FunctionComponentElement<{
17
+ client: ProgramClient;
18
+ reconnectDelayMs?: number;
19
+ }>;
@@ -0,0 +1,69 @@
1
+ import { createElement as h, useEffect, useMemo, useState, useSyncExternalStore } from 'react';
2
+ import { actionKey, createPanelController } from './controller.js';
3
+ import { resourceLink, runControls, safeResourceUrl } from './model.js';
4
+ import { ProgramModels } from './models.js';
5
+ // The conversation.input.dock lives inside DSH's bottom-anchored composer seat.
6
+ // Stay in that layout flow: no global selectors, fixed positioning or overlay.
7
+ const panelStyle = {
8
+ boxSizing: 'border-box', width: '100%', maxWidth: 'var(--dsh-composer-card-max-width, 960px)',
9
+ margin: '0 auto 4px', border: '1px solid var(--dsw-alias-border-l1, #8884)', borderRadius: 8,
10
+ background: 'var(--dsw-specific-menu, Canvas)', color: 'var(--dsw-alias-label-primary, CanvasText)', fontSize: 12,
11
+ };
12
+ const rowStyle = { display: 'flex', gap: 8, alignItems: 'center', minWidth: 0 };
13
+ const buttonStyle = { font: 'inherit', color: 'inherit', background: 'transparent', border: '1px solid var(--dsw-alias-border-l1, #8885)', borderRadius: 5, padding: '2px 6px', cursor: 'pointer', whiteSpace: 'nowrap' };
14
+ const mutedStyle = { opacity: 0.65, fontSize: 11 };
15
+ const linkStyle = { color: 'var(--dsw-alias-link-primary, LinkText)', whiteSpace: 'nowrap' };
16
+ const errorStyle = { color: 'var(--dsw-alias-state-error-primary, #bc3333)', fontSize: 11, margin: '3px 0 0', overflowWrap: 'anywhere' };
17
+ function button(label, disabled, onClick, extra = {}) {
18
+ return h('button', { type: 'button', style: { ...buttonStyle, opacity: disabled ? 0.5 : 1 }, disabled, onClick, ...extra }, label);
19
+ }
20
+ function ProgramRow({ item, state, controller, client }) {
21
+ const key = actionKey(item), pending = state.pending[key];
22
+ const status = item.run?.state ?? 'configured';
23
+ const controls = runControls(status, Boolean(pending), state.stale);
24
+ const [more, setMore] = useState(false);
25
+ const [models, setModels] = useState(false);
26
+ const [copied, setCopied] = useState('');
27
+ const localDocs = [...new Set(item.urls.flatMap(resource => [
28
+ ...(resource.docs && !safeResourceUrl(resource.docs) ? [resource.docs] : []),
29
+ ...(resource.type === 'docs' && /^(?:\/|[A-Za-z]:[\\/])/.test(resource.url) && !safeResourceUrl(resource.url) ? [resource.url] : []),
30
+ ]))];
31
+ const hasMore = Boolean(item.description || item.command.length || item.logsPath || localDocs.length);
32
+ const perform = (action) => { void controller.action(action, item); };
33
+ const copy = (text) => {
34
+ if (typeof navigator.clipboard?.writeText === 'function')
35
+ void navigator.clipboard.writeText(text).then(() => setCopied(text), () => { });
36
+ };
37
+ return h('article', { 'data-program-key': item.program, style: { padding: '6px 9px', borderTop: '1px solid var(--dsw-alias-border-l1, #8883)' } }, h('div', { style: rowStyle }, h('strong', { title: item.name, style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', flex: '1 1 100px' } }, item.name), h('span', { 'data-program-state': status, title: item.run?.status, style: mutedStyle }, status), h('span', { 'aria-label': 'Program resources', style: { ...rowStyle, gap: 6, flexWrap: 'wrap' } }, ...item.urls.flatMap((resource, index) => {
38
+ const href = resourceLink(item, resource, state.stale, pending);
39
+ const label = resource.type.toUpperCase();
40
+ const docsHref = resource.docs && safeResourceUrl(resource.docs);
41
+ return [href
42
+ ? h('a', { key: `${index}:url`, href, target: '_blank', rel: 'noopener noreferrer', referrerPolicy: 'no-referrer', title: resource.title, style: linkStyle }, label)
43
+ : h('span', { key: `${index}:url`, 'aria-disabled': true, title: resource.title, style: mutedStyle }, label),
44
+ ...(docsHref && resource.type !== 'docs' ? [href
45
+ ? h('a', { key: `${index}:docs`, href: docsHref, target: '_blank', rel: 'noopener noreferrer', referrerPolicy: 'no-referrer', style: linkStyle }, 'Docs')
46
+ : h('span', { key: `${index}:docs`, 'aria-disabled': true, style: mutedStyle }, 'Docs')] : []),
47
+ ];
48
+ })), (status === 'configured' || ['stopped', 'completed', 'failed'].includes(status)) ? button(pending === 'start' ? 'Starting…' : 'Start', !controls.start, () => perform('start')) : null, status !== 'configured' && !['stopped', 'completed', 'failed'].includes(status) ? button(pending === 'stop' ? 'Stopping…' : 'Stop', !controls.stop, () => perform('stop')) : null, status !== 'configured' ? button(pending === 'restart' ? 'Restarting…' : 'Restart', !controls.restart, () => perform('restart')) : null, item.hasModelSlots && client.modelConfiguration && client.setModel ? button('Models', state.stale, () => setModels(!models), { 'aria-expanded': models, 'aria-label': `Configure models for ${item.name}` }) : null, hasMore ? button('More', false, () => setMore(!more), { 'aria-expanded': more, 'aria-label': `More about ${item.name}`, style: { ...buttonStyle, border: 0, padding: '2px 0', ...mutedStyle } }) : null), (state.actionErrors[key] || item.run?.error) ? h('p', { role: 'alert', style: errorStyle }, state.actionErrors[key] || item.run?.error) : null, models && item.hasModelSlots ? h(ProgramModels, { client, program: item.program, revision: item.modelRevision }) : null, more ? h('div', { 'aria-label': `${item.name} details`, style: { ...mutedStyle, marginTop: 5, overflowWrap: 'anywhere' } }, item.description ? h('div', null, item.description) : null, item.command.length ? h('div', null, h('code', null, item.command.join(' '))) : null, item.logsPath ? h('div', null, 'Logs: ', h('code', null, item.logsPath)) : null, ...localDocs.map((path, index) => h('div', { key: index }, 'Docs: ', h('code', null, path), ' ', button(copied === path ? 'Copied' : 'Copy', false, () => copy(path))))) : null);
49
+ }
50
+ /** Tiny status strip in the existing Session composer slot. Foldout state is
51
+ * independent of snapshots, and rows are keyed by definition, never generation. */
52
+ export function ProgramAgentsPanel({ client, reconnectDelayMs }) {
53
+ const controller = useMemo(() => createPanelController(client, reconnectDelayMs), [client, reconnectDelayMs]);
54
+ const state = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);
55
+ useEffect(() => {
56
+ const changed = () => controller.setVisible(document.visibilityState !== 'hidden');
57
+ changed();
58
+ controller.start();
59
+ document.addEventListener('visibilitychange', changed);
60
+ return () => { document.removeEventListener('visibilitychange', changed); controller.stop(); };
61
+ }, [controller]);
62
+ const [open, setOpen] = useState(false);
63
+ return h('section', { 'aria-label': 'Program agents', 'data-session-id': client.sessionId, style: panelStyle }, h('div', { style: { ...rowStyle, padding: '3px 8px' } }, button(`${open ? '▾' : '▸'} Program agents (${state.items.length})`, false, () => setOpen(!open), { 'aria-expanded': open, style: { ...buttonStyle, border: 0, flex: 1, textAlign: 'left', padding: '2px 0' } }), state.stale ? h('span', { role: 'status', title: state.error, style: mutedStyle }, state.error ? 'Reconnecting…' : state.loading ? 'Connecting…' : 'Paused') : null), open ? h('div', { 'data-program-foldout': true, style: { maxHeight: 'min(240px, 35vh)', overflowY: 'auto', overscrollBehavior: 'contain' } }, !state.items.length && !state.loading ? h('div', { style: { padding: '5px 9px', ...mutedStyle } }, 'No programs configured.') : null, state.truncated ? h('div', { style: { padding: '3px 9px', ...mutedStyle } }, 'Showing the most recent programs.') : null, ...state.items.map(item => h(ProgramRow, { key: item.program, item, state, controller, client }))) : null);
64
+ }
65
+ /** A Session switch remounts local state; no previous owner's content can flash. */
66
+ export function ProgramAgentsDock({ programClient }) {
67
+ return h(ProgramAgentsPanel, { key: programClient.sessionId, client: programClient });
68
+ }
69
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/client/view.ts"],"names":[],"mappings":"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"}