@tea-agent/loop-agent 0.44.0-next.11 → 0.44.0-next.13

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 (132) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/build-stamp.json +3 -3
  3. package/dist/commands/init.js +1 -0
  4. package/dist/executors/dag-pi-executor.js +11 -6
  5. package/dist/executors/pi-writer-tool-policy.js +60 -4
  6. package/dist/executors/playwright-cli-launcher.js +31 -45
  7. package/dist/executors/shell-executor.js +39 -11
  8. package/dist/executors/shell-write-guard.js +24 -67
  9. package/dist/governance/exec-plans.js +10 -1
  10. package/dist/task/config-types.js +4 -2
  11. package/dist/task/source-prepare/build-draft.js +1 -0
  12. package/dist/task/source-prepare/path-policy.js +17 -7
  13. package/dist/worker/console/chat/browser-automation.js +343 -38
  14. package/dist/worker/console/chat/browser-content.js +74 -0
  15. package/dist/worker/console/chat/browser-diagnostics.js +250 -0
  16. package/dist/worker/console/chat/browser-evaluation.js +58 -0
  17. package/dist/worker/console/chat/browser-operation-queue.js +19 -0
  18. package/dist/worker/console/chat/browser-pick.js +113 -0
  19. package/dist/worker/console/chat/browser-routes.js +33 -5
  20. package/dist/worker/console/chat/browser-screenshot-result.js +47 -0
  21. package/dist/worker/console/chat/browser-storage.js +89 -0
  22. package/dist/worker/console/chat/pi-runtime/custom-tools/browser-tools.js +125 -174
  23. package/dist/worker/console/chat/pi-runtime.js +1 -1
  24. package/dist/worker/console/chat/repo-browser.js +80 -2
  25. package/dist/worker/console/chat/repo-preview-kind.js +155 -0
  26. package/dist/worker/console/chat/session-mode.js +1 -1
  27. package/dist/worker/console/chat/session-store.js +4 -2
  28. package/dist/worker/console/chat/tools.js +12 -0
  29. package/dist/worker/console/routes.js +5 -0
  30. package/dist/worker/console/static/app-icon.svg +39 -0
  31. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-r1NAPU_5.js → abnfDiagram-N423BO3Z-BA7qCL_r.js} +1 -1
  32. package/dist/worker/console/static/assets/{arc-dT5T4sVL.js → arc-Df09ajwL.js} +1 -1
  33. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CP_cOq46.js → architectureDiagram-T3A2C74G-CpF9sw5R.js} +1 -1
  34. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-sToEZxEf.js → blockDiagram-VBNYF7ZC-BtPys8ja.js} +1 -1
  35. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DSxwwi2m.js → c4Diagram-5PPSVZJV-DZPnTWqT.js} +1 -1
  36. package/dist/worker/console/static/assets/channel-DiTNLZUm.js +1 -0
  37. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-B9fh0IkF.js → chunk-2GRJ4B5K-BD9D4h1p.js} +1 -1
  38. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-CAUNl-A6.js → chunk-2Q5K7J3B-Svn8yBmn.js} +1 -1
  39. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BomeqbNX.js → chunk-5RXB4S5H-B8EbQj-S.js} +1 -1
  40. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BNAuTOLE.js → chunk-5VM5RSS4-tENZpcpF.js} +1 -1
  41. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DfzjRD5y.js → chunk-6Q2QTUOP-DBx71Lco.js} +1 -1
  42. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-C3uE-yc2.js → chunk-GF5L2VYU-1v_QamMz.js} +1 -1
  43. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-C3sQMMYr.js → chunk-JWPE2WC7-BAMCNNBG.js} +1 -1
  44. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-D_AtEYQL.js → chunk-KBJHAD2P-BvuEury-.js} +1 -1
  45. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DW4TwhKv.js → chunk-RYQCIY6F-YqFuHp8s.js} +1 -1
  46. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-CTQDmJcp.js → chunk-XXDRQBXY-ouI5T7Mr.js} +1 -1
  47. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DgL8aiyZ.js +1 -0
  48. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DgL8aiyZ.js +1 -0
  49. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-iMqPuBsL.js → cose-bilkent-JH36ORCC-Bri0_Izk.js} +1 -1
  50. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-DktIuDWs.js → cynefin-VYW2F7L2-e8Vhhi4X.js} +1 -1
  51. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-BgVnjyEs.js → cynefinDiagram-MW4NZA55-tSIXGQiJ.js} +1 -1
  52. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CR25E4bu.js → dagre-VZM6K2ZE-Rl-sF5pt.js} +1 -1
  53. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-CPM2h5HY.js → diagram-7IWD3JNH-Db6ddPz8.js} +1 -1
  54. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-DqF0x2g1.js → diagram-B4RE2ZJO-Jwd_Xw5S.js} +1 -1
  55. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-G8BYp2eb.js → diagram-LBJQPF4R-CeC_8InC.js} +1 -1
  56. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-BbC4kT_D.js → diagram-Q27KOJAE-LKPRaNq8.js} +1 -1
  57. package/dist/worker/console/static/assets/{diagram-UB23O5K3-CKZwZ-G5.js → diagram-UB23O5K3-DlVQytMW.js} +1 -1
  58. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-kJDmheia.js → ebnfDiagram-BXEA7PRR-DnfJZwO-.js} +1 -1
  59. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DFTVHyxB.js → erDiagram-JOGREHBK-3axVSXca.js} +1 -1
  60. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BqdN5_os.js → flowDiagram-UKHOOZJN-xe04-_L-.js} +1 -1
  61. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-SYDjVakh.js → ganttDiagram-PKOTCBZU-hpmRINiD.js} +1 -1
  62. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Bf8bNpGA.js → gitGraphDiagram-DS77QQ5N-6HSNz9Ko.js} +1 -1
  63. package/dist/worker/console/static/assets/index-C_8_gWal.css +1 -0
  64. package/dist/worker/console/static/assets/{index-CTMZsDmh.js → index-DybcVXCu.js} +102 -100
  65. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DIeAmJ45.js → infoDiagram-6WML65LV-BF6ksWTX.js} +1 -1
  66. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-oikqUAlo.js → ishikawaDiagram-WSZJBQD7-DXisdeD7.js} +1 -1
  67. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-mKEF_xYT.js → journeyDiagram-NVQOT4AX-BWu65wmu.js} +1 -1
  68. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BdWJHPnN.js → kanban-definition-27J2QSJJ-hfNhHqAI.js} +1 -1
  69. package/dist/worker/console/static/assets/{linear-DGRlieMH.js → linear-D6HTfQcp.js} +1 -1
  70. package/dist/worker/console/static/assets/{mermaid.core-4P9yPC9c.js → mermaid.core-Iv91R1WP.js} +5 -5
  71. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-5PTSkos6.js → mindmap-definition-FAOFIHXS-CfPChwjR.js} +1 -1
  72. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DONIFpG5.js → pegDiagram-VL7TDLO6-B7TcoqHz.js} +1 -1
  73. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-D_Z4S70M.js → pieDiagram-7S7Q4E2Y-ouyPKMtQ.js} +1 -1
  74. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CAsjh8iY.js → quadrantDiagram-CIZ2JOQS-B9tuyLbh.js} +1 -1
  75. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-Cx4Dd6ac.js → railroadDiagram-AXF67PYL-Ck4q9nJs.js} +1 -1
  76. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-cQb7mwyH.js → requirementDiagram-LRYGKXZP-wXLX5Dnp.js} +1 -1
  77. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Cd-DhUdf.js → sankeyDiagram-W5VNT64P-D2XWw6_m.js} +1 -1
  78. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-AlKYRgIk.js → sequenceDiagram-SI44F4Z6-DzxKiug4.js} +1 -1
  79. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CUy_ET4e.js → sizeCapture-X5ZJPWSS-DWUqK5Us.js} +1 -1
  80. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-CTuVe6Sa.js → stateDiagram-OKZ733FA-D5Pa4O5g.js} +1 -1
  81. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-C0QIbqO4.js +1 -0
  82. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-ChFLJb-v.js → swimlanes-SLNWSIFB-VH7cRnsJ.js} +2 -2
  83. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BB9CzRHB.js +8 -0
  84. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-DZZeiAPr.js → timeline-definition-Z64GVDOM-C4HM5NoZ.js} +1 -1
  85. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-t4O91cZU.js → vennDiagram-T6HMQDX7-Bu-4hOlA.js} +1 -1
  86. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-CV5qGHZu.js → wardleyDiagram-T6FBY63Y-CasFEvvl.js} +1 -1
  87. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-DyXbytUI.js → xychartDiagram-ELKLHX3M-D-gpwPSA.js} +1 -1
  88. package/dist/worker/console/static/index.html +5 -2
  89. package/dist/worker/console/static/manifest.webmanifest +19 -0
  90. package/dist/worker/console/static-src/operator-chat/open-preview-in-browser.js +57 -9
  91. package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +6 -0
  92. package/dist/worker/console/workspace-context.js +1 -0
  93. package/dist/worker/materialize/harness-task-lineage.js +4 -2
  94. package/dist/worker/observe/static/console-theme.css +33 -29
  95. package/dist/worker/observe/static/console-theme.js +38 -0
  96. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +3 -1
  97. package/dist/workflows/dag/backend-test-layout.js +27 -7
  98. package/dist/workflows/dag/backend-test-markdown-workflow.js +3 -1
  99. package/dist/workflows/dag/frontend-repair.js +24 -0
  100. package/dist/workflows/dag/frontend-review-scopes.js +10 -2
  101. package/dist/workflows/dag/frontend-test-case-checklist.js +12 -3
  102. package/dist/workflows/dag/frontend-test-environment-probe.js +0 -2
  103. package/dist/workflows/dag/frontend-test-execution-evidence.js +163 -67
  104. package/dist/workflows/dag/frontend-test-framework-adapters.js +309 -0
  105. package/dist/workflows/dag/frontend-test-layout.js +41 -12
  106. package/dist/workflows/dag/hybrid/sources.js +21 -2
  107. package/dist/workflows/dag/hybrid/templates/backend-test.js +65 -50
  108. package/dist/workflows/dag/hybrid/templates/frontend-test.js +58 -37
  109. package/dist/workflows/dag/test-artifact-namespace.js +73 -0
  110. package/dist/workflows/dag/validate.js +22 -3
  111. package/docs/architecture/dag-execution.md +3 -3
  112. package/docs/templates/README.md +4 -4
  113. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +3 -3
  114. package/docs/templates/backend-test-dag.json +708 -708
  115. package/docs/templates/backend-test-dag.review-cases.prompt.md +3 -3
  116. package/docs/templates/frontend-test-case-checklist.md +2 -2
  117. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +7 -7
  118. package/docs/templates/frontend-test-dag.json +46 -37
  119. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +2 -2
  120. package/docs/templates/frontend-test-dag.retrospect.prompt.md +1 -1
  121. package/docs/templates/frontend-test-dag.review-cases.prompt.md +1 -1
  122. package/package.json +7 -2
  123. package/skills/fe-test-ui-scout/SKILL.md +4 -4
  124. package/skills/fe-test-ui-scout/references/ledger-schema.md +1 -1
  125. package/skills/playwright-cli/SKILL.md +1 -1
  126. package/skills/playwright-cli-case-generator/SKILL.md +4 -4
  127. package/dist/worker/console/static/assets/channel-CyBY_yGk.js +0 -1
  128. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-D5lN4E_E.js +0 -1
  129. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-D5lN4E_E.js +0 -1
  130. package/dist/worker/console/static/assets/index-B28Onmfy.css +0 -1
  131. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BsWhs8O7.js +0 -1
  132. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CJcioYGH.js +0 -8
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Repo preview kind routing — pure extension-name classification shared by
3
+ * `readRepoPreview` (server) so image/binary-container files never enter the
4
+ * UTF-8 text path.
5
+ *
6
+ * Mirrors the DSH `ui-sidebar-documentpreview` builtin split (image/index.ts
7
+ * + document/unviewable.ts) without importing its registry: loop-agent keeps
8
+ * a single JSON snapshot whose `kind` field selects the front-end branch.
9
+ */
10
+ /** Image suffixes rendered by an <img> preview (DSH IMAGE_EXTENSIONS). */
11
+ export const IMAGE_EXTENSIONS = [
12
+ "png",
13
+ "jpg",
14
+ "jpeg",
15
+ "gif",
16
+ "webp",
17
+ "bmp",
18
+ "ico",
19
+ "svg",
20
+ ];
21
+ /** Bitmap suffixes whose bytes are never read as text; SVG keeps its XML
22
+ * source readable (DSH BINARY_IMAGE_EXTENSIONS). */
23
+ export const BINARY_IMAGE_EXTENSIONS = [
24
+ "png",
25
+ "jpg",
26
+ "jpeg",
27
+ "gif",
28
+ "webp",
29
+ "bmp",
30
+ "ico",
31
+ ];
32
+ /** Known binary container suffixes with no renderer: these get the
33
+ * unsupported empty state instead of a text decode or a 415 toast
34
+ * (DSH UNVIEWABLE_BINARY_EXTENSIONS). `pdf` joins this list locally until
35
+ * the M4 PDF renderer lands; remove it there. */
36
+ export const UNVIEWABLE_BINARY_EXTENSIONS = [
37
+ // video
38
+ "mp4",
39
+ "mov",
40
+ "avi",
41
+ "mkv",
42
+ "webm",
43
+ "flv",
44
+ "wmv",
45
+ "m4v",
46
+ // audio
47
+ "mp3",
48
+ "wav",
49
+ "flac",
50
+ "ogg",
51
+ "m4a",
52
+ "aac",
53
+ "wma",
54
+ "opus",
55
+ // archives
56
+ "zip",
57
+ "gz",
58
+ "tgz",
59
+ "bz2",
60
+ "xz",
61
+ "zst",
62
+ "7z",
63
+ "rar",
64
+ "tar",
65
+ "jar",
66
+ // office documents — `key` stays out: it collides with readable key/credential text files
67
+ "doc",
68
+ "docx",
69
+ "xls",
70
+ "xlsx",
71
+ "ppt",
72
+ "pptx",
73
+ "odt",
74
+ "ods",
75
+ "odp",
76
+ "pages",
77
+ "numbers",
78
+ // executables and compiled objects
79
+ "exe",
80
+ "dll",
81
+ "so",
82
+ "dylib",
83
+ "bin",
84
+ "o",
85
+ "class",
86
+ "pyc",
87
+ "wasm",
88
+ // fonts
89
+ "ttf",
90
+ "otf",
91
+ "woff",
92
+ "woff2",
93
+ "eot",
94
+ // disk images and databases
95
+ "dmg",
96
+ "iso",
97
+ "img",
98
+ "sqlite",
99
+ "db",
100
+ // design documents and image formats without a renderer
101
+ "psd",
102
+ "ai",
103
+ "sketch",
104
+ "tiff",
105
+ "tif",
106
+ "heic",
107
+ "heif",
108
+ "avif",
109
+ // local addition: no PDF renderer yet (M4)
110
+ "pdf",
111
+ ];
112
+ const IMAGE_MEDIA_TYPES = {
113
+ png: "image/png",
114
+ jpg: "image/jpeg",
115
+ jpeg: "image/jpeg",
116
+ gif: "image/gif",
117
+ webp: "image/webp",
118
+ bmp: "image/bmp",
119
+ ico: "image/x-icon",
120
+ svg: "image/svg+xml",
121
+ };
122
+ const IMAGE_SUFFIX_SET = new Set(IMAGE_EXTENSIONS);
123
+ const UNVIEWABLE_SUFFIX_SET = new Set(UNVIEWABLE_BINARY_EXTENSIONS);
124
+ /** The lowercased final path segment (DSH documentFileName). */
125
+ export function documentFileName(path) {
126
+ const normalized = path.replaceAll("\\", "/").toLowerCase();
127
+ return normalized.slice(normalized.lastIndexOf("/") + 1);
128
+ }
129
+ /** The final dotted extension of a filename, without the leading dot.
130
+ * Empty for dotfiles like `.env` (no suffix before the dot) and names
131
+ * without any dot. */
132
+ export function fileSuffixOf(path) {
133
+ const name = documentFileName(path);
134
+ const dot = name.lastIndexOf(".");
135
+ if (dot <= 0)
136
+ return "";
137
+ return name.slice(dot + 1);
138
+ }
139
+ /** Classify a repo-relative path by its final extension: image renderers
140
+ * first, then the unviewable binary containers, everything else text. */
141
+ export function classifyRepoPreview(path) {
142
+ const suffix = fileSuffixOf(path);
143
+ if (IMAGE_SUFFIX_SET.has(suffix)) {
144
+ return { kind: "image", mediaType: IMAGE_MEDIA_TYPES[suffix] ?? "application/octet-stream" };
145
+ }
146
+ if (UNVIEWABLE_SUFFIX_SET.has(suffix)) {
147
+ return { kind: "unsupported" };
148
+ }
149
+ return { kind: "text" };
150
+ }
151
+ /** Whether an image path's bytes should never be offered as source text
152
+ * (bitmap). SVG keeps its preview/source dual mode. */
153
+ export function isBinaryImageExtension(path) {
154
+ return BINARY_IMAGE_EXTENSIONS.includes(fileSuffixOf(path));
155
+ }
@@ -74,7 +74,7 @@ export const PI_CHAT_SYSTEM_PROMPT_BASE = [
74
74
  "Use read/write/edit/bash/grep/find/ls to inspect and change the workspace. apply_patch, full-tools, shell and coding-chat are denied.",
75
75
  "Agent (Explore) is a built-in read-only subagent for path-uncertain codebase search. Do not use it for a known single-file read. Prefer safe-read/safe-grep for secret-safe probes.",
76
76
  "ask_user_question pauses for a real user answer. todo_write tracks the current work and is restored after compression; it is not a workflow auto-continue signal. The persistent terminal tool is available.",
77
- "Browser tools (navigate/search/snapshot/act/tabs/scroll/press/dialog/wait/screenshot) drive the workspace-controlled real browser shown in the Browser panel. Use refs from the latest page inspection for element actions; they never edit workspace files or execute page scripts. browser_snapshot means browser page inspection, not workspace snapshots.",
77
+ "Browser tools control the workspace-controlled real browser in an external window; the sidebar iframe is independent. Use tabId/snapshotId from the latest snapshot/find/pick for ref actions, condition waits and screenshots to verify results. browser_eval executes page JavaScript; cookies/storage tools exchange login state through app-data files. browser_snapshot inspects the page, not workspace files.",
78
78
  "Goal tools (get_goal / create_goal / update_goal) track the session's durable cross-turn objective. Create a Goal only when the user explicitly asks to start one; iterate in bounded rounds until complete or blocked.",
79
79
  "This session keeps Console compression (L0/L1/L2, sift, strict checkpoint) and existing Aimax / SDD access. Do not create tasks, run DAGs, or start requirement interviews from this session.",
80
80
  "Obey repository AGENTS.md, skills and extensions when they apply. Choosing Pi mode is not extra write authorization and does not bypass Console access control or output scrubbing.",
@@ -10,6 +10,7 @@
10
10
  * The dispatcher is the SINGLE place where a Chat tool invocation becomes an
11
11
  * operator action call. Every invocation is re-authorized here.
12
12
  */
13
+ import { omitBrowserImageData } from "./browser-screenshot-result.js";
13
14
  import path from "node:path";
14
15
  import { randomUUID } from "node:crypto";
15
16
  import { copyFile, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
@@ -830,7 +831,8 @@ export async function runChatTurn(options) {
830
831
  operationId: acceptedOperationId,
831
832
  })));
832
833
  }
833
- const resultText = safeStringifyResult(event.result);
834
+ const resultRecord = event.result && typeof event.result === "object" ? event.result : undefined;
835
+ const resultText = safeStringifyResult(event.toolName === "browser_screenshot" && resultRecord?.details ? resultRecord.details : event.result);
834
836
  pending.push(store.appendMessage(sessionId, {
835
837
  role: "tool",
836
838
  text: resultText,
@@ -926,7 +928,7 @@ export function acceptedOperationIdFromResult(toolName, result) {
926
928
  }
927
929
  function safeStringifyResult(result) {
928
930
  try {
929
- const raw = JSON.stringify(result ?? {});
931
+ const raw = JSON.stringify(result ?? {}, omitBrowserImageData);
930
932
  const { scrubbed } = scrubSecrets(raw);
931
933
  return scrubbed.length > 4000 ? `${scrubbed.slice(0, 4000)}…[truncated]` : scrubbed;
932
934
  }
@@ -68,6 +68,18 @@ export const OPERATOR_CHAT_BUILTIN_CUSTOM_TOOLS = Object.freeze([
68
68
  "browser_dialog",
69
69
  "browser_wait",
70
70
  "browser_screenshot",
71
+ "browser_reload",
72
+ "browser_back",
73
+ "browser_forward",
74
+ "browser_eval",
75
+ "browser_cookies",
76
+ "browser_storage_export",
77
+ "browser_storage_import",
78
+ "browser_find",
79
+ "browser_content",
80
+ "browser_pick",
81
+ "browser_console",
82
+ "browser_network",
71
83
  ...OPERATOR_CHAT_SQL_TOOL_CAPABILITIES.map((tool) => tool.toolId),
72
84
  ]);
73
85
  /**
@@ -38,6 +38,11 @@ function contentTypeFor(pathname) {
38
38
  return "text/css; charset=utf-8";
39
39
  if (lower.endsWith(".json"))
40
40
  return "application/json; charset=utf-8";
41
+ // A web app manifest must carry this exact type: browsers ignore the
42
+ // document (and therefore offer no install entry) when it arrives as
43
+ // application/octet-stream.
44
+ if (lower.endsWith(".webmanifest"))
45
+ return "application/manifest+json";
41
46
  if (lower.endsWith(".svg"))
42
47
  return "image/svg+xml";
43
48
  if (lower.endsWith(".png"))
@@ -0,0 +1,39 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
2
+ <title>Loop Agent App Icon</title>
3
+ <style>
4
+ .loop-ink { stroke: #26251e; }
5
+ @media (prefers-color-scheme: dark) {
6
+ .loop-ink { stroke: #f7f7f4; }
7
+ }
8
+ </style>
9
+ <defs>
10
+ <mask id="square-handoff" maskUnits="userSpaceOnUse" x="0" y="6" width="64" height="52">
11
+ <rect x="0" y="6" width="64" height="52" fill="#ffffff" />
12
+ <path
13
+ d="m31.15 32.28 2.83 3.11"
14
+ fill="none"
15
+ stroke="#000000"
16
+ stroke-linecap="round"
17
+ stroke-width="6.23"
18
+ />
19
+ </mask>
20
+ </defs>
21
+ <g transform="translate(4.8485 13.899) scale(0.56566)">
22
+ <path
23
+ class="loop-ink"
24
+ d="M12 32c0-16 16-20 28-6l17 18c11 11 27 5 27-12S68 9 57 20L39 39C28 51 12 48 12 32Z"
25
+ fill="none"
26
+ stroke-linecap="round"
27
+ stroke-linejoin="round"
28
+ stroke-width="11"
29
+ mask="url(#square-handoff)"
30
+ />
31
+ </g>
32
+ <path
33
+ d="m31.15 32.28 2.83 3.11"
34
+ fill="none"
35
+ stroke="#f54e00"
36
+ stroke-linecap="round"
37
+ stroke-width="5.37"
38
+ />
39
+ </svg>
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-DfzjRD5y.js";import{p as f}from"./chunk-JWPE2WC7-C3sQMMYr.js";import{_ as n,l as o}from"./mermaid.core-4P9yPC9c.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-DktIuDWs.js";import"./index-CTMZsDmh.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
1
+ import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-DBx71Lco.js";import{p as f}from"./chunk-JWPE2WC7-BAMCNNBG.js";import{_ as n,l as o}from"./mermaid.core-Iv91R1WP.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-e8Vhhi4X.js";import"./index-DybcVXCu.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
@@ -1 +1 @@
1
- import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-4P9yPC9c.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
1
+ import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-Iv91R1WP.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};