@ashx-j/lunr 0.2.2 → 0.2.4

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 (63) hide show
  1. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -0
  2. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  3. package/dist/builtin-extensions/ashxj-thinking.js +19 -7
  4. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  5. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  6. package/dist/builtin-extensions/pi-web-access/index.js +18 -13
  7. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  8. package/dist/builtin-extensions/pi-web-access/render-search-chrome.d.ts +2 -0
  9. package/dist/builtin-extensions/pi-web-access/render-search-chrome.d.ts.map +1 -1
  10. package/dist/builtin-extensions/pi-web-access/render-search-chrome.js +12 -0
  11. package/dist/builtin-extensions/pi-web-access/render-search-chrome.js.map +1 -1
  12. package/dist/core/extensions/types.d.ts +4 -0
  13. package/dist/core/extensions/types.d.ts.map +1 -1
  14. package/dist/core/extensions/types.js.map +1 -1
  15. package/dist/core/tools/bash.d.ts.map +1 -1
  16. package/dist/core/tools/bash.js +14 -5
  17. package/dist/core/tools/bash.js.map +1 -1
  18. package/dist/core/tools/edit.d.ts.map +1 -1
  19. package/dist/core/tools/edit.js +13 -7
  20. package/dist/core/tools/edit.js.map +1 -1
  21. package/dist/core/tools/find.d.ts.map +1 -1
  22. package/dist/core/tools/find.js +10 -5
  23. package/dist/core/tools/find.js.map +1 -1
  24. package/dist/core/tools/grep.d.ts.map +1 -1
  25. package/dist/core/tools/grep.js +10 -5
  26. package/dist/core/tools/grep.js.map +1 -1
  27. package/dist/core/tools/ls.d.ts.map +1 -1
  28. package/dist/core/tools/ls.js +10 -3
  29. package/dist/core/tools/ls.js.map +1 -1
  30. package/dist/core/tools/read.d.ts.map +1 -1
  31. package/dist/core/tools/read.js +24 -15
  32. package/dist/core/tools/read.js.map +1 -1
  33. package/dist/core/tools/render-utils.d.ts +21 -0
  34. package/dist/core/tools/render-utils.d.ts.map +1 -1
  35. package/dist/core/tools/render-utils.js +32 -0
  36. package/dist/core/tools/render-utils.js.map +1 -1
  37. package/dist/core/tools/write.d.ts.map +1 -1
  38. package/dist/core/tools/write.js +19 -4
  39. package/dist/core/tools/write.js.map +1 -1
  40. package/dist/gateway/commands.d.ts.map +1 -1
  41. package/dist/gateway/commands.js +1 -0
  42. package/dist/gateway/commands.js.map +1 -1
  43. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  44. package/dist/modes/interactive/components/settings-selector.js +5 -5
  45. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  46. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  47. package/dist/modes/interactive/components/thinking-selector.js +5 -5
  48. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  49. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  50. package/dist/modes/interactive/components/tool-execution.js +16 -4
  51. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  52. package/docs/keybindings.md +1 -1
  53. package/docs/quickstart.md +1 -1
  54. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  55. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  56. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  57. package/examples/extensions/gondolin/package-lock.json +2 -2
  58. package/examples/extensions/gondolin/package.json +1 -1
  59. package/examples/extensions/sandbox/package-lock.json +2 -2
  60. package/examples/extensions/sandbox/package.json +1 -1
  61. package/examples/extensions/with-deps/package-lock.json +2 -2
  62. package/examples/extensions/with-deps/package.json +1 -1
  63. package/package.json +4 -4
@@ -24,6 +24,8 @@ export declare function formatFetchCallTitle(urls: string[]): {
24
24
  };
25
25
  export declare function formatSearchStatusLine(details: any): string;
26
26
  export declare function formatFetchStatusLine(details: any): string;
27
+ export declare function formatSearchDetail(queries: any, details: any): string;
28
+ export declare function formatFetchDetail(urls: any, details: any): string;
27
29
  export declare function formatSearchChrome(options: any): {
28
30
  call: string;
29
31
  result: any;
@@ -1 +1 @@
1
- {"version":3,"file":"render-search-chrome.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/render-search-chrome.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAQvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAQvG;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAS9F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAU1F;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAStF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,KAAA,UAY7C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,KAAA,UAI5C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,KAAA;;;EAOzC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,KAAA;;;EAOxC","sourcesContent":["// @ts-nocheck\n/**\n * Pure collapsed/expanded chrome for web_search and fetch_content.\n *\n * lunr: compact tool chrome. Collapsed = header + status/count only.\n * Expanded = the query/URL list. No summaries, source titles, body previews,\n * or ctrl+o footers.\n */\n\nexport function normalizeSearchQueryList(queryList: unknown[]): string[] {\n\tconst normalized: string[] = [];\n\tfor (const query of queryList) {\n\t\tif (typeof query !== \"string\") continue;\n\t\tconst trimmed = query.trim();\n\t\tif (trimmed.length > 0) normalized.push(trimmed);\n\t}\n\treturn normalized;\n}\n\nexport function collectSearchQueries(args: { query?: unknown; queries?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tconst rawQueryList: unknown[] = Array.isArray(input.queries)\n\t\t? input.queries\n\t\t: input.query !== undefined\n\t\t\t? [input.query]\n\t\t\t: [];\n\treturn normalizeSearchQueryList(rawQueryList);\n}\n\nexport function collectFetchUrls(args: { url?: unknown; urls?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tif (Array.isArray(input.urls)) {\n\t\treturn input.urls.filter((url) => typeof url === \"string\" && url.length > 0);\n\t}\n\tif (typeof input.url === \"string\" && input.url.length > 0) {\n\t\treturn [input.url];\n\t}\n\treturn [];\n}\n\nexport function formatSearchCallTitle(queries: string[]): { title: string; empty: boolean } {\n\tif (queries.length === 0) {\n\t\treturn { title: \"search (no query)\", empty: true };\n\t}\n\tif (queries.length === 1) {\n\t\tconst q = queries[0];\n\t\tconst display = q.length > 60 ? `${q.slice(0, 57)}...` : q;\n\t\treturn { title: `search \"${display}\"`, empty: false };\n\t}\n\treturn { title: `search ${queries.length} queries`, empty: false };\n}\n\nexport function formatFetchCallTitle(urls: string[]): { title: string; empty: boolean } {\n\tif (urls.length === 0) {\n\t\treturn { title: \"fetch (no URL)\", empty: true };\n\t}\n\tif (urls.length === 1) {\n\t\tconst display = urls[0].length > 60 ? `${urls[0].slice(0, 57)}...` : urls[0];\n\t\treturn { title: `fetch ${display}`, empty: false };\n\t}\n\treturn { title: `fetch ${urls.length} URLs`, empty: false };\n}\n\nexport function formatSearchStatusLine(details) {\n\tconst queryInfo = details?.queryCount === 1 ? \"\" : `${details?.successfulQueries}/${details?.queryCount} queries, `;\n\tlet statusLine = `${queryInfo}${details?.totalResults ?? 0} sources`;\n\tif (details?.curated && details?.curatedFrom) {\n\t\tstatusLine += ` (${details.queryCount}/${details.curatedFrom} queries curated)`;\n\t}\n\tif (details?.fetchId && details?.fetchUrls) {\n\t\tstatusLine += ` (fetching ${details.fetchUrls.length} URLs)`;\n\t} else if (details?.fetchId) {\n\t\tstatusLine += \" (content ready)\";\n\t}\n\treturn statusLine;\n}\n\nexport function formatFetchStatusLine(details) {\n\tconst urlCount = details?.urlCount ?? 0;\n\tconst successful = details?.successful ?? (urlCount === 1 ? 1 : 0);\n\treturn `${successful}/${urlCount} URLs`;\n}\n\nexport function formatSearchChrome(options) {\n\tconst call = formatSearchCallTitle(options.queries);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.queries.slice() };\n\t}\n\tconst status = options.details ? formatSearchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n\nexport function formatFetchChrome(options) {\n\tconst call = formatFetchCallTitle(options.urls);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.urls.slice() };\n\t}\n\tconst status = options.details ? formatFetchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n"]}
1
+ {"version":3,"file":"render-search-chrome.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/render-search-chrome.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAQvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAQvG;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAS9F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAU1F;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAStF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,KAAA,UAY7C;AAED,wBAAgB,qBAAqB,CAAC,OAAO,KAAA,UAI5C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,KAAA,EAAE,OAAO,KAAA,UAKlD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,KAAA,EAAE,OAAO,KAAA,UAK9C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,KAAA;;;EAOzC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,KAAA;;;EAOxC","sourcesContent":["// @ts-nocheck\n/**\n * Pure collapsed/expanded chrome for web_search and fetch_content.\n *\n * lunr: compact tool chrome. Collapsed = header + status/count only.\n * Expanded = the query/URL list. No summaries, source titles, body previews,\n * or ctrl+o footers.\n */\n\nexport function normalizeSearchQueryList(queryList: unknown[]): string[] {\n\tconst normalized: string[] = [];\n\tfor (const query of queryList) {\n\t\tif (typeof query !== \"string\") continue;\n\t\tconst trimmed = query.trim();\n\t\tif (trimmed.length > 0) normalized.push(trimmed);\n\t}\n\treturn normalized;\n}\n\nexport function collectSearchQueries(args: { query?: unknown; queries?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tconst rawQueryList: unknown[] = Array.isArray(input.queries)\n\t\t? input.queries\n\t\t: input.query !== undefined\n\t\t\t? [input.query]\n\t\t\t: [];\n\treturn normalizeSearchQueryList(rawQueryList);\n}\n\nexport function collectFetchUrls(args: { url?: unknown; urls?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tif (Array.isArray(input.urls)) {\n\t\treturn input.urls.filter((url) => typeof url === \"string\" && url.length > 0);\n\t}\n\tif (typeof input.url === \"string\" && input.url.length > 0) {\n\t\treturn [input.url];\n\t}\n\treturn [];\n}\n\nexport function formatSearchCallTitle(queries: string[]): { title: string; empty: boolean } {\n\tif (queries.length === 0) {\n\t\treturn { title: \"search (no query)\", empty: true };\n\t}\n\tif (queries.length === 1) {\n\t\tconst q = queries[0];\n\t\tconst display = q.length > 60 ? `${q.slice(0, 57)}...` : q;\n\t\treturn { title: `search \"${display}\"`, empty: false };\n\t}\n\treturn { title: `search ${queries.length} queries`, empty: false };\n}\n\nexport function formatFetchCallTitle(urls: string[]): { title: string; empty: boolean } {\n\tif (urls.length === 0) {\n\t\treturn { title: \"fetch (no URL)\", empty: true };\n\t}\n\tif (urls.length === 1) {\n\t\tconst display = urls[0].length > 60 ? `${urls[0].slice(0, 57)}...` : urls[0];\n\t\treturn { title: `fetch ${display}`, empty: false };\n\t}\n\treturn { title: `fetch ${urls.length} URLs`, empty: false };\n}\n\nexport function formatSearchStatusLine(details) {\n\tconst queryInfo = details?.queryCount === 1 ? \"\" : `${details?.successfulQueries}/${details?.queryCount} queries, `;\n\tlet statusLine = `${queryInfo}${details?.totalResults ?? 0} sources`;\n\tif (details?.curated && details?.curatedFrom) {\n\t\tstatusLine += ` (${details.queryCount}/${details.curatedFrom} queries curated)`;\n\t}\n\tif (details?.fetchId && details?.fetchUrls) {\n\t\tstatusLine += ` (fetching ${details.fetchUrls.length} URLs)`;\n\t} else if (details?.fetchId) {\n\t\tstatusLine += \" (content ready)\";\n\t}\n\treturn statusLine;\n}\n\nexport function formatFetchStatusLine(details) {\n\tconst urlCount = details?.urlCount ?? 0;\n\tconst successful = details?.successful ?? (urlCount === 1 ? 1 : 0);\n\treturn `${successful}/${urlCount} URLs`;\n}\n\nexport function formatSearchDetail(queries, details) {\n\tconst call = formatSearchCallTitle(queries);\n\tconst rest = call.title.replace(/^search\\s+/, \"\");\n\tconst status = details ? formatSearchStatusLine(details) : \"\";\n\treturn status ? `${rest} · ${status}` : rest;\n}\n\nexport function formatFetchDetail(urls, details) {\n\tconst call = formatFetchCallTitle(urls);\n\tconst rest = call.title.replace(/^fetch\\s+/, \"\");\n\tconst status = details ? formatFetchStatusLine(details) : \"\";\n\treturn status ? `${rest} · ${status}` : rest;\n}\n\nexport function formatSearchChrome(options) {\n\tconst call = formatSearchCallTitle(options.queries);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.queries.slice() };\n\t}\n\tconst status = options.details ? formatSearchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n\nexport function formatFetchChrome(options) {\n\tconst call = formatFetchCallTitle(options.urls);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.urls.slice() };\n\t}\n\tconst status = options.details ? formatFetchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n"]}
@@ -76,6 +76,18 @@ export function formatFetchStatusLine(details) {
76
76
  const successful = details?.successful ?? (urlCount === 1 ? 1 : 0);
77
77
  return `${successful}/${urlCount} URLs`;
78
78
  }
79
+ export function formatSearchDetail(queries, details) {
80
+ const call = formatSearchCallTitle(queries);
81
+ const rest = call.title.replace(/^search\s+/, "");
82
+ const status = details ? formatSearchStatusLine(details) : "";
83
+ return status ? `${rest} · ${status}` : rest;
84
+ }
85
+ export function formatFetchDetail(urls, details) {
86
+ const call = formatFetchCallTitle(urls);
87
+ const rest = call.title.replace(/^fetch\s+/, "");
88
+ const status = details ? formatFetchStatusLine(details) : "";
89
+ return status ? `${rest} · ${status}` : rest;
90
+ }
79
91
  export function formatSearchChrome(options) {
80
92
  const call = formatSearchCallTitle(options.queries);
81
93
  if (options.expanded) {
@@ -1 +1 @@
1
- {"version":3,"file":"render-search-chrome.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/render-search-chrome.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;GAMG;AAEH,MAAM,UAAU,wBAAwB,CAAC,SAAoB,EAAY;IACxE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,UAAU,CAAC;AAAA,CAClB;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAwD,EAAY;IACxG,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,MAAM,YAAY,GAAc,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3D,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;YAC1B,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YACf,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,wBAAwB,CAAC,YAAY,CAAC,CAAC;AAAA,CAC9C;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAmD,EAAY;IAC/F,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,CAAC;AAAA,CACV;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAiB,EAAqC;IAC3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,KAAK,EAAE,WAAW,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,UAAU,OAAO,CAAC,MAAM,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAAA,CACnE;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAc,EAAqC;IACvF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,EAAE,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAAA,CAC5D;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAO,EAAE;IAC/C,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,UAAU,YAAY,CAAC;IACpH,IAAI,UAAU,GAAG,GAAG,SAAS,GAAG,OAAO,EAAE,YAAY,IAAI,CAAC,UAAU,CAAC;IACrE,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QAC9C,UAAU,IAAI,KAAK,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,mBAAmB,CAAC;IACjF,CAAC;IACD,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;QAC5C,UAAU,IAAI,cAAc,OAAO,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC;IAC9D,CAAC;SAAM,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QAC7B,UAAU,IAAI,kBAAkB,CAAC;IAClC,CAAC;IACD,OAAO,UAAU,CAAC;AAAA,CAClB;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAO,EAAE;IAC9C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,GAAG,UAAU,IAAI,QAAQ,OAAO,CAAC;AAAA,CACxC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAO,EAAE;IAC3C,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,OAAM,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAAA,CAC/E;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAO,EAAE;IAC1C,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,OAAM,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAAA,CAC/E","sourcesContent":["// @ts-nocheck\n/**\n * Pure collapsed/expanded chrome for web_search and fetch_content.\n *\n * lunr: compact tool chrome. Collapsed = header + status/count only.\n * Expanded = the query/URL list. No summaries, source titles, body previews,\n * or ctrl+o footers.\n */\n\nexport function normalizeSearchQueryList(queryList: unknown[]): string[] {\n\tconst normalized: string[] = [];\n\tfor (const query of queryList) {\n\t\tif (typeof query !== \"string\") continue;\n\t\tconst trimmed = query.trim();\n\t\tif (trimmed.length > 0) normalized.push(trimmed);\n\t}\n\treturn normalized;\n}\n\nexport function collectSearchQueries(args: { query?: unknown; queries?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tconst rawQueryList: unknown[] = Array.isArray(input.queries)\n\t\t? input.queries\n\t\t: input.query !== undefined\n\t\t\t? [input.query]\n\t\t\t: [];\n\treturn normalizeSearchQueryList(rawQueryList);\n}\n\nexport function collectFetchUrls(args: { url?: unknown; urls?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tif (Array.isArray(input.urls)) {\n\t\treturn input.urls.filter((url) => typeof url === \"string\" && url.length > 0);\n\t}\n\tif (typeof input.url === \"string\" && input.url.length > 0) {\n\t\treturn [input.url];\n\t}\n\treturn [];\n}\n\nexport function formatSearchCallTitle(queries: string[]): { title: string; empty: boolean } {\n\tif (queries.length === 0) {\n\t\treturn { title: \"search (no query)\", empty: true };\n\t}\n\tif (queries.length === 1) {\n\t\tconst q = queries[0];\n\t\tconst display = q.length > 60 ? `${q.slice(0, 57)}...` : q;\n\t\treturn { title: `search \"${display}\"`, empty: false };\n\t}\n\treturn { title: `search ${queries.length} queries`, empty: false };\n}\n\nexport function formatFetchCallTitle(urls: string[]): { title: string; empty: boolean } {\n\tif (urls.length === 0) {\n\t\treturn { title: \"fetch (no URL)\", empty: true };\n\t}\n\tif (urls.length === 1) {\n\t\tconst display = urls[0].length > 60 ? `${urls[0].slice(0, 57)}...` : urls[0];\n\t\treturn { title: `fetch ${display}`, empty: false };\n\t}\n\treturn { title: `fetch ${urls.length} URLs`, empty: false };\n}\n\nexport function formatSearchStatusLine(details) {\n\tconst queryInfo = details?.queryCount === 1 ? \"\" : `${details?.successfulQueries}/${details?.queryCount} queries, `;\n\tlet statusLine = `${queryInfo}${details?.totalResults ?? 0} sources`;\n\tif (details?.curated && details?.curatedFrom) {\n\t\tstatusLine += ` (${details.queryCount}/${details.curatedFrom} queries curated)`;\n\t}\n\tif (details?.fetchId && details?.fetchUrls) {\n\t\tstatusLine += ` (fetching ${details.fetchUrls.length} URLs)`;\n\t} else if (details?.fetchId) {\n\t\tstatusLine += \" (content ready)\";\n\t}\n\treturn statusLine;\n}\n\nexport function formatFetchStatusLine(details) {\n\tconst urlCount = details?.urlCount ?? 0;\n\tconst successful = details?.successful ?? (urlCount === 1 ? 1 : 0);\n\treturn `${successful}/${urlCount} URLs`;\n}\n\nexport function formatSearchChrome(options) {\n\tconst call = formatSearchCallTitle(options.queries);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.queries.slice() };\n\t}\n\tconst status = options.details ? formatSearchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n\nexport function formatFetchChrome(options) {\n\tconst call = formatFetchCallTitle(options.urls);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.urls.slice() };\n\t}\n\tconst status = options.details ? formatFetchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n"]}
1
+ {"version":3,"file":"render-search-chrome.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/render-search-chrome.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Pure collapsed/expanded chrome for web_search and fetch_content.\n *\n * lunr: compact tool chrome. Collapsed = header + status/count only.\n * Expanded = the query/URL list. No summaries, source titles, body previews,\n * or ctrl+o footers.\n */\n\nexport function normalizeSearchQueryList(queryList: unknown[]): string[] {\n\tconst normalized: string[] = [];\n\tfor (const query of queryList) {\n\t\tif (typeof query !== \"string\") continue;\n\t\tconst trimmed = query.trim();\n\t\tif (trimmed.length > 0) normalized.push(trimmed);\n\t}\n\treturn normalized;\n}\n\nexport function collectSearchQueries(args: { query?: unknown; queries?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tconst rawQueryList: unknown[] = Array.isArray(input.queries)\n\t\t? input.queries\n\t\t: input.query !== undefined\n\t\t\t? [input.query]\n\t\t\t: [];\n\treturn normalizeSearchQueryList(rawQueryList);\n}\n\nexport function collectFetchUrls(args: { url?: unknown; urls?: unknown } | undefined): string[] {\n\tconst input = args ?? {};\n\tif (Array.isArray(input.urls)) {\n\t\treturn input.urls.filter((url) => typeof url === \"string\" && url.length > 0);\n\t}\n\tif (typeof input.url === \"string\" && input.url.length > 0) {\n\t\treturn [input.url];\n\t}\n\treturn [];\n}\n\nexport function formatSearchCallTitle(queries: string[]): { title: string; empty: boolean } {\n\tif (queries.length === 0) {\n\t\treturn { title: \"search (no query)\", empty: true };\n\t}\n\tif (queries.length === 1) {\n\t\tconst q = queries[0];\n\t\tconst display = q.length > 60 ? `${q.slice(0, 57)}...` : q;\n\t\treturn { title: `search \"${display}\"`, empty: false };\n\t}\n\treturn { title: `search ${queries.length} queries`, empty: false };\n}\n\nexport function formatFetchCallTitle(urls: string[]): { title: string; empty: boolean } {\n\tif (urls.length === 0) {\n\t\treturn { title: \"fetch (no URL)\", empty: true };\n\t}\n\tif (urls.length === 1) {\n\t\tconst display = urls[0].length > 60 ? `${urls[0].slice(0, 57)}...` : urls[0];\n\t\treturn { title: `fetch ${display}`, empty: false };\n\t}\n\treturn { title: `fetch ${urls.length} URLs`, empty: false };\n}\n\nexport function formatSearchStatusLine(details) {\n\tconst queryInfo = details?.queryCount === 1 ? \"\" : `${details?.successfulQueries}/${details?.queryCount} queries, `;\n\tlet statusLine = `${queryInfo}${details?.totalResults ?? 0} sources`;\n\tif (details?.curated && details?.curatedFrom) {\n\t\tstatusLine += ` (${details.queryCount}/${details.curatedFrom} queries curated)`;\n\t}\n\tif (details?.fetchId && details?.fetchUrls) {\n\t\tstatusLine += ` (fetching ${details.fetchUrls.length} URLs)`;\n\t} else if (details?.fetchId) {\n\t\tstatusLine += \" (content ready)\";\n\t}\n\treturn statusLine;\n}\n\nexport function formatFetchStatusLine(details) {\n\tconst urlCount = details?.urlCount ?? 0;\n\tconst successful = details?.successful ?? (urlCount === 1 ? 1 : 0);\n\treturn `${successful}/${urlCount} URLs`;\n}\n\nexport function formatSearchDetail(queries, details) {\n\tconst call = formatSearchCallTitle(queries);\n\tconst rest = call.title.replace(/^search\\s+/, \"\");\n\tconst status = details ? formatSearchStatusLine(details) : \"\";\n\treturn status ? `${rest} · ${status}` : rest;\n}\n\nexport function formatFetchDetail(urls, details) {\n\tconst call = formatFetchCallTitle(urls);\n\tconst rest = call.title.replace(/^fetch\\s+/, \"\");\n\tconst status = details ? formatFetchStatusLine(details) : \"\";\n\treturn status ? `${rest} · ${status}` : rest;\n}\n\nexport function formatSearchChrome(options) {\n\tconst call = formatSearchCallTitle(options.queries);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.queries.slice() };\n\t}\n\tconst status = options.details ? formatSearchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n\nexport function formatFetchChrome(options) {\n\tconst call = formatFetchCallTitle(options.urls);\n\tif (options.expanded) {\n\t\treturn { call: call.title, result: options.urls.slice() };\n\t}\n\tconst status = options.details ? formatFetchStatusLine(options.details) : \"\";\n\treturn { call: status ? `${call.title} · ${status}` : call.title, result: [] };\n}\n"]}
@@ -302,6 +302,8 @@ export interface ToolRenderResultOptions {
302
302
  /** Whether this is a partial/streaming result */
303
303
  isPartial: boolean;
304
304
  }
305
+ /** Position of a tool card in a consecutive same-name run. */
306
+ export type ToolGroupRole = "singleton" | "first" | "middle" | "last";
305
307
  /** Context passed to tool renderers. */
306
308
  export interface ToolRenderContext<TState = any, TArgs = any> {
307
309
  /** Current tool call arguments. Shared across call/result renders for the same tool call. */
@@ -341,6 +343,8 @@ export interface ToolRenderContext<TState = any, TArgs = any> {
341
343
  details?: unknown;
342
344
  isError: boolean;
343
345
  };
346
+ /** Consecutive same-name run position. Compact cards use this for tree chrome. */
347
+ groupRole?: ToolGroupRole;
344
348
  }
345
349
  /**
346
350
  * Tool definition for registerTool().