openfox 2.0.115 → 2.0.117

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 (95) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/CHANGELOG.md +46 -0
  3. package/dist/{ask-ZYPCJKZD.js → ask-UBIRH3SO.js} +2 -2
  4. package/dist/{auth-YY5PJYSC.js → auth-GTGIGX5X.js} +2 -2
  5. package/dist/{auto-config-T5GR2N6X.js → auto-config-AAUO4PKW.js} +2 -2
  6. package/dist/{backend-LVYHLGQJ.js → backend-67OLCS5O.js} +2 -2
  7. package/dist/{branch.api-XVTYACSH.js → branch.api-UMKSQMSA.js} +2 -2
  8. package/dist/changelog-FZUE6OSG.js +63 -0
  9. package/dist/{chat-handler-5SP265CR.js → chat-handler-URSNELCE.js} +17 -17
  10. package/dist/{chunk-JFK4GKQD.js → chunk-2PQA3DHY.js} +62 -91
  11. package/dist/{chunk-TFF5T3K3.js → chunk-3PEYTWCS.js} +3 -3
  12. package/dist/{chunk-I7FY2LTR.js → chunk-4GHLULHB.js} +18 -2
  13. package/dist/{chunk-TGLVWAFC.js → chunk-6XHDNSA3.js} +5 -5
  14. package/dist/{chunk-3QQAIUZI.js → chunk-7SDJXHJH.js} +175 -30
  15. package/dist/{chunk-4H427UBV.js → chunk-AGXJ5O63.js} +2 -2
  16. package/dist/{chunk-OCBBAEMT.js → chunk-ECCSVMRT.js} +179 -137
  17. package/dist/{chunk-OCSTEGK7.js → chunk-EQ5CGNOT.js} +2 -2
  18. package/dist/{chunk-YX3OQBNX.js → chunk-EQ7DK2TG.js} +9 -5
  19. package/dist/{chunk-OKVHMKE2.js → chunk-EZD7WFBZ.js} +33 -29
  20. package/dist/{chunk-BVVCRIVM.js → chunk-GZTMCTUS.js} +3 -3
  21. package/dist/{chunk-6RGACY4E.js → chunk-HZSKKJHQ.js} +4 -3
  22. package/dist/{chunk-3NPLERPQ.js → chunk-I6MY65LO.js} +9 -8
  23. package/dist/{chunk-VWEATA7R.js → chunk-KLQEL2DZ.js} +7 -1
  24. package/dist/{chunk-JGWHRYWG.js → chunk-MKWS7TQH.js} +2 -2
  25. package/dist/chunk-NPTI5RCQ.js +7 -0
  26. package/dist/{chunk-6KPJLELC.js → chunk-QQVPUZQB.js} +156 -20
  27. package/dist/{chunk-ERNWAKUB.js → chunk-TGVDUK4N.js} +2 -2
  28. package/dist/{chunk-V4IE7HJY.js → chunk-W7VIYHPQ.js} +2 -2
  29. package/dist/{chunk-BWVO5WFK.js → chunk-X3XKYGUN.js} +3 -3
  30. package/dist/{chunk-5WRI5ZAA.js → chunk-YLJ4XMA6.js} +6 -2
  31. package/dist/{chunk-X25Q6RAV.js → chunk-ZKLE2Q3I.js} +1 -1
  32. package/dist/{chunk-37QLXLML.js → chunk-ZS6MW2WM.js} +14 -14
  33. package/dist/cli/dev.js +3 -3
  34. package/dist/cli/index.js +3 -3
  35. package/dist/{client-KE7EDI2D.js → client-KCNTDTIR.js} +4 -4
  36. package/dist/{client-pure-66Z6FWS6.js → client-pure-B5DHEKQJ.js} +2 -2
  37. package/dist/command-defaults/mark-done.command.md +6 -6
  38. package/dist/{compactor-SKVC2VNL.js → compactor-LAXZLPPA.js} +7 -7
  39. package/dist/{config-EAB3V4QK.js → config-TUCHLIWD.js} +2 -2
  40. package/dist/{dynamic-context-QNB4ELLP.js → dynamic-context-NNBVVFBT.js} +3 -3
  41. package/dist/{events-5PLO4QJU.js → events-IVPAMMR5.js} +4 -4
  42. package/dist/{folding-CJWYFUKD.js → folding-RTGU63BW.js} +2 -2
  43. package/dist/{http-client-KLODRQC2.js → http-client-IPUW2MSW.js} +2 -2
  44. package/dist/{inspect-proxy-K6QKEYDT.js → inspect-proxy-WPEDMCG7.js} +2 -2
  45. package/dist/{install-CPOPMCSE.js → install-VA2F6X6Z.js} +2 -2
  46. package/dist/{launch-EOXVWLOP.js → launch-HSSFGQ5A.js} +17 -17
  47. package/dist/{manager-LZ3JQ443.js → manager-EMLSLMMT.js} +2 -2
  48. package/dist/{model-overrides-5UVW3KTE.js → model-overrides-7F2EOA4U.js} +2 -2
  49. package/dist/{oauth-provider-52YILVUJ.js → oauth-provider-DGBC2YM6.js} +2 -2
  50. package/dist/{oauth-store-XCFXV2VM.js → oauth-store-KECHUT54.js} +2 -2
  51. package/dist/{openFolder-HX7X356L.js → openFolder-XCMSU3OI.js} +2 -2
  52. package/dist/{orchestrator-ED3KFPXO.js → orchestrator-FVXUJW3K.js} +16 -16
  53. package/dist/package.json +5 -2
  54. package/dist/{path-security-B6EZC63L.js → path-security-JTCHWYG3.js} +7 -7
  55. package/dist/{paths-F27V3S4I.js → paths-BHR7CZ7I.js} +2 -2
  56. package/dist/{permissions-K6YEA2ZZ.js → permissions-UKR524ZB.js} +2 -2
  57. package/dist/{platform-6RPPBHKH.js → platform-ECDDYMAR.js} +2 -2
  58. package/dist/{processor-226ZOTRI.js → processor-JRVW5QBA.js} +16 -16
  59. package/dist/profiles-GYHXBWPV.js +10 -0
  60. package/dist/{project-creator-VBFE35NI.js → project-creator-PMQ65NKN.js} +2 -2
  61. package/dist/{projects-AXHZOBR2.js → projects-NDPNOV6D.js} +2 -2
  62. package/dist/{protocol-JdxRpPxM.d.ts → protocol-CfUkCYxF.d.ts} +11 -2
  63. package/dist/{protocol-RKSWKNXI.js → protocol-HYA5BYVN.js} +8 -4
  64. package/dist/{provider-DL4ZWQY7.js → provider-Q7J4UFTS.js} +7 -7
  65. package/dist/{provider-manager-6CLRMGDE.js → provider-manager-TMBO4DFG.js} +5 -5
  66. package/dist/{pwa-XPHP3PY2.js → pwa-2GRFSXD7.js} +3 -3
  67. package/dist/{registry-5XI5NDBF.js → registry-5QL3BOWN.js} +2 -2
  68. package/dist/{serve-DARV4NJG.js → serve-CW6PR3M2.js} +22 -22
  69. package/dist/server/index.d.ts +15 -2
  70. package/dist/server/index.js +21 -21
  71. package/dist/{server-LQJ7MBDS.js → server-V46SOIGP.js} +20 -20
  72. package/dist/{service-4JKTGPRG.js → service-M7XJHAK4.js} +6 -6
  73. package/dist/{service-CXWJQFOZ.js → service-WKABQHKL.js} +2 -2
  74. package/dist/{session-overrides-AZKV6BRD.js → session-overrides-CWBKPHMF.js} +4 -4
  75. package/dist/{sessions-752IZIIK.js → sessions-I7ELDIIP.js} +5 -3
  76. package/dist/{settings-2AHDKCD7.js → settings-FGXQHKUH.js} +2 -2
  77. package/dist/shared/index.d.ts +1 -1
  78. package/dist/shared/index.js +2 -2
  79. package/dist/{store-SARB6V2N.js → store-JYPZ2RXB.js} +2 -2
  80. package/dist/{tasks-XJXHU623.js → tasks-X5H5HM4J.js} +6 -6
  81. package/dist/{tool-adapter-FEAHWU5C.js → tool-adapter-FJAFLDZA.js} +2 -2
  82. package/dist/{tools-QYYNFMGU.js → tools-2Q3GRECI.js} +14 -14
  83. package/dist/{update-2REP2WB6.js → update-YP7IRT6M.js} +4 -4
  84. package/dist/{update-server-LOOXIXDW.js → update-server-SVPV6ZJZ.js} +2 -2
  85. package/dist/{url-utils-SAJP7AEX.js → url-utils-C5BM7NF7.js} +2 -2
  86. package/dist/web/assets/index-C58KXxRi.js +324 -0
  87. package/dist/web/assets/{index-BmILAZrT.css → index-DTiVSJJu.css} +1 -1
  88. package/dist/web/index.html +2 -2
  89. package/dist/web/sw.js +1 -1
  90. package/dist/workflow-defaults/default.workflow.json +2 -2
  91. package/dist/{workspace-RMZVTFJD.js → workspace-IQLLHMYR.js} +2 -2
  92. package/package.json +5 -2
  93. package/dist/chunk-5V3BF67X.js +0 -7
  94. package/dist/profiles-5J7F4BML.js +0 -10
  95. package/dist/web/assets/index-M7ToECa4.js +0 -324
package/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.117 - 2026-08-12
4
+
5
+ ### Features
6
+
7
+ - **New-session picker in split view** — pick any project, create a session, and open it as a pane
8
+ - **Project dropdown in split panes** — open the folder, manage tasks, or edit settings straight from a pane header
9
+
10
+ ### Enhancements
11
+
12
+ - **Live session list in split view** — the control panel refreshes automatically and on tab focus
13
+ - **Breadcrumb modal titles** — Tasks and Project Settings now read "project › action"
14
+
15
+ ### Bug Fixes
16
+
17
+ - **Tail smartness off for chained commands** — `&&`/`||` chains are no longer misread as piped output
18
+ - **Queued messages survive sub-agent runs** — no longer drained into a sub-agent context mid-run
19
+ - **Composer stays compact on narrow layouts** — and re-sizes when the pane width changes
20
+ - **Split-view actions target the owning pane** — launch, resume, retry, compact, and exit stay in their pane
21
+ - **Path confirmations land in the right pane** — allow/deny prompts appear instantly where they were asked
22
+ - **Each split pane shows its own workspace** — branch, git diff, and context no longer bleed between panes
23
+ - **Adding a split pane mid-stream no longer crashes** — the "maximum update depth" blank-screen error is gone
24
+ - **Project-scoped agents in the default agent list** — grouped by Project, User, and Built-in
25
+ - **Saving a new agent no longer hangs** — the settings modal no longer sticks on "saving"
26
+
27
+ ## 2.0.116 - 2026-08-11
28
+
29
+ ### Features
30
+
31
+ - **Split view for multiple sessions** — run independent sessions side-by-side in one window, each with its own feed, sidebar, and responsive layout
32
+ - **Workflow steps retry automatically** — LLM-failed steps retry with escalating backoff and a clean history
33
+ - **Changelog trimmed to your upgrade path** — release notes only show what changed since the version you last ran
34
+
35
+ ### Enhancements
36
+
37
+ - **Bigger default response limit** — max response tokens raised from 4096 to 16384
38
+ - **Header task badge tracks running work** — only actively running tasks count toward the green badge
39
+
40
+ ### Bug Fixes
41
+
42
+ - **False path confirmations eliminated** — sed/awk/perl/ruby regex expressions no longer trip the file-access guard
43
+ - **Sandbox escapes now flagged** — bare-root paths and dot-dot traversal outside the workdir are caught
44
+ - **Context size survives failed calls** — a failed LLM query keeps the last known context size
45
+ - **System-prompt warning scoped per pane** — the "prompt changed" banner only shows in the session that changed
46
+ - **Setup workspace step stays scoped** — the workflow's first step only creates the workspace, no premature implementation
47
+ - **Dependency vulnerabilities patched** — npm audit reports zero known issues
48
+
3
49
  ## 2.0.115 - 2026-08-11
4
50
 
5
51
  ### Features
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.117 - 2026-08-12
4
+
5
+ ### Features
6
+
7
+ - **New-session picker in split view** — pick any project, create a session, and open it as a pane
8
+ - **Project dropdown in split panes** — open the folder, manage tasks, or edit settings straight from a pane header
9
+
10
+ ### Enhancements
11
+
12
+ - **Live session list in split view** — the control panel refreshes automatically and on tab focus
13
+ - **Breadcrumb modal titles** — Tasks and Project Settings now read "project › action"
14
+
15
+ ### Bug Fixes
16
+
17
+ - **Tail smartness off for chained commands** — `&&`/`||` chains are no longer misread as piped output
18
+ - **Queued messages survive sub-agent runs** — no longer drained into a sub-agent context mid-run
19
+ - **Composer stays compact on narrow layouts** — and re-sizes when the pane width changes
20
+ - **Split-view actions target the owning pane** — launch, resume, retry, compact, and exit stay in their pane
21
+ - **Path confirmations land in the right pane** — allow/deny prompts appear instantly where they were asked
22
+ - **Each split pane shows its own workspace** — branch, git diff, and context no longer bleed between panes
23
+ - **Adding a split pane mid-stream no longer crashes** — the "maximum update depth" blank-screen error is gone
24
+ - **Project-scoped agents in the default agent list** — grouped by Project, User, and Built-in
25
+ - **Saving a new agent no longer hangs** — the settings modal no longer sticks on "saving"
26
+
27
+ ## 2.0.116 - 2026-08-11
28
+
29
+ ### Features
30
+
31
+ - **Split view for multiple sessions** — run independent sessions side-by-side in one window, each with its own feed, sidebar, and responsive layout
32
+ - **Workflow steps retry automatically** — LLM-failed steps retry with escalating backoff and a clean history
33
+ - **Changelog trimmed to your upgrade path** — release notes only show what changed since the version you last ran
34
+
35
+ ### Enhancements
36
+
37
+ - **Bigger default response limit** — max response tokens raised from 4096 to 16384
38
+ - **Header task badge tracks running work** — only actively running tasks count toward the green badge
39
+
40
+ ### Bug Fixes
41
+
42
+ - **False path confirmations eliminated** — sed/awk/perl/ruby regex expressions no longer trip the file-access guard
43
+ - **Sandbox escapes now flagged** — bare-root paths and dot-dot traversal outside the workdir are caught
44
+ - **Context size survives failed calls** — a failed LLM query keeps the last known context size
45
+ - **System-prompt warning scoped per pane** — the "prompt changed" banner only shows in the session that changed
46
+ - **Setup workspace step stays scoped** — the workflow's first step only creates the workspace, no premature implementation
47
+ - **Dependency vulnerabilities patched** — npm audit reports zero known issues
48
+
3
49
  ## 2.0.115 - 2026-08-11
4
50
 
5
51
  ### Features
@@ -9,7 +9,7 @@ import {
9
9
  provideAnswer
10
10
  } from "./chunk-JURM3RPZ.js";
11
11
  import "./chunk-LCLH6ZUL.js";
12
- import "./chunk-5WRI5ZAA.js";
12
+ import "./chunk-YLJ4XMA6.js";
13
13
  export {
14
14
  AskUserInterrupt,
15
15
  askUserTool,
@@ -20,4 +20,4 @@ export {
20
20
  hasPendingQuestion,
21
21
  provideAnswer
22
22
  };
23
- //# sourceMappingURL=ask-ZYPCJKZD.js.map
23
+ //# sourceMappingURL=ask-UBIRH3SO.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getAuthConfigPath
3
3
  } from "./chunk-CQGTEGKL.js";
4
- import "./chunk-5WRI5ZAA.js";
4
+ import "./chunk-YLJ4XMA6.js";
5
5
 
6
6
  // src/cli/auth.ts
7
7
  import { readFile, writeFile, mkdir, access } from "fs/promises";
@@ -48,4 +48,4 @@ export {
48
48
  saveAuthConfig,
49
49
  verifyPassword
50
50
  };
51
- //# sourceMappingURL=auth-YY5PJYSC.js.map
51
+ //# sourceMappingURL=auth-GTGIGX5X.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  logger
6
6
  } from "./chunk-K44MW7JJ.js";
7
- import "./chunk-5WRI5ZAA.js";
7
+ import "./chunk-YLJ4XMA6.js";
8
8
 
9
9
  // src/server/providers/auto-config.ts
10
10
  var NON_THINKING_COMBOS = [
@@ -186,4 +186,4 @@ async function autoConfig(input) {
186
186
  export {
187
187
  autoConfig
188
188
  };
189
- //# sourceMappingURL=auto-config-T5GR2N6X.js.map
189
+ //# sourceMappingURL=auto-config-AAUO4PKW.js.map
@@ -2,9 +2,9 @@ import {
2
2
  getBackendCapabilities,
3
3
  getBackendDisplayName
4
4
  } from "./chunk-AZHWLLPP.js";
5
- import "./chunk-5WRI5ZAA.js";
5
+ import "./chunk-YLJ4XMA6.js";
6
6
  export {
7
7
  getBackendCapabilities,
8
8
  getBackendDisplayName
9
9
  };
10
- //# sourceMappingURL=backend-LVYHLGQJ.js.map
10
+ //# sourceMappingURL=backend-67OLCS5O.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  logger
6
6
  } from "./chunk-K44MW7JJ.js";
7
- import "./chunk-5WRI5ZAA.js";
7
+ import "./chunk-YLJ4XMA6.js";
8
8
 
9
9
  // src/server/branch.api.ts
10
10
  import { spawn } from "child_process";
@@ -51,4 +51,4 @@ function getGitBranch(cwd) {
51
51
  export {
52
52
  getCurrentBranch
53
53
  };
54
- //# sourceMappingURL=branch.api-XVTYACSH.js.map
54
+ //# sourceMappingURL=branch.api-UMKSQMSA.js.map
@@ -0,0 +1,63 @@
1
+ import "./chunk-YLJ4XMA6.js";
2
+
3
+ // src/server/utils/changelog.ts
4
+ var VERSION_HEADING_RE = /^##\s+\[?(\d+\.\d+\.\d+)\]?(?:\s+-.*)?$/;
5
+ function parseVersion(version) {
6
+ const parts = version.split(".");
7
+ if (parts.length !== 3) return null;
8
+ const nums = parts.map((part) => Number(part));
9
+ if (nums.some((num) => !Number.isInteger(num))) return null;
10
+ return nums;
11
+ }
12
+ function isValidVersion(version) {
13
+ return parseVersion(version) !== null;
14
+ }
15
+ function gtVersion(a, b) {
16
+ const pa = parseVersion(a);
17
+ const pb = parseVersion(b);
18
+ if (!pa || !pb) return false;
19
+ for (let i = 0; i < 3; i++) {
20
+ const x = pa[i];
21
+ const y = pb[i];
22
+ if (x !== y) return x > y;
23
+ }
24
+ return false;
25
+ }
26
+ function parseVersionHeading(line) {
27
+ const match = VERSION_HEADING_RE.exec(line.trimEnd());
28
+ return match ? match[1] ?? null : null;
29
+ }
30
+ function trimChangelog(content, since) {
31
+ if (!since || !isValidVersion(since)) return content;
32
+ const lines = content.split("\n");
33
+ let i = 0;
34
+ const header = [];
35
+ for (; i < lines.length; i++) {
36
+ const line = lines[i];
37
+ if (line.startsWith("## ")) break;
38
+ header.push(line);
39
+ }
40
+ const sections = [];
41
+ let current = null;
42
+ for (; i < lines.length; i++) {
43
+ const line = lines[i];
44
+ if (line.startsWith("## ")) {
45
+ current = { heading: line, body: [] };
46
+ sections.push(current);
47
+ } else if (current) {
48
+ current.body.push(line);
49
+ }
50
+ }
51
+ const kept = sections.filter((section) => {
52
+ const version = parseVersionHeading(section.heading);
53
+ return version === null || gtVersion(version, since);
54
+ });
55
+ if (kept.length === 0) return header.join("\n").trimEnd();
56
+ const parts = [header.join("\n"), ...kept.map((section) => [section.heading, ...section.body].join("\n"))];
57
+ return parts.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd();
58
+ }
59
+ export {
60
+ parseVersionHeading,
61
+ trimChangelog
62
+ };
63
+ //# sourceMappingURL=changelog-FZUE6OSG.js.map
@@ -2,14 +2,14 @@ import {
2
2
  buildRunChatTurnParams,
3
3
  finalizeTurnCompletion,
4
4
  generateSessionNameForSession
5
- } from "./chunk-TGLVWAFC.js";
5
+ } from "./chunk-6XHDNSA3.js";
6
6
  import {
7
7
  runChatTurn
8
- } from "./chunk-3NPLERPQ.js";
9
- import "./chunk-JFK4GKQD.js";
10
- import "./chunk-TFF5T3K3.js";
8
+ } from "./chunk-I6MY65LO.js";
9
+ import "./chunk-2PQA3DHY.js";
10
+ import "./chunk-3PEYTWCS.js";
11
11
  import "./chunk-2FCLCUVR.js";
12
- import "./chunk-YX3OQBNX.js";
12
+ import "./chunk-EQ7DK2TG.js";
13
13
  import "./chunk-27NABDXB.js";
14
14
  import "./chunk-M6X6AIEG.js";
15
15
  import "./chunk-ZTOG6LJD.js";
@@ -18,18 +18,18 @@ import "./chunk-JE7LW7Y6.js";
18
18
  import "./chunk-OAN4BXEW.js";
19
19
  import "./chunk-O6DU226D.js";
20
20
  import "./chunk-J7GAZGZT.js";
21
- import "./chunk-6RGACY4E.js";
22
- import "./chunk-OCSTEGK7.js";
23
- import "./chunk-6KPJLELC.js";
21
+ import "./chunk-HZSKKJHQ.js";
22
+ import "./chunk-EQ5CGNOT.js";
23
+ import "./chunk-QQVPUZQB.js";
24
24
  import {
25
25
  getEventStore
26
- } from "./chunk-ERNWAKUB.js";
27
- import "./chunk-VWEATA7R.js";
26
+ } from "./chunk-TGVDUK4N.js";
27
+ import "./chunk-KLQEL2DZ.js";
28
28
  import {
29
29
  createChatMessageMessage,
30
30
  createPhaseChangedMessage,
31
31
  createSessionRunningMessage
32
- } from "./chunk-I7FY2LTR.js";
32
+ } from "./chunk-4GHLULHB.js";
33
33
  import "./chunk-AESOGRFK.js";
34
34
  import "./chunk-JURM3RPZ.js";
35
35
  import "./chunk-JLAR2CMV.js";
@@ -38,10 +38,10 @@ import "./chunk-LCLH6ZUL.js";
38
38
  import "./chunk-LNNBLB6G.js";
39
39
  import "./chunk-OSXPQSLW.js";
40
40
  import "./chunk-3PG65AXG.js";
41
- import "./chunk-BVVCRIVM.js";
41
+ import "./chunk-GZTMCTUS.js";
42
42
  import "./chunk-J2GP3J3X.js";
43
- import "./chunk-JGWHRYWG.js";
44
- import "./chunk-V4IE7HJY.js";
43
+ import "./chunk-MKWS7TQH.js";
44
+ import "./chunk-W7VIYHPQ.js";
45
45
  import "./chunk-AZHWLLPP.js";
46
46
  import "./chunk-HNCM3D7Y.js";
47
47
  import "./chunk-TOKQ2UVG.js";
@@ -49,10 +49,10 @@ import "./chunk-LTYL6ZGH.js";
49
49
  import "./chunk-HD6Y77RO.js";
50
50
  import "./chunk-5PT4UMRR.js";
51
51
  import "./chunk-K44MW7JJ.js";
52
- import "./chunk-X25Q6RAV.js";
52
+ import "./chunk-ZKLE2Q3I.js";
53
53
  import "./chunk-KSXCOHHW.js";
54
54
  import "./chunk-CQGTEGKL.js";
55
- import "./chunk-5WRI5ZAA.js";
55
+ import "./chunk-YLJ4XMA6.js";
56
56
 
57
57
  // src/server/session/chat-handler.ts
58
58
  var activeAgents = /* @__PURE__ */ new Map();
@@ -173,4 +173,4 @@ export {
173
173
  startChatSession,
174
174
  stopSessionExecution
175
175
  };
176
- //# sourceMappingURL=chat-handler-5SP265CR.js.map
176
+ //# sourceMappingURL=chat-handler-URSNELCE.js.map
@@ -14,7 +14,7 @@ import {
14
14
  createToolCallEvent,
15
15
  createToolResultEvent,
16
16
  streamLLMPure
17
- } from "./chunk-YX3OQBNX.js";
17
+ } from "./chunk-EQ7DK2TG.js";
18
18
  import {
19
19
  COMPACTION_PROMPT,
20
20
  buildBasePrompt,
@@ -57,29 +57,29 @@ import {
57
57
  getGateConfig,
58
58
  isTaskConflictError,
59
59
  isTaskGateError
60
- } from "./chunk-6RGACY4E.js";
60
+ } from "./chunk-HZSKKJHQ.js";
61
61
  import {
62
62
  getSessionDisabledServers
63
- } from "./chunk-OCSTEGK7.js";
63
+ } from "./chunk-EQ5CGNOT.js";
64
64
  import {
65
65
  PathAccessDeniedError,
66
66
  extractAbsolutePathsFromCommand,
67
67
  extractSensitivePathsFromCommand,
68
68
  registerPathConfirmation,
69
69
  requestPathAccess
70
- } from "./chunk-6KPJLELC.js";
70
+ } from "./chunk-QQVPUZQB.js";
71
71
  import {
72
72
  getCurrentContextWindowId,
73
73
  getCurrentWindowMessageOptions,
74
74
  getEventStore
75
- } from "./chunk-ERNWAKUB.js";
75
+ } from "./chunk-TGVDUK4N.js";
76
76
  import {
77
77
  createChatDoneMessage,
78
78
  createChatMessageMessage,
79
79
  createChatMessageUpdatedMessage,
80
80
  createChatPathConfirmationMessage,
81
81
  createQueueStateMessage
82
- } from "./chunk-I7FY2LTR.js";
82
+ } from "./chunk-4GHLULHB.js";
83
83
  import {
84
84
  AskUserInterrupt,
85
85
  askUserTool
@@ -105,7 +105,7 @@ import {
105
105
  } from "./chunk-LNNBLB6G.js";
106
106
  import {
107
107
  modelSupportsVision
108
- } from "./chunk-V4IE7HJY.js";
108
+ } from "./chunk-W7VIYHPQ.js";
109
109
  import {
110
110
  OUTPUT_LIMITS,
111
111
  cacheSet,
@@ -144,7 +144,7 @@ async function requestUserConfirmation(context, toolLabel, desc) {
144
144
  if (context.dangerLevel === "dangerous") return Promise.resolve(true);
145
145
  if (toolLabel === "workspace" || toolLabel === "command") {
146
146
  try {
147
- const { getSetting: getSetting2, SETTINGS_KEYS: SETTINGS_KEYS2 } = await import("./settings-2AHDKCD7.js");
147
+ const { getSetting: getSetting2, SETTINGS_KEYS: SETTINGS_KEYS2 } = await import("./settings-FGXQHKUH.js");
148
148
  if (getSetting2(SETTINGS_KEYS2.CONFIRM_ON_WORKSPACE_ACTIONS) !== "true") {
149
149
  return Promise.resolve(true);
150
150
  }
@@ -1103,6 +1103,7 @@ function hasTopLevelStatementSeparator(command) {
1103
1103
  continue;
1104
1104
  }
1105
1105
  if (ch === ";" || ch === "\n") return true;
1106
+ if ((ch === "&" || ch === "|") && command[i + 1] === ch) return true;
1106
1107
  }
1107
1108
  return false;
1108
1109
  }
@@ -1593,7 +1594,7 @@ async function executeTools(assistantMsgId, toolCalls, ctx, append) {
1593
1594
  data: { callId: error.callId, question: error.question, type: error.type, options: error.options }
1594
1595
  });
1595
1596
  append(createChatDoneEvent(assistantMsgId, "waiting_for_user"));
1596
- const { awaitAnswer } = await import("./ask-ZYPCJKZD.js");
1597
+ const { awaitAnswer } = await import("./ask-UBIRH3SO.js");
1597
1598
  const answerPromise = awaitAnswer(error.callId);
1598
1599
  if (!answerPromise) {
1599
1600
  throw new Error(`No pending question found for callId: ${error.callId}`);
@@ -1903,6 +1904,7 @@ ${CONTINUE_PROMPT}` : CONTINUE_PROMPT;
1903
1904
  signal,
1904
1905
  subAgentAliases,
1905
1906
  ...config.retryPatterns ? { retryPatterns: config.retryPatterns } : {},
1907
+ ...config.suppressChatError ? { suppressChatError: true } : {},
1906
1908
  ...modelSettings && { modelSettings }
1907
1909
  });
1908
1910
  const result = await consumeStreamGenerator(streamGen, (event) => {
@@ -1950,22 +1952,35 @@ ${CONTINUE_PROMPT}` : CONTINUE_PROMPT;
1950
1952
  emitPartialDoneEvents(sessionId, assistantMsgId, statsIdentity, mode, turnMetrics, append, agentType);
1951
1953
  throw new Error("Aborted");
1952
1954
  }
1953
- turnMetrics.addLLMCall(
1954
- result.timing,
1955
- result.usage.promptTokens,
1956
- result.usage.completionTokens,
1957
- previousContextTokens,
1958
- result.modelParams
1959
- );
1960
- sessionManager.setCurrentContextSize(
1961
- sessionId,
1962
- result.usage.promptTokens,
1963
- result.usage.completionTokens,
1964
- config.subAgentMetadata?.subAgentId
1965
- );
1955
+ if (result.error) {
1956
+ const stats2 = turnMetrics.buildStats(statsIdentity, mode);
1957
+ append(
1958
+ createMessageDoneEvent(assistantMsgId, {
1959
+ segments: result.segments,
1960
+ stats: stats2
1961
+ })
1962
+ );
1963
+ append(createChatDoneEvent(assistantMsgId, "error", stats2, agentType));
1964
+ return { failed: { error: result.error } };
1965
+ }
1966
+ if (!result.error) {
1967
+ turnMetrics.addLLMCall(
1968
+ result.timing,
1969
+ result.usage.promptTokens,
1970
+ result.usage.completionTokens,
1971
+ previousContextTokens,
1972
+ result.modelParams
1973
+ );
1974
+ sessionManager.setCurrentContextSize(
1975
+ sessionId,
1976
+ result.usage.promptTokens,
1977
+ result.usage.completionTokens,
1978
+ config.subAgentMetadata?.subAgentId
1979
+ );
1980
+ }
1966
1981
  if (!compacting) {
1967
1982
  const contextState2 = sessionManager.getContextState(sessionId);
1968
- const { shouldCompact, appendCompactionPrompt } = await import("./compactor-SKVC2VNL.js");
1983
+ const { shouldCompact, appendCompactionPrompt } = await import("./compactor-LAXZLPPA.js");
1969
1984
  if (shouldCompact(
1970
1985
  contextState2.currentTokens,
1971
1986
  contextState2.maxTokens,
@@ -2115,7 +2130,9 @@ ${COMPACTION_PROMPT}`,
2115
2130
  emitPartialDoneEvents(sessionId, assistantMsgId, statsIdentity, mode, turnMetrics, append, agentType);
2116
2131
  throw new Error("Aborted");
2117
2132
  }
2118
- void drainQueue(sessionManager, sessionId, append, onMessage);
2133
+ if (!config.subAgentMetadata) {
2134
+ void drainQueue(sessionManager, sessionId, append, onMessage);
2135
+ }
2119
2136
  retryLimiter.reset();
2120
2137
  continue;
2121
2138
  }
@@ -2335,7 +2352,7 @@ async function describeImageFromDataUrl(dataUrl, visionModel, options) {
2335
2352
  // src/server/context/image-processor.ts
2336
2353
  async function loadVisionModelFromGlobalConfig() {
2337
2354
  try {
2338
- const { loadGlobalConfig: loadGlobalConfig2, resolveVisionFallback } = await import("./config-EAB3V4QK.js");
2355
+ const { loadGlobalConfig: loadGlobalConfig2, resolveVisionFallback } = await import("./config-TUCHLIWD.js");
2339
2356
  const runtimeConfig = getRuntimeConfig();
2340
2357
  const mode = runtimeConfig.mode ?? "production";
2341
2358
  const globalConfig = await loadGlobalConfig2(mode);
@@ -2953,7 +2970,7 @@ var callSubAgentTool = {
2953
2970
  };
2954
2971
  }
2955
2972
  try {
2956
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-QYYNFMGU.js");
2973
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-2Q3GRECI.js");
2957
2974
  const toolRegistry = getToolRegistryForAgent2(agentDef);
2958
2975
  const turnMetrics = new TurnMetrics();
2959
2976
  const result = await executeSubAgent({
@@ -3975,7 +3992,7 @@ var mcpConfigTool = createTool(
3975
3992
  mcpNotifyChanged?.(sessionId);
3976
3993
  }
3977
3994
  async function rebuildTools() {
3978
- const { setMcpTools: setMcpTools2 } = await import("./tools-QYYNFMGU.js");
3995
+ const { setMcpTools: setMcpTools2 } = await import("./tools-2Q3GRECI.js");
3979
3996
  const mcpTools = createMcpTools(mcpManagerForTools);
3980
3997
  setMcpTools2(mcpTools);
3981
3998
  }
@@ -4400,33 +4417,20 @@ function getTasksService() {
4400
4417
  }
4401
4418
  return tasksService;
4402
4419
  }
4403
- var VALID_ACTIONS = [
4404
- "list",
4405
- "get",
4406
- "create",
4407
- "edit",
4408
- "move",
4409
- "set_gate_value",
4410
- "set_gates",
4411
- "duplicate",
4412
- "delete",
4413
- "reorder"
4414
- ];
4420
+ var VALID_ACTIONS = ["list", "create", "edit", "move", "set_gate_value", "delete"];
4421
+ var LIST_STATUSES = ["todo", "in_progress", "done", "all"];
4415
4422
  var projectTasksTool = createTool(
4416
4423
  "project_tasks",
4417
4424
  {
4418
4425
  type: "function",
4419
4426
  function: {
4420
4427
  name: "project_tasks",
4421
- description: "Work with the project task board \u2014 the kanban of tasks owned by this project. Provides full parity with the human UI: list, get, create, edit, move, fill gate values, set gate configuration, duplicate, delete, and reorder.\n\nRules:\n- Moving a task to in_progress binds it to YOUR current session (you never create a new session for it).\n- Entering 'done' is blocked by unmet column gates (definition of done). When blocked, the error lists the missing fields; set them with action=set_gate_value (filling proof/evidence as part of your work), then retry the move.\n- All transitions are serialized server-side. If another actor changed the task, you get a CONFLICT error: re-list and retry.\n\nActions:\n- list: list all tasks (with gate values, status, queue position, bound session, audit trail)\n- get: fetch a single task (taskId)\n- create: create a task in To Do (prompt must contain text or an attachment)\n- edit: update prompt/attachments/agent/model (taskId + any fields)\n- move: change state \u2014 to: 'todo' | 'in_progress' | 'done' (optional reason for reverts)\n- set_gate_value: fill a gate field (taskId, gateId, value)\n- set_gates: replace the project gate configuration (gates: array of {id, name, description, required, variant})\n- duplicate: copy a task into To Do (taskId)\n- delete: permanently delete a task (taskId). Sessions stay untouched.\n- reorder: move a task to an index within its column (taskId, status, index)",
4428
+ description: "Kanban task board for this project. Core loop: list \u2192 move \u2192 set_gate_value.\n\nRules:\n- Moving to in_progress binds the task to YOUR current session.\n- Moving to done is blocked by unmet gates: the error names the missing fields \u2014 fill them via set_gate_value (that's part of the work), then retry the move.\n- Stale writes fail with CONFLICT \u2014 re-list and retry.\n\nActions:\n- list: tasks (status, gate values, queue position, bound session, audit trail); defaults to open tasks, filter via status (todo | in_progress | done | all)\n- create: add a task to To Do (prompt required)\n- edit: update prompt/attachments/agent/model (taskId + fields)\n- move: change column (to: todo | in_progress | done; optional reason)\n- set_gate_value: fill a gate field (taskId, gateId, value)\n- delete: remove a task (taskId)",
4422
4429
  parameters: {
4423
4430
  type: "object",
4424
4431
  properties: {
4425
4432
  action: { type: "string", enum: VALID_ACTIONS, description: "The action to perform" },
4426
- taskId: {
4427
- type: "string",
4428
- description: "Target task id (get, edit, move, set_gate_value, duplicate, delete, reorder)"
4429
- },
4433
+ taskId: { type: "string", description: "Target task id (edit, move, set_gate_value, delete)" },
4430
4434
  prompt: { type: "string", description: "The prompt/instruction executed when the task launches" },
4431
4435
  attachments: { type: "array", description: "Optional attachments (same shape as chat attachments)" },
4432
4436
  agentId: { type: "string", description: "Selected agent id" },
@@ -4436,15 +4440,14 @@ var projectTasksTool = createTool(
4436
4440
  reason: { type: "string", description: "Optional short reason (recorded in the audit trail) for reverts" },
4437
4441
  gateId: { type: "string", description: "Gate field id for set_gate_value" },
4438
4442
  value: { type: "string", description: "Proof/evidence value for set_gate_value" },
4439
- gates: {
4440
- type: "array",
4441
- description: "Full replacement gate config: [{id, name, description, required, variant}]"
4443
+ status: {
4444
+ type: "string",
4445
+ enum: ["todo", "in_progress", "done", "all"],
4446
+ description: "Column filter for action=list (default: open tasks)"
4442
4447
  },
4443
- status: { type: "string", enum: ["todo", "in_progress", "done"], description: "Column for reorder" },
4444
- index: { type: "number", description: "Zero-based target index within the column (reorder)" },
4445
4448
  expectedVersion: {
4446
4449
  type: "number",
4447
- description: "Optimistic concurrency guard \u2014 pass the task version you saw; stale writes fail with CONFLICT"
4450
+ description: "Task version from your last read; stale writes fail with CONFLICT"
4448
4451
  }
4449
4452
  },
4450
4453
  required: ["action"]
@@ -4463,15 +4466,16 @@ var projectTasksTool = createTool(
4463
4466
  try {
4464
4467
  switch (action) {
4465
4468
  case "list": {
4469
+ const status = args.status;
4470
+ if (status !== void 0 && !LIST_STATUSES.includes(status)) {
4471
+ return helpers.error(
4472
+ `Invalid "status" filter for action=list: "${String(status)}". Expected one of: todo, in_progress, done, all.`
4473
+ );
4474
+ }
4466
4475
  const tasks = svc.list(projectId);
4476
+ const filtered = status === "all" ? tasks : tasks.filter((t) => status === void 0 ? t.status !== "done" : t.status === status);
4467
4477
  const gates = getGateConfig(projectId);
4468
- return helpers.success(JSON.stringify({ gates, tasks: tasks.map((t) => taskForAgent(t)) }, null, 2));
4469
- }
4470
- case "get": {
4471
- if (!args.taskId) return helpers.error('Parameter "taskId" is required for action=get');
4472
- const task = svc.get(projectId, args.taskId);
4473
- if (!task) return helpers.error(`Task not found: ${args.taskId}`);
4474
- return helpers.success(JSON.stringify(taskForAgent(task), null, 2));
4478
+ return helpers.success(JSON.stringify({ gates, tasks: filtered.map((t) => taskForAgent(t)) }, null, 2));
4475
4479
  }
4476
4480
  case "create": {
4477
4481
  const task = svc.create(
@@ -4532,19 +4536,6 @@ var projectTasksTool = createTool(
4532
4536
  );
4533
4537
  return helpers.success(JSON.stringify(taskForAgent(result.task), null, 2));
4534
4538
  }
4535
- case "set_gates": {
4536
- if (!Array.isArray(args.gates)) {
4537
- return helpers.error('Parameter "gates" (array) is required for action=set_gates');
4538
- }
4539
- const gates = sanitizeGates(args.gates);
4540
- svc.setGateConfig(projectId, gates, actor);
4541
- return helpers.success(JSON.stringify({ gates }, null, 2));
4542
- }
4543
- case "duplicate": {
4544
- if (!args.taskId) return helpers.error('Parameter "taskId" is required for action=duplicate');
4545
- const task = svc.duplicate(projectId, args.taskId, actor);
4546
- return helpers.success(JSON.stringify(taskForAgent(task), null, 2));
4547
- }
4548
4539
  case "delete": {
4549
4540
  if (!args.taskId) return helpers.error('Parameter "taskId" is required for action=delete');
4550
4541
  const task = svc.get(projectId, args.taskId);
@@ -4558,14 +4549,6 @@ var projectTasksTool = createTool(
4558
4549
  )
4559
4550
  );
4560
4551
  }
4561
- case "reorder": {
4562
- if (!args.taskId) return helpers.error('Parameter "taskId" is required for action=reorder');
4563
- if (!args.status || args.index === void 0) {
4564
- return helpers.error('Parameters "status" and "index" are required for action=reorder');
4565
- }
4566
- const task = svc.reorder(projectId, args.taskId, args.status, args.index);
4567
- return helpers.success(JSON.stringify(taskForAgent(task), null, 2));
4568
- }
4569
4552
  default:
4570
4553
  return helpers.error(`Unknown action: ${String(action)}`);
4571
4554
  }
@@ -4611,18 +4594,6 @@ function sanitizeAttachments(raw) {
4611
4594
  (a) => typeof a === "object" && a !== null && typeof a.id === "string" && typeof a.filename === "string"
4612
4595
  );
4613
4596
  }
4614
- function sanitizeGates(raw) {
4615
- return raw.map((g, i) => {
4616
- const gate = g;
4617
- return {
4618
- id: typeof gate.id === "string" && gate.id ? gate.id : `gate_${i}`,
4619
- name: typeof gate.name === "string" && gate.name ? gate.name : `Gate ${i + 1}`,
4620
- description: typeof gate.description === "string" ? gate.description : "",
4621
- required: gate.required !== false,
4622
- variant: gate.variant === "ready" ? "ready" : "done"
4623
- };
4624
- });
4625
- }
4626
4597
 
4627
4598
  // src/server/tools/index.ts
4628
4599
  var _builtInTools;
@@ -4905,4 +4876,4 @@ export {
4905
4876
  getToolRegistryForAgent,
4906
4877
  createToolRegistry
4907
4878
  };
4908
- //# sourceMappingURL=chunk-JFK4GKQD.js.map
4879
+ //# sourceMappingURL=chunk-2PQA3DHY.js.map
@@ -105,7 +105,7 @@ function resolveAgentDef(sessionManager, sessionId) {
105
105
  }
106
106
  async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName) {
107
107
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
108
- const { getToolRegistryForAgent } = await import("./tools-QYYNFMGU.js");
108
+ const { getToolRegistryForAgent } = await import("./tools-2Q3GRECI.js");
109
109
  const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
110
110
  const toolFingerprint = getToolFingerprint(tools);
111
111
  const allAgents = await loadAllAgentsDefault(sessionManager.getProjectWorkdir(sessionId));
@@ -124,7 +124,7 @@ async function buildCachedPrompt(sessionManager, sessionId, agentDef, modelName)
124
124
  async function computeSessionHash(sessionManager, sessionId, modelName) {
125
125
  const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
126
126
  const agentDef = await resolveAgentDef(sessionManager, sessionId);
127
- const { getToolRegistryForAgent } = await import("./tools-QYYNFMGU.js");
127
+ const { getToolRegistryForAgent } = await import("./tools-2Q3GRECI.js");
128
128
  const tools = getToolRegistryForAgent(agentDef, sessionId).definitions;
129
129
  const toolFingerprint = getToolFingerprint(tools);
130
130
  return computeDynamicContextHash(instructionContent, skills, toolFingerprint, modelName);
@@ -148,4 +148,4 @@ export {
148
148
  computeSessionHash,
149
149
  applyDynamicContext
150
150
  };
151
- //# sourceMappingURL=chunk-TFF5T3K3.js.map
151
+ //# sourceMappingURL=chunk-3PEYTWCS.js.map