@agimon-ai/doompi-grep 0.0.1-alpha.44 → 0.0.1-alpha.47

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 (71) hide show
  1. package/package.json +20 -13
  2. package/dist/api-contracts.cjs +0 -1
  3. package/dist/api-contracts.d.cts +0 -2
  4. package/dist/api-contracts.d.mts +0 -2
  5. package/dist/api-contracts.mjs +0 -1
  6. package/dist/constants/package.cjs +0 -2
  7. package/dist/constants/package.cjs.map +0 -1
  8. package/dist/constants/package.mjs +0 -2
  9. package/dist/constants/package.mjs.map +0 -1
  10. package/dist/extensions/pi.cjs +0 -2
  11. package/dist/extensions/pi.cjs.map +0 -1
  12. package/dist/extensions/pi.d.cts +0 -5
  13. package/dist/extensions/pi.d.cts.map +0 -1
  14. package/dist/extensions/pi.d.mts +0 -5
  15. package/dist/extensions/pi.d.mts.map +0 -1
  16. package/dist/extensions/pi.mjs +0 -2
  17. package/dist/extensions/pi.mjs.map +0 -1
  18. package/dist/extensions/server.cjs +0 -2
  19. package/dist/extensions/server.cjs.map +0 -1
  20. package/dist/extensions/server.d.cts +0 -5
  21. package/dist/extensions/server.d.cts.map +0 -1
  22. package/dist/extensions/server.d.mts +0 -5
  23. package/dist/extensions/server.d.mts.map +0 -1
  24. package/dist/extensions/server.mjs +0 -2
  25. package/dist/extensions/server.mjs.map +0 -1
  26. package/dist/index.cjs +0 -1
  27. package/dist/index.d.cts +0 -4
  28. package/dist/index.d.mts +0 -4
  29. package/dist/index.mjs +0 -1
  30. package/dist/schemas/apiContracts.cjs +0 -2
  31. package/dist/schemas/apiContracts.cjs.map +0 -1
  32. package/dist/schemas/apiContracts.d.cts +0 -53
  33. package/dist/schemas/apiContracts.d.cts.map +0 -1
  34. package/dist/schemas/apiContracts.d.mts +0 -53
  35. package/dist/schemas/apiContracts.d.mts.map +0 -1
  36. package/dist/schemas/apiContracts.mjs +0 -2
  37. package/dist/schemas/apiContracts.mjs.map +0 -1
  38. package/dist/schemas/grepTool.cjs +0 -2
  39. package/dist/schemas/grepTool.cjs.map +0 -1
  40. package/dist/schemas/grepTool.d.cts +0 -14
  41. package/dist/schemas/grepTool.d.cts.map +0 -1
  42. package/dist/schemas/grepTool.d.mts +0 -14
  43. package/dist/schemas/grepTool.d.mts.map +0 -1
  44. package/dist/schemas/grepTool.mjs +0 -2
  45. package/dist/schemas/grepTool.mjs.map +0 -1
  46. package/dist/services/grepTool/index.cjs +0 -10
  47. package/dist/services/grepTool/index.cjs.map +0 -1
  48. package/dist/services/grepTool/index.d.cts +0 -1
  49. package/dist/services/grepTool/index.d.mts +0 -1
  50. package/dist/services/grepTool/index.mjs +0 -10
  51. package/dist/services/grepTool/index.mjs.map +0 -1
  52. package/dist/services/headlessGrep/index.cjs +0 -4
  53. package/dist/services/headlessGrep/index.cjs.map +0 -1
  54. package/dist/services/headlessGrep/index.d.cts +0 -6
  55. package/dist/services/headlessGrep/index.d.cts.map +0 -1
  56. package/dist/services/headlessGrep/index.d.mts +0 -6
  57. package/dist/services/headlessGrep/index.d.mts.map +0 -1
  58. package/dist/services/headlessGrep/index.mjs +0 -4
  59. package/dist/services/headlessGrep/index.mjs.map +0 -1
  60. package/dist/tools/piGrep.cjs +0 -2
  61. package/dist/tools/piGrep.cjs.map +0 -1
  62. package/dist/tools/piGrep.d.cts +0 -9
  63. package/dist/tools/piGrep.d.cts.map +0 -1
  64. package/dist/tools/piGrep.d.mts +0 -9
  65. package/dist/tools/piGrep.d.mts.map +0 -1
  66. package/dist/tools/piGrep.mjs +0 -2
  67. package/dist/tools/piGrep.mjs.map +0 -1
  68. package/src/extensions/web.ts +0 -14
  69. package/src/web/components/GrepToolMessage.tsx +0 -65
  70. package/src/web/lib/grepToolView.ts +0 -21
  71. package/src/web/tsconfig.json +0 -23
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-grep",
3
- "version": "0.0.1-alpha.44",
3
+ "version": "0.0.1-alpha.47",
4
4
  "description": "Snapshot-bound hashline grep for Pi and DoomPi.",
5
5
  "keywords": [
6
6
  "ai",
@@ -25,14 +25,12 @@
25
25
  "directory": "packages/default/doompi-grep"
26
26
  },
27
27
  "files": [
28
- "dist",
29
- "src/web",
30
- "src/extensions/web.ts",
31
- "!src/web/**/*.stories.tsx"
28
+ "dist"
32
29
  ],
33
30
  "type": "module",
34
31
  "main": "./dist/index.cjs",
35
- "types": "./dist/index.d.mts",
32
+ "module": "./dist/index.mjs",
33
+ "types": "./dist/index.d.cts",
36
34
  "jsnext:main": "./dist/index.mjs",
37
35
  "exports": {
38
36
  ".": {
@@ -40,6 +38,11 @@
40
38
  "import": "./dist/index.mjs",
41
39
  "require": "./dist/index.cjs"
42
40
  },
41
+ "./api-contracts": {
42
+ "types": "./dist/api-contracts.d.mts",
43
+ "import": "./dist/api-contracts.mjs",
44
+ "require": "./dist/api-contracts.cjs"
45
+ },
43
46
  "./extensions/pi": {
44
47
  "types": "./dist/extensions/pi.d.mts",
45
48
  "import": "./dist/extensions/pi.mjs",
@@ -50,20 +53,24 @@
50
53
  "import": "./dist/extensions/server.mjs",
51
54
  "require": "./dist/extensions/server.cjs"
52
55
  },
56
+ "./extensions/web": {
57
+ "import": "./dist/extensions/web.mjs"
58
+ },
53
59
  "./package.json": "./package.json"
54
60
  },
55
61
  "publishConfig": {
56
62
  "access": "public"
57
63
  },
58
64
  "dependencies": {
59
- "@agimon-ai/doompi-core": "0.0.1-alpha.72",
60
- "@agimon-ai/doompi-hashline": "0.0.1-alpha.41",
61
- "@agimon-ai/doompi-ui": "0.0.1-alpha.72",
62
- "@agimon-ai/doompi-web-components": "0.0.1-alpha.30",
65
+ "@agimon-ai/doompi-core": "0.0.1-alpha.75",
66
+ "@agimon-ai/doompi-hashline": "0.0.1-alpha.44",
67
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.75",
68
+ "@agimon-ai/doompi-web-components": "0.0.1-alpha.33",
63
69
  "@deepseek-ai/cordis": "4.0.2",
64
70
  "typebox": "1.3.30"
65
71
  },
66
72
  "devDependencies": {
73
+ "@agimon-ai/doompi-build": "0.0.1-alpha.4",
67
74
  "@earendil-works/pi-coding-agent": "0.85.1",
68
75
  "@earendil-works/pi-tui": "0.85.1",
69
76
  "@tanstack/react-store": "0.11.1",
@@ -94,7 +101,7 @@
94
101
  "node": ">=22.19.0"
95
102
  },
96
103
  "doompiServer": {
97
- "entry": "./src/extensions/server.ts",
104
+ "entry": "./generated/server.ts",
98
105
  "dist": "./dist/extensions/server.mjs",
99
106
  "scopes": [
100
107
  "session"
@@ -107,7 +114,7 @@
107
114
  "doompiWeb": {
108
115
  "pluginId": "grep",
109
116
  "channels": [],
110
- "client": "./src/extensions/web.ts",
117
+ "client": "./dist/extensions/web.mjs",
111
118
  "scopes": [
112
119
  "session"
113
120
  ]
@@ -120,7 +127,7 @@
120
127
  "scripts": {
121
128
  "build": "tsdown",
122
129
  "test": "vitest --run",
123
- "typecheck": "tsc --noEmit && tsc --noEmit -p src/web/tsconfig.json",
130
+ "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.web.json",
124
131
  "lint": "oxlint . && oxfmt . --check",
125
132
  "fixcode": "oxlint . --fix && oxfmt ."
126
133
  }
@@ -1 +0,0 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./schemas/apiContracts.cjs");exports.apiContracts=e.apiContracts,exports.default=e.apiContracts;
@@ -1,2 +0,0 @@
1
- import { apiContracts } from "./schemas/apiContracts.cjs";
2
- export { apiContracts, apiContracts as default };
@@ -1,2 +0,0 @@
1
- import { apiContracts } from "./schemas/apiContracts.mjs";
2
- export { apiContracts, apiContracts as default };
@@ -1 +0,0 @@
1
- import{apiContracts as e}from"./schemas/apiContracts.mjs";export{e as apiContracts,e as default};
@@ -1,2 +0,0 @@
1
- exports.PACKAGE_SOURCE=`@agimon-ai/doompi-grep`;
2
- //# sourceMappingURL=package.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package.cjs","names":[],"sources":["../../src/constants/package.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/doompi-grep';\n"],"mappings":""}
@@ -1,2 +0,0 @@
1
- const e=`@agimon-ai/doompi-grep`;export{e as PACKAGE_SOURCE};
2
- //# sourceMappingURL=package.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package.mjs","names":[],"sources":["../../src/constants/package.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/doompi-grep';\n"],"mappings":"AAAA,MAAa,EAAiB"}
@@ -1,2 +0,0 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../tools/piGrep.cjs"),t=require("../constants/package.cjs");let n=require("@agimon-ai/doompi-core/pi-extension");const r=(0,n.definePiExtension)(t.PACKAGE_SOURCE,()=>({toolOverrides:[{source:t.PACKAGE_SOURCE,tools:[`grep`],replacements:[(0,n.definePiTool)(e.createHashlineGrepTool())]}]}));exports.activateDoomPiGrepExtension=r,exports.default=r;
2
- //# sourceMappingURL=pi.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pi.cjs","names":["definePiExtension","PACKAGE_SOURCE","definePiTool","createHashlineGrepTool"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension, definePiTool } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { PACKAGE_SOURCE } from '../constants/package';\nimport { createHashlineGrepTool } from '../tools/piGrep';\n\nexport const activateDoomPiGrepExtension = definePiExtension(PACKAGE_SOURCE, () => ({\n toolOverrides: [{ source: PACKAGE_SOURCE, tools: ['grep'], replacements: [definePiTool(createHashlineGrepTool())] }],\n}));\nexport default activateDoomPiGrepExtension;\n"],"mappings":"iOAKA,MAAa,GAAA,EAA8BA,EAAAA,kBAAAA,CAAkBC,EAAAA,oBAAuB,CAClF,cAAe,CAAC,CAAE,OAAQA,EAAAA,eAAgB,MAAO,CAAC,MAAM,EAAG,aAAc,EAAA,EAACC,EAAAA,aAAAA,CAAaC,EAAAA,uBAAuB,CAAC,CAAC,CAAE,CAAC,CACrH,EAAE"}
@@ -1,5 +0,0 @@
1
- //#region src/extensions/pi.d.ts
2
- export declare const activateDoomPiGrepExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
- //#endregion
4
- export { activateDoomPiGrepExtension as default };
5
- //# sourceMappingURL=pi.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";qBAKa,mFAA2B"}
@@ -1,5 +0,0 @@
1
- //#region src/extensions/pi.d.ts
2
- export declare const activateDoomPiGrepExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
- //#endregion
4
- export { activateDoomPiGrepExtension as default };
5
- //# sourceMappingURL=pi.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";qBAKa,mFAA2B"}
@@ -1,2 +0,0 @@
1
- import{createHashlineGrepTool as e}from"../tools/piGrep.mjs";import{PACKAGE_SOURCE as t}from"../constants/package.mjs";import{definePiExtension as n,definePiTool as r}from"@agimon-ai/doompi-core/pi-extension";const i=n(t,()=>({toolOverrides:[{source:t,tools:[`grep`],replacements:[r(e())]}]}));export{i as activateDoomPiGrepExtension,i as default};
2
- //# sourceMappingURL=pi.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension, definePiTool } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { PACKAGE_SOURCE } from '../constants/package';\nimport { createHashlineGrepTool } from '../tools/piGrep';\n\nexport const activateDoomPiGrepExtension = definePiExtension(PACKAGE_SOURCE, () => ({\n toolOverrides: [{ source: PACKAGE_SOURCE, tools: ['grep'], replacements: [definePiTool(createHashlineGrepTool())] }],\n}));\nexport default activateDoomPiGrepExtension;\n"],"mappings":"iNAKA,MAAa,EAA8B,EAAkB,OAAuB,CAClF,cAAe,CAAC,CAAE,OAAQ,EAAgB,MAAO,CAAC,MAAM,EAAG,aAAc,CAAC,EAAa,EAAuB,CAAC,CAAC,CAAE,CAAC,CACrH,EAAE"}
@@ -1,2 +0,0 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../services/headlessGrep/index.cjs"),t=require("../constants/package.cjs"),n=(0,require("@agimon-ai/doompi-core/server-facet").defineServerPlugin)({name:t.PACKAGE_SOURCE,session:()=>({tools:[e.createHeadlessGrepTool()]})});exports.default=n,exports.grepServerFacet=n;
2
- //# sourceMappingURL=server.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.cjs","names":["defineServerPlugin","PACKAGE_SOURCE","createHeadlessGrepTool"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { PACKAGE_SOURCE } from '../constants/package';\nimport { createHeadlessGrepTool } from '../services/headlessGrep';\n\nexport const grepServerFacet = defineServerPlugin({\n name: PACKAGE_SOURCE,\n session: () => ({ tools: [createHeadlessGrepTool()] }),\n});\nexport default grepServerFacet;\n"],"mappings":"2LAKa,GAAA,+CAAkBA,CAAAA,CAAAA,mBAAAA,CAAmB,CAChD,KAAMC,EAAAA,eACN,aAAgB,CAAE,MAAO,CAACC,EAAAA,uBAAuB,CAAC,CAAE,EACtD,CAAC"}
@@ -1,5 +0,0 @@
1
- //#region src/extensions/server.d.ts
2
- export declare const grepServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
- //#endregion
4
- export { grepServerFacet as default };
5
- //# sourceMappingURL=server.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAKa,+DAAe"}
@@ -1,5 +0,0 @@
1
- //#region src/extensions/server.d.ts
2
- export declare const grepServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
- //#endregion
4
- export { grepServerFacet as default };
5
- //# sourceMappingURL=server.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAKa,+DAAe"}
@@ -1,2 +0,0 @@
1
- import{createHeadlessGrepTool as e}from"../services/headlessGrep/index.mjs";import{PACKAGE_SOURCE as t}from"../constants/package.mjs";import{defineServerPlugin as n}from"@agimon-ai/doompi-core/server-facet";const r=n({name:t,session:()=>({tools:[e()]})});export{r as default,r as grepServerFacet};
2
- //# sourceMappingURL=server.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { PACKAGE_SOURCE } from '../constants/package';\nimport { createHeadlessGrepTool } from '../services/headlessGrep';\n\nexport const grepServerFacet = defineServerPlugin({\n name: PACKAGE_SOURCE,\n session: () => ({ tools: [createHeadlessGrepTool()] }),\n});\nexport default grepServerFacet;\n"],"mappings":"+MAKA,MAAa,EAAkB,EAAmB,CAChD,KAAM,EACN,aAAgB,CAAE,MAAO,CAAC,EAAuB,CAAC,CAAE,EACtD,CAAC"}
package/dist/index.cjs DELETED
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./schemas/grepTool.cjs"),t=require("./tools/piGrep.cjs"),n=require("./services/headlessGrep/index.cjs");exports.GrepParamsSchema=e.GrepParamsSchema,exports.createHashlineGrepTool=t.createHashlineGrepTool,exports.createHeadlessGrepTool=n.createHeadlessGrepTool;
package/dist/index.d.cts DELETED
@@ -1,4 +0,0 @@
1
- import { GrepParams, GrepParamsSchema } from "./schemas/grepTool.cjs";
2
- import { createHashlineGrepTool } from "./tools/piGrep.cjs";
3
- import { createHeadlessGrepTool } from "./services/headlessGrep/index.cjs";
4
- export { type GrepParams, GrepParamsSchema, createHashlineGrepTool, createHeadlessGrepTool };
package/dist/index.d.mts DELETED
@@ -1,4 +0,0 @@
1
- import { GrepParams, GrepParamsSchema } from "./schemas/grepTool.mjs";
2
- import { createHashlineGrepTool } from "./tools/piGrep.mjs";
3
- import { createHeadlessGrepTool } from "./services/headlessGrep/index.mjs";
4
- export { type GrepParams, GrepParamsSchema, createHashlineGrepTool, createHeadlessGrepTool };
package/dist/index.mjs DELETED
@@ -1 +0,0 @@
1
- import{GrepParamsSchema as e}from"./schemas/grepTool.mjs";import{createHashlineGrepTool as t}from"./tools/piGrep.mjs";import{createHeadlessGrepTool as n}from"./services/headlessGrep/index.mjs";export{e as GrepParamsSchema,t as createHashlineGrepTool,n as createHeadlessGrepTool};
@@ -1,2 +0,0 @@
1
- const e=(0,require("@agimon-ai/doompi-core/api-contracts").defineApiContract)({version:1,http:[],sockets:[],dynamic:[]});exports.apiContracts=e,exports.default=e;
2
- //# sourceMappingURL=apiContracts.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":"AAGA,MAAa,GAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
@@ -1,53 +0,0 @@
1
- //#region src/schemas/apiContracts.d.ts
2
- /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
3
- export declare const apiContracts: {
4
- version: 1;
5
- protocols?: Record<string, string> | undefined;
6
- schemas?: Record<string, boolean | object> | undefined;
7
- http: {
8
- id: string;
9
- scope: "global" | "session" | "workspace";
10
- basePath?: string | undefined;
11
- path: string;
12
- method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
- description: string;
14
- availability?: string | undefined;
15
- authentication: "device" | "none" | "owner";
16
- parameters?: {
17
- name: string;
18
- in: "header" | "path" | "query";
19
- required: boolean;
20
- schema: boolean | object;
21
- }[] | undefined;
22
- body?: {
23
- contentType: string;
24
- contentTypes?: string[] | undefined;
25
- required: boolean;
26
- schema: boolean | object;
27
- } | undefined;
28
- responses: Record<string, {
29
- description: string;
30
- contentType?: string | undefined;
31
- schema?: boolean | object | undefined;
32
- events?: Record<string, boolean | object> | undefined;
33
- }>;
34
- }[];
35
- sockets: {
36
- id: string;
37
- scope: "global" | "session" | "workspace";
38
- description: string;
39
- availability?: string | undefined;
40
- service: string;
41
- member: string;
42
- direction: "client-to-server" | "server-to-client";
43
- kind: "channel" | "method" | "state";
44
- input: boolean | object;
45
- output?: boolean | object | undefined;
46
- errors?: boolean | object | undefined;
47
- }[];
48
- dynamic: string[];
49
- gaps?: string[] | undefined;
50
- };
51
- //#endregion
52
- export { apiContracts as default };
53
- //# sourceMappingURL=apiContracts.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apiContracts.d.cts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
@@ -1,53 +0,0 @@
1
- //#region src/schemas/apiContracts.d.ts
2
- /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
3
- export declare const apiContracts: {
4
- version: 1;
5
- protocols?: Record<string, string> | undefined;
6
- schemas?: Record<string, boolean | object> | undefined;
7
- http: {
8
- id: string;
9
- scope: "global" | "session" | "workspace";
10
- basePath?: string | undefined;
11
- path: string;
12
- method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
- description: string;
14
- availability?: string | undefined;
15
- authentication: "device" | "none" | "owner";
16
- parameters?: {
17
- name: string;
18
- in: "header" | "path" | "query";
19
- required: boolean;
20
- schema: boolean | object;
21
- }[] | undefined;
22
- body?: {
23
- contentType: string;
24
- contentTypes?: string[] | undefined;
25
- required: boolean;
26
- schema: boolean | object;
27
- } | undefined;
28
- responses: Record<string, {
29
- description: string;
30
- contentType?: string | undefined;
31
- schema?: boolean | object | undefined;
32
- events?: Record<string, boolean | object> | undefined;
33
- }>;
34
- }[];
35
- sockets: {
36
- id: string;
37
- scope: "global" | "session" | "workspace";
38
- description: string;
39
- availability?: string | undefined;
40
- service: string;
41
- member: string;
42
- direction: "client-to-server" | "server-to-client";
43
- kind: "channel" | "method" | "state";
44
- input: boolean | object;
45
- output?: boolean | object | undefined;
46
- errors?: boolean | object | undefined;
47
- }[];
48
- dynamic: string[];
49
- gaps?: string[] | undefined;
50
- };
51
- //#endregion
52
- export { apiContracts as default };
53
- //# sourceMappingURL=apiContracts.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
@@ -1,2 +0,0 @@
1
- import{defineApiContract as e}from"@agimon-ai/doompi-core/api-contracts";const t=e({version:1,http:[],sockets:[],dynamic:[]});export{t as apiContracts,t as default};
2
- //# sourceMappingURL=apiContracts.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":"yEAGA,MAAa,EAAe,EAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- let e=require("typebox");const t=e.Type.Object({pattern:e.Type.String({description:`Regular expression or literal text to find.`}),path:e.Type.Optional(e.Type.String({description:`File or directory to search. Defaults to the working directory.`})),glob:e.Type.Optional(e.Type.String({description:`Glob filter for files to search.`})),ignoreCase:e.Type.Optional(e.Type.Boolean({description:`Match without case sensitivity.`})),literal:e.Type.Optional(e.Type.Boolean({description:`Treat pattern as literal text.`})),context:e.Type.Optional(e.Type.Integer({minimum:0,description:`Context lines around every match.`})),limit:e.Type.Optional(e.Type.Integer({minimum:1,description:`Maximum number of matches.`}))});exports.GrepParamsSchema=t;
2
- //# sourceMappingURL=grepTool.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grepTool.cjs","names":["Type"],"sources":["../../src/schemas/grepTool.ts"],"sourcesContent":["import { type Static, Type } from 'typebox';\n\nexport const GrepParamsSchema = Type.Object({\n pattern: Type.String({ description: 'Regular expression or literal text to find.' }),\n path: Type.Optional(Type.String({ description: 'File or directory to search. Defaults to the working directory.' })),\n glob: Type.Optional(Type.String({ description: 'Glob filter for files to search.' })),\n ignoreCase: Type.Optional(Type.Boolean({ description: 'Match without case sensitivity.' })),\n literal: Type.Optional(Type.Boolean({ description: 'Treat pattern as literal text.' })),\n context: Type.Optional(Type.Integer({ minimum: 0, description: 'Context lines around every match.' })),\n limit: Type.Optional(Type.Integer({ minimum: 1, description: 'Maximum number of matches.' })),\n});\n\nexport type GrepParams = Static<typeof GrepParamsSchema>;\n"],"mappings":"yBAEA,MAAa,EAAmBA,EAAAA,KAAK,OAAO,CAC1C,QAASA,EAAAA,KAAK,OAAO,CAAE,YAAa,6CAA8C,CAAC,EACnF,KAAMA,EAAAA,KAAK,SAASA,EAAAA,KAAK,OAAO,CAAE,YAAa,iEAAkE,CAAC,CAAC,EACnH,KAAMA,EAAAA,KAAK,SAASA,EAAAA,KAAK,OAAO,CAAE,YAAa,kCAAmC,CAAC,CAAC,EACpF,WAAYA,EAAAA,KAAK,SAASA,EAAAA,KAAK,QAAQ,CAAE,YAAa,iCAAkC,CAAC,CAAC,EAC1F,QAASA,EAAAA,KAAK,SAASA,EAAAA,KAAK,QAAQ,CAAE,YAAa,gCAAiC,CAAC,CAAC,EACtF,QAASA,EAAAA,KAAK,SAASA,EAAAA,KAAK,QAAQ,CAAE,QAAS,EAAG,YAAa,mCAAoC,CAAC,CAAC,EACrG,MAAOA,EAAAA,KAAK,SAASA,EAAAA,KAAK,QAAQ,CAAE,QAAS,EAAG,YAAa,4BAA6B,CAAC,CAAC,CAC9F,CAAC"}
@@ -1,14 +0,0 @@
1
- import { Static, Type } from "typebox";
2
- //#region src/schemas/grepTool.d.ts
3
- export declare const GrepParamsSchema: Type.TObject<{
4
- pattern: Type.TString;
5
- path: Type.TOptional<Type.TString>;
6
- glob: Type.TOptional<Type.TString>;
7
- ignoreCase: Type.TOptional<Type.TBoolean>;
8
- literal: Type.TOptional<Type.TBoolean>;
9
- context: Type.TOptional<Type.TInteger>;
10
- limit: Type.TOptional<Type.TInteger>;
11
- }>;
12
- export type GrepParams = Static<typeof GrepParamsSchema>;
13
- //#endregion
14
- //# sourceMappingURL=grepTool.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grepTool.d.cts","names":[],"sources":["../../src/schemas/grepTool.ts"],"mappings":";;qBAEa,kBAAgB,KAAA;;;;;;;;;YAUjB,aAAa,cAAc"}
@@ -1,14 +0,0 @@
1
- import { Static, Type } from "typebox";
2
- //#region src/schemas/grepTool.d.ts
3
- export declare const GrepParamsSchema: Type.TObject<{
4
- pattern: Type.TString;
5
- path: Type.TOptional<Type.TString>;
6
- glob: Type.TOptional<Type.TString>;
7
- ignoreCase: Type.TOptional<Type.TBoolean>;
8
- literal: Type.TOptional<Type.TBoolean>;
9
- context: Type.TOptional<Type.TInteger>;
10
- limit: Type.TOptional<Type.TInteger>;
11
- }>;
12
- export type GrepParams = Static<typeof GrepParamsSchema>;
13
- //#endregion
14
- //# sourceMappingURL=grepTool.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grepTool.d.mts","names":[],"sources":["../../src/schemas/grepTool.ts"],"mappings":";;qBAEa,kBAAgB,KAAA;;;;;;;;;YAUjB,aAAa,cAAc"}
@@ -1,2 +0,0 @@
1
- import{Type as e}from"typebox";const t=e.Object({pattern:e.String({description:`Regular expression or literal text to find.`}),path:e.Optional(e.String({description:`File or directory to search. Defaults to the working directory.`})),glob:e.Optional(e.String({description:`Glob filter for files to search.`})),ignoreCase:e.Optional(e.Boolean({description:`Match without case sensitivity.`})),literal:e.Optional(e.Boolean({description:`Treat pattern as literal text.`})),context:e.Optional(e.Integer({minimum:0,description:`Context lines around every match.`})),limit:e.Optional(e.Integer({minimum:1,description:`Maximum number of matches.`}))});export{t as GrepParamsSchema};
2
- //# sourceMappingURL=grepTool.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grepTool.mjs","names":[],"sources":["../../src/schemas/grepTool.ts"],"sourcesContent":["import { type Static, Type } from 'typebox';\n\nexport const GrepParamsSchema = Type.Object({\n pattern: Type.String({ description: 'Regular expression or literal text to find.' }),\n path: Type.Optional(Type.String({ description: 'File or directory to search. Defaults to the working directory.' })),\n glob: Type.Optional(Type.String({ description: 'Glob filter for files to search.' })),\n ignoreCase: Type.Optional(Type.Boolean({ description: 'Match without case sensitivity.' })),\n literal: Type.Optional(Type.Boolean({ description: 'Treat pattern as literal text.' })),\n context: Type.Optional(Type.Integer({ minimum: 0, description: 'Context lines around every match.' })),\n limit: Type.Optional(Type.Integer({ minimum: 1, description: 'Maximum number of matches.' })),\n});\n\nexport type GrepParams = Static<typeof GrepParamsSchema>;\n"],"mappings":"+BAEA,MAAa,EAAmB,EAAK,OAAO,CAC1C,QAAS,EAAK,OAAO,CAAE,YAAa,6CAA8C,CAAC,EACnF,KAAM,EAAK,SAAS,EAAK,OAAO,CAAE,YAAa,iEAAkE,CAAC,CAAC,EACnH,KAAM,EAAK,SAAS,EAAK,OAAO,CAAE,YAAa,kCAAmC,CAAC,CAAC,EACpF,WAAY,EAAK,SAAS,EAAK,QAAQ,CAAE,YAAa,iCAAkC,CAAC,CAAC,EAC1F,QAAS,EAAK,SAAS,EAAK,QAAQ,CAAE,YAAa,gCAAiC,CAAC,CAAC,EACtF,QAAS,EAAK,SAAS,EAAK,QAAQ,CAAE,QAAS,EAAG,YAAa,mCAAoC,CAAC,CAAC,EACrG,MAAO,EAAK,SAAS,EAAK,QAAQ,CAAE,QAAS,EAAG,YAAa,4BAA6B,CAAC,CAAC,CAC9F,CAAC"}
@@ -1,10 +0,0 @@
1
- let e=require("@agimon-ai/doompi-hashline/files"),t=require("node:path"),n=require("@agimon-ai/doompi-hashline");const r=/:(\d+): /gu,i=/-(\d+)- /gu;async function a(t,r,i,a,c,u,d){let f=t.content.find(e=>e.type===`text`);if(!f||f.text===`No matches found`)return t;let p=f.text.lastIndexOf(`
2
-
3
- [`),m=p===-1?f.text:f.text.slice(0,p),h=p===-1?``:f.text.slice(p),g=(0,e.resolveInputPath)(r.path??`.`,i),_=await u.stat(g);l(a);let v=await s(m,g,_.isDirectory(),a,u);if(v.length===0)return t;let y=o(v,g,_.isDirectory(),i),b=[],x=0,S=t.details?.linesTruncated??!1;for(let t of y.values()){l(a);let r=await c(t.absolutePath);if(l(a),!r){b.push(t.nativeRows.join(`
4
- `));continue}let i;try{i=await u.readFile(t.absolutePath)}catch{b.push(t.nativeRows.join(`
5
- `));continue}l(a);let o=(0,n.splitLines)((0,e.decodeUtf8)(i,t.path)),s=[(0,n.formatFileHeader)(t.path,(0,e.computeFileTag)(i))];for(let[e,r]of[...t.rows].sort(([e],[t])=>e-t)){let t=o[e-1];if(t===void 0)continue;let i=d.truncateLine(t);i.wasTruncated&&(S=!0),s.push((0,n.formatTaggedLine)(i.text,e,r?`>> `:` `,t))}s.length>1?(b.push(s.join(`
6
- `)),x++):b.push(t.nativeRows.join(`
7
- `))}if(b.length===0||x===0)return t;let C=d.truncateHead(b.join(`
8
- `),{maxLines:2**53-1}),w=C.truncated?`\n\n[${d.formatSize(d.maxBytes)} tagged output limit reached]`:``,T={...t.details,...C.truncated?{truncation:C}:{},...S?{linesTruncated:!0}:{}};return l(a),{...t,content:[{type:`text`,text:`${C.content}${h}${w}`}],details:Object.keys(T).length>0?T:void 0}}function o(n,r,i,a){let o=new Map;for(let s of n){let n=i?(0,t.resolve)(r,s.path):r,c=o.get(n);c||(c={path:(0,e.displayPath)(n,a),absolutePath:n,nativeRows:[],rows:new Map},o.set(n,c)),s.native!==void 0&&c.nativeRows.push(s.native),c.rows.set(s.line,s.match||c.rows.get(s.line)===!0)}return o}async function s(e,n,r,i,a){let o=new Map,s=[];for(let u of e.split(`
9
- `)){l(i);let e;for(let d of c(u)){if(!r){d.path===(0,t.basename)(n)&&s.push({...d,native:u});break}let c=(0,t.resolve)(n,d.path),f=o.get(c);f===void 0&&(f=await a.stat(c).then(e=>e.isFile()).catch(()=>!1),l(i),o.set(c,f)),f&&(e={...d,native:u})}e&&s.push(e)}return s}function c(e){let t=[];for(let n of e.matchAll(r))t.push({index:n.index,row:{path:e.slice(0,n.index),line:Number.parseInt(n[1]??``,10),match:!0}});for(let n of e.matchAll(i))t.push({index:n.index,row:{path:e.slice(0,n.index),line:Number.parseInt(n[1]??``,10),match:!1}});return t.sort((e,t)=>e.index-t.index).map(({row:e})=>e)}function l(e){if(e?.aborted)throw Error(`Operation aborted`)}exports.assertNotAborted=l,exports.groupGrepRows=o,exports.tagGrepResult=a;
10
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["resolveInputPath","splitLines","decodeUtf8","formatFileHeader","computeFileTag","formatTaggedLine","resolve","displayPath","basename"],"sources":["../../../src/services/grepTool/index.ts"],"sourcesContent":["import { basename, resolve } from 'node:path';\n\nimport { formatFileHeader, formatTaggedLine, splitLines } from '@agimon-ai/doompi-hashline';\nimport { computeFileTag, decodeUtf8, displayPath, resolveInputPath } from '@agimon-ai/doompi-hashline/files';\n\nimport type { GrepParams } from '../../schemas/grepTool';\n\nconst MATCH_DELIMITER = /:(\\d+): /gu;\nconst CONTEXT_DELIMITER = /-(\\d+)- /gu;\nconst NO_MATCHES = 'No matches found';\n\nexport interface GrepRow {\n readonly path: string;\n readonly line: number;\n readonly match: boolean;\n readonly native?: string;\n}\n\nexport interface GrepGroup {\n readonly path: string;\n readonly absolutePath: string;\n readonly nativeRows: string[];\n readonly rows: Map<number, boolean>;\n}\n\nexport interface GrepResult {\n content: Array<{ type: 'text'; text: string }>;\n details?: {\n readonly linesTruncated?: boolean;\n readonly truncation?: GrepTruncation;\n readonly [key: string]: unknown;\n };\n}\n\nexport interface GrepFileStats {\n isDirectory(): boolean;\n isFile(): boolean;\n}\n\nexport interface GrepFileSystem {\n stat(path: string): Promise<GrepFileStats>;\n readFile(path: string): Promise<Uint8Array>;\n}\n\nexport interface GrepTruncation {\n readonly content: string;\n readonly truncated: boolean;\n readonly truncatedBy: 'lines' | 'bytes' | null;\n readonly outputLines: number;\n}\n\nexport interface GrepOutputOperations {\n readonly maxBytes: number;\n formatSize(bytes: number): string;\n truncateHead(content: string, options: { readonly maxLines?: number }): GrepTruncation;\n truncateLine(line: string): { readonly text: string; readonly wasTruncated: boolean };\n}\nexport function parseGrepRow(value: string): GrepRow[] {\n return grepRowCandidates(value)\n .slice(0, 1)\n .map(({ line, match, path }) => ({ line, match, path }));\n}\n\nexport async function tagGrepResult(\n nativeResult: GrepResult,\n params: GrepParams,\n cwd: string,\n signal: AbortSignal | undefined,\n writable: (path: string) => Promise<boolean>,\n filesystem: GrepFileSystem,\n outputOperations: GrepOutputOperations,\n): Promise<GrepResult> {\n const textPart = nativeResult.content.find((part) => part.type === 'text');\n if (!textPart || textPart.text === NO_MATCHES) return nativeResult;\n\n const noticeIndex = textPart.text.lastIndexOf('\\n\\n[');\n const rowsText = noticeIndex === -1 ? textPart.text : textPart.text.slice(0, noticeIndex);\n const notice = noticeIndex === -1 ? '' : textPart.text.slice(noticeIndex);\n const searchPath = resolveInputPath(params.path ?? '.', cwd);\n const searchStats = await filesystem.stat(searchPath);\n assertNotAborted(signal);\n const rows = await parseValidatedGrepRows(rowsText, searchPath, searchStats.isDirectory(), signal, filesystem);\n if (rows.length === 0) return nativeResult;\n\n const groups = groupGrepRows(rows, searchPath, searchStats.isDirectory(), cwd);\n const blocks: string[] = [];\n let taggedFiles = 0;\n let linesTruncated = nativeResult.details?.linesTruncated ?? false;\n\n for (const group of groups.values()) {\n assertNotAborted(signal);\n const canEdit = await writable(group.absolutePath);\n assertNotAborted(signal);\n if (!canEdit) {\n blocks.push(group.nativeRows.join('\\n'));\n continue;\n }\n let bytes: Uint8Array;\n try {\n bytes = await filesystem.readFile(group.absolutePath);\n } catch {\n blocks.push(group.nativeRows.join('\\n'));\n continue;\n }\n assertNotAborted(signal);\n const lines = splitLines(decodeUtf8(bytes, group.path));\n const output = [formatFileHeader(group.path, computeFileTag(bytes))];\n for (const [lineNumber, isMatch] of [...group.rows].sort(([left], [right]) => left - right)) {\n const line = lines[lineNumber - 1];\n if (line === undefined) continue;\n const compact = outputOperations.truncateLine(line);\n if (compact.wasTruncated) linesTruncated = true;\n output.push(formatTaggedLine(compact.text, lineNumber, isMatch ? '>> ' : ' ', line));\n }\n if (output.length > 1) {\n blocks.push(output.join('\\n'));\n taggedFiles++;\n } else {\n blocks.push(group.nativeRows.join('\\n'));\n }\n }\n\n if (blocks.length === 0 || taggedFiles === 0) return nativeResult;\n const truncation = outputOperations.truncateHead(blocks.join('\\n'), { maxLines: Number.MAX_SAFE_INTEGER });\n const extraNotice = truncation.truncated\n ? `\\n\\n[${outputOperations.formatSize(outputOperations.maxBytes)} tagged output limit reached]`\n : '';\n const details = {\n ...nativeResult.details,\n ...(truncation.truncated ? { truncation } : {}),\n ...(linesTruncated ? { linesTruncated: true } : {}),\n };\n assertNotAborted(signal);\n return {\n ...nativeResult,\n content: [{ type: 'text', text: `${truncation.content}${notice}${extraNotice}` }],\n details: Object.keys(details).length > 0 ? details : undefined,\n };\n}\n\nexport function groupGrepRows(\n rows: readonly GrepRow[],\n searchPath: string,\n directory: boolean,\n cwd: string,\n): Map<string, GrepGroup> {\n const groups = new Map<string, GrepGroup>();\n for (const row of rows) {\n const absolutePath = directory ? resolve(searchPath, row.path) : searchPath;\n let group = groups.get(absolutePath);\n if (!group) {\n group = { path: displayPath(absolutePath, cwd), absolutePath, nativeRows: [], rows: new Map() };\n groups.set(absolutePath, group);\n }\n if (row.native !== undefined) group.nativeRows.push(row.native);\n group.rows.set(row.line, row.match || group.rows.get(row.line) === true);\n }\n return groups;\n}\n\nasync function parseValidatedGrepRows(\n rowsText: string,\n searchPath: string,\n directory: boolean,\n signal: AbortSignal | undefined,\n filesystem: GrepFileSystem,\n): Promise<GrepRow[]> {\n const pathCache = new Map<string, boolean>();\n const rows: GrepRow[] = [];\n for (const value of rowsText.split('\\n')) {\n assertNotAborted(signal);\n let resolvedCandidate: GrepRow | undefined;\n for (const candidate of grepRowCandidates(value)) {\n if (!directory) {\n if (candidate.path === basename(searchPath)) rows.push({ ...candidate, native: value });\n break;\n }\n const absolutePath = resolve(searchPath, candidate.path);\n let exists = pathCache.get(absolutePath);\n if (exists === undefined) {\n exists = await filesystem\n .stat(absolutePath)\n .then((value) => value.isFile())\n .catch(() => false);\n assertNotAborted(signal);\n pathCache.set(absolutePath, exists);\n }\n if (exists) resolvedCandidate = { ...candidate, native: value };\n }\n if (resolvedCandidate) rows.push(resolvedCandidate);\n }\n return rows;\n}\n\nfunction grepRowCandidates(value: string): GrepRow[] {\n const candidates: Array<{ readonly index: number; readonly row: GrepRow }> = [];\n for (const match of value.matchAll(MATCH_DELIMITER)) {\n candidates.push({\n index: match.index,\n row: { path: value.slice(0, match.index), line: Number.parseInt(match[1] ?? '', 10), match: true },\n });\n }\n for (const match of value.matchAll(CONTEXT_DELIMITER)) {\n candidates.push({\n index: match.index,\n row: { path: value.slice(0, match.index), line: Number.parseInt(match[1] ?? '', 10), match: false },\n });\n }\n return candidates.sort((left, right) => left.index - right.index).map(({ row }) => row);\n}\n\nexport function assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) throw new Error('Operation aborted');\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- import "../../schemas/grepTool.cjs";
@@ -1 +0,0 @@
1
- import "../../schemas/grepTool.mjs";
@@ -1,10 +0,0 @@
1
- import{computeFileTag as e,decodeUtf8 as t,displayPath as n,resolveInputPath as r}from"@agimon-ai/doompi-hashline/files";import{basename as i,resolve as a}from"node:path";import{formatFileHeader as o,formatTaggedLine as s,splitLines as c}from"@agimon-ai/doompi-hashline";const l=/:(\d+): /gu,u=/-(\d+)- /gu;async function d(n,i,a,l,u,d,m){let g=n.content.find(e=>e.type===`text`);if(!g||g.text===`No matches found`)return n;let _=g.text.lastIndexOf(`
2
-
3
- [`),v=_===-1?g.text:g.text.slice(0,_),y=_===-1?``:g.text.slice(_),b=r(i.path??`.`,a),x=await d.stat(b);h(l);let S=await p(v,b,x.isDirectory(),l,d);if(S.length===0)return n;let C=f(S,b,x.isDirectory(),a),w=[],T=0,E=n.details?.linesTruncated??!1;for(let n of C.values()){h(l);let r=await u(n.absolutePath);if(h(l),!r){w.push(n.nativeRows.join(`
4
- `));continue}let i;try{i=await d.readFile(n.absolutePath)}catch{w.push(n.nativeRows.join(`
5
- `));continue}h(l);let a=c(t(i,n.path)),f=[o(n.path,e(i))];for(let[e,t]of[...n.rows].sort(([e],[t])=>e-t)){let n=a[e-1];if(n===void 0)continue;let r=m.truncateLine(n);r.wasTruncated&&(E=!0),f.push(s(r.text,e,t?`>> `:` `,n))}f.length>1?(w.push(f.join(`
6
- `)),T++):w.push(n.nativeRows.join(`
7
- `))}if(w.length===0||T===0)return n;let D=m.truncateHead(w.join(`
8
- `),{maxLines:2**53-1}),O=D.truncated?`\n\n[${m.formatSize(m.maxBytes)} tagged output limit reached]`:``,k={...n.details,...D.truncated?{truncation:D}:{},...E?{linesTruncated:!0}:{}};return h(l),{...n,content:[{type:`text`,text:`${D.content}${y}${O}`}],details:Object.keys(k).length>0?k:void 0}}function f(e,t,r,i){let o=new Map;for(let s of e){let e=r?a(t,s.path):t,c=o.get(e);c||(c={path:n(e,i),absolutePath:e,nativeRows:[],rows:new Map},o.set(e,c)),s.native!==void 0&&c.nativeRows.push(s.native),c.rows.set(s.line,s.match||c.rows.get(s.line)===!0)}return o}async function p(e,t,n,r,o){let s=new Map,c=[];for(let l of e.split(`
9
- `)){h(r);let e;for(let u of m(l)){if(!n){u.path===i(t)&&c.push({...u,native:l});break}let d=a(t,u.path),f=s.get(d);f===void 0&&(f=await o.stat(d).then(e=>e.isFile()).catch(()=>!1),h(r),s.set(d,f)),f&&(e={...u,native:l})}e&&c.push(e)}return c}function m(e){let t=[];for(let n of e.matchAll(l))t.push({index:n.index,row:{path:e.slice(0,n.index),line:Number.parseInt(n[1]??``,10),match:!0}});for(let n of e.matchAll(u))t.push({index:n.index,row:{path:e.slice(0,n.index),line:Number.parseInt(n[1]??``,10),match:!1}});return t.sort((e,t)=>e.index-t.index).map(({row:e})=>e)}function h(e){if(e?.aborted)throw Error(`Operation aborted`)}export{h as assertNotAborted,f as groupGrepRows,d as tagGrepResult};
10
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/services/grepTool/index.ts"],"sourcesContent":["import { basename, resolve } from 'node:path';\n\nimport { formatFileHeader, formatTaggedLine, splitLines } from '@agimon-ai/doompi-hashline';\nimport { computeFileTag, decodeUtf8, displayPath, resolveInputPath } from '@agimon-ai/doompi-hashline/files';\n\nimport type { GrepParams } from '../../schemas/grepTool';\n\nconst MATCH_DELIMITER = /:(\\d+): /gu;\nconst CONTEXT_DELIMITER = /-(\\d+)- /gu;\nconst NO_MATCHES = 'No matches found';\n\nexport interface GrepRow {\n readonly path: string;\n readonly line: number;\n readonly match: boolean;\n readonly native?: string;\n}\n\nexport interface GrepGroup {\n readonly path: string;\n readonly absolutePath: string;\n readonly nativeRows: string[];\n readonly rows: Map<number, boolean>;\n}\n\nexport interface GrepResult {\n content: Array<{ type: 'text'; text: string }>;\n details?: {\n readonly linesTruncated?: boolean;\n readonly truncation?: GrepTruncation;\n readonly [key: string]: unknown;\n };\n}\n\nexport interface GrepFileStats {\n isDirectory(): boolean;\n isFile(): boolean;\n}\n\nexport interface GrepFileSystem {\n stat(path: string): Promise<GrepFileStats>;\n readFile(path: string): Promise<Uint8Array>;\n}\n\nexport interface GrepTruncation {\n readonly content: string;\n readonly truncated: boolean;\n readonly truncatedBy: 'lines' | 'bytes' | null;\n readonly outputLines: number;\n}\n\nexport interface GrepOutputOperations {\n readonly maxBytes: number;\n formatSize(bytes: number): string;\n truncateHead(content: string, options: { readonly maxLines?: number }): GrepTruncation;\n truncateLine(line: string): { readonly text: string; readonly wasTruncated: boolean };\n}\nexport function parseGrepRow(value: string): GrepRow[] {\n return grepRowCandidates(value)\n .slice(0, 1)\n .map(({ line, match, path }) => ({ line, match, path }));\n}\n\nexport async function tagGrepResult(\n nativeResult: GrepResult,\n params: GrepParams,\n cwd: string,\n signal: AbortSignal | undefined,\n writable: (path: string) => Promise<boolean>,\n filesystem: GrepFileSystem,\n outputOperations: GrepOutputOperations,\n): Promise<GrepResult> {\n const textPart = nativeResult.content.find((part) => part.type === 'text');\n if (!textPart || textPart.text === NO_MATCHES) return nativeResult;\n\n const noticeIndex = textPart.text.lastIndexOf('\\n\\n[');\n const rowsText = noticeIndex === -1 ? textPart.text : textPart.text.slice(0, noticeIndex);\n const notice = noticeIndex === -1 ? '' : textPart.text.slice(noticeIndex);\n const searchPath = resolveInputPath(params.path ?? '.', cwd);\n const searchStats = await filesystem.stat(searchPath);\n assertNotAborted(signal);\n const rows = await parseValidatedGrepRows(rowsText, searchPath, searchStats.isDirectory(), signal, filesystem);\n if (rows.length === 0) return nativeResult;\n\n const groups = groupGrepRows(rows, searchPath, searchStats.isDirectory(), cwd);\n const blocks: string[] = [];\n let taggedFiles = 0;\n let linesTruncated = nativeResult.details?.linesTruncated ?? false;\n\n for (const group of groups.values()) {\n assertNotAborted(signal);\n const canEdit = await writable(group.absolutePath);\n assertNotAborted(signal);\n if (!canEdit) {\n blocks.push(group.nativeRows.join('\\n'));\n continue;\n }\n let bytes: Uint8Array;\n try {\n bytes = await filesystem.readFile(group.absolutePath);\n } catch {\n blocks.push(group.nativeRows.join('\\n'));\n continue;\n }\n assertNotAborted(signal);\n const lines = splitLines(decodeUtf8(bytes, group.path));\n const output = [formatFileHeader(group.path, computeFileTag(bytes))];\n for (const [lineNumber, isMatch] of [...group.rows].sort(([left], [right]) => left - right)) {\n const line = lines[lineNumber - 1];\n if (line === undefined) continue;\n const compact = outputOperations.truncateLine(line);\n if (compact.wasTruncated) linesTruncated = true;\n output.push(formatTaggedLine(compact.text, lineNumber, isMatch ? '>> ' : ' ', line));\n }\n if (output.length > 1) {\n blocks.push(output.join('\\n'));\n taggedFiles++;\n } else {\n blocks.push(group.nativeRows.join('\\n'));\n }\n }\n\n if (blocks.length === 0 || taggedFiles === 0) return nativeResult;\n const truncation = outputOperations.truncateHead(blocks.join('\\n'), { maxLines: Number.MAX_SAFE_INTEGER });\n const extraNotice = truncation.truncated\n ? `\\n\\n[${outputOperations.formatSize(outputOperations.maxBytes)} tagged output limit reached]`\n : '';\n const details = {\n ...nativeResult.details,\n ...(truncation.truncated ? { truncation } : {}),\n ...(linesTruncated ? { linesTruncated: true } : {}),\n };\n assertNotAborted(signal);\n return {\n ...nativeResult,\n content: [{ type: 'text', text: `${truncation.content}${notice}${extraNotice}` }],\n details: Object.keys(details).length > 0 ? details : undefined,\n };\n}\n\nexport function groupGrepRows(\n rows: readonly GrepRow[],\n searchPath: string,\n directory: boolean,\n cwd: string,\n): Map<string, GrepGroup> {\n const groups = new Map<string, GrepGroup>();\n for (const row of rows) {\n const absolutePath = directory ? resolve(searchPath, row.path) : searchPath;\n let group = groups.get(absolutePath);\n if (!group) {\n group = { path: displayPath(absolutePath, cwd), absolutePath, nativeRows: [], rows: new Map() };\n groups.set(absolutePath, group);\n }\n if (row.native !== undefined) group.nativeRows.push(row.native);\n group.rows.set(row.line, row.match || group.rows.get(row.line) === true);\n }\n return groups;\n}\n\nasync function parseValidatedGrepRows(\n rowsText: string,\n searchPath: string,\n directory: boolean,\n signal: AbortSignal | undefined,\n filesystem: GrepFileSystem,\n): Promise<GrepRow[]> {\n const pathCache = new Map<string, boolean>();\n const rows: GrepRow[] = [];\n for (const value of rowsText.split('\\n')) {\n assertNotAborted(signal);\n let resolvedCandidate: GrepRow | undefined;\n for (const candidate of grepRowCandidates(value)) {\n if (!directory) {\n if (candidate.path === basename(searchPath)) rows.push({ ...candidate, native: value });\n break;\n }\n const absolutePath = resolve(searchPath, candidate.path);\n let exists = pathCache.get(absolutePath);\n if (exists === undefined) {\n exists = await filesystem\n .stat(absolutePath)\n .then((value) => value.isFile())\n .catch(() => false);\n assertNotAborted(signal);\n pathCache.set(absolutePath, exists);\n }\n if (exists) resolvedCandidate = { ...candidate, native: value };\n }\n if (resolvedCandidate) rows.push(resolvedCandidate);\n }\n return rows;\n}\n\nfunction grepRowCandidates(value: string): GrepRow[] {\n const candidates: Array<{ readonly index: number; readonly row: GrepRow }> = [];\n for (const match of value.matchAll(MATCH_DELIMITER)) {\n candidates.push({\n index: match.index,\n row: { path: value.slice(0, match.index), line: Number.parseInt(match[1] ?? '', 10), match: true },\n });\n }\n for (const match of value.matchAll(CONTEXT_DELIMITER)) {\n candidates.push({\n index: match.index,\n row: { path: value.slice(0, match.index), line: Number.parseInt(match[1] ?? '', 10), match: false },\n });\n }\n return candidates.sort((left, right) => left.index - right.index).map(({ row }) => row);\n}\n\nexport function assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) throw new Error('Operation aborted');\n}\n"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- const e=require("../../schemas/grepTool.cjs"),t=require("../grepTool/index.cjs");let n=require("node:fs/promises"),r=require("@agimon-ai/doompi-hashline/files"),i=require("@earendil-works/pi-coding-agent"),a=require("node:path"),o=require("node:child_process");const s={stat:e=>(0,n.stat)(e),readFile:e=>(0,n.readFile)(e)},c={maxBytes:i.DEFAULT_MAX_BYTES,formatSize:i.formatSize,truncateHead:i.truncateHead,truncateLine:i.truncateLine};function l(){return{name:`grep`,label:`grep`,description:`Search file contents using ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Respects .gitignore.`,promptSnippet:`Search file contents and return editable hashline anchors`,parameters:e.GrepParamsSchema,executionMode:`parallel`,execute:async(e,n,i,a,o)=>{let l=n,d=await u(l,o.cwd,i);return t.tagGrepResult(d,l,o.cwd,i,r.isWritableFile,s,c)}}}async function u(e,t,n){let i=(0,r.resolveInputPath)(e.path??`.`,t),o=(0,a.relative)(t,i)||`.`,s=[`--color`,`never`,`--no-heading`,`--with-filename`,`--line-number`];e.ignoreCase===!0&&s.push(`--ignore-case`),e.literal===!0&&s.push(`--fixed-strings`),e.context!==void 0&&s.push(`--context`,String(e.context)),e.glob!==void 0&&s.push(`--glob`,e.glob),s.push(`--`,e.pattern,o);let c=await f(s,t,n);return c.trim()===``?{content:[{type:`text`,text:`No matches found`}]}:{content:[{type:`text`,text:d(c,e.limit)}]}}function d(e,t){if(t===void 0)return e.trimEnd();let n=0,r=e.trimEnd().split(`
2
- `),i=[];for(let e of r)/:(\d+):/u.test(e)&&(n++,n>t)||i.push(e);return i.join(`
3
- `)}function f(e,t,n){return new Promise((r,i)=>{let a=(0,o.spawn)(`rg`,e,{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]}),s=``,c=``;a.stdout.on(`data`,e=>{s+=e.toString()}),a.stderr.on(`data`,e=>{c+=e.toString()});let l=()=>{a.kill(`SIGTERM`),i(Error(`Operation aborted`))};if(n?.aborted){l();return}n?.addEventListener(`abort`,l,{once:!0}),a.once(`error`,e=>{n?.removeEventListener(`abort`,l),i(Error(`Could not start ripgrep: ${e.message}`,{cause:e}))}),a.once(`close`,e=>{if(n?.removeEventListener(`abort`,l),e===0||e===1){r(s);return}i(Error(c.trim()||`ripgrep exited with code ${e??`unknown`}`))})})}exports.createHeadlessGrepTool=l;
4
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["stat","readFile","DEFAULT_MAX_BYTES","GrepParamsSchema","tagServiceGrepResult","isWritableFile","resolveInputPath","relative","spawn"],"sources":["../../../src/services/headlessGrep/index.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { readFile, stat } from 'node:fs/promises';\nimport { relative } from 'node:path';\n\nimport type {\n DoomHeadlessExecutionContext,\n DoomHeadlessTool,\n DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport { resolveInputPath, isWritableFile } from '@agimon-ai/doompi-hashline/files';\nimport { DEFAULT_MAX_BYTES, formatSize, truncateHead, truncateLine } from '@earendil-works/pi-coding-agent';\n\nimport { GrepParamsSchema, type GrepParams } from '../../schemas/grepTool';\nimport {\n type GrepFileSystem,\n type GrepOutputOperations,\n type GrepResult,\n tagGrepResult as tagServiceGrepResult,\n} from '../grepTool';\n\nconst fileSystem: GrepFileSystem = {\n stat: (path) => stat(path),\n readFile: (path) => readFile(path),\n};\n\nconst outputOperations: GrepOutputOperations = {\n maxBytes: DEFAULT_MAX_BYTES,\n formatSize,\n truncateHead,\n truncateLine,\n};\n\nexport function createHeadlessGrepTool(): DoomHeadlessTool<typeof GrepParamsSchema> {\n return {\n name: 'grep',\n label: 'grep',\n description:\n 'Search file contents using ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Respects .gitignore.',\n promptSnippet: 'Search file contents and return editable hashline anchors',\n parameters: GrepParamsSchema,\n executionMode: 'parallel',\n execute: async (\n _toolCallId: string,\n params: GrepParams,\n signal: AbortSignal | undefined,\n _onUpdate: ((result: DoomHeadlessToolResult) => void) | undefined,\n context: DoomHeadlessExecutionContext,\n ) => {\n const input = params as GrepParams;\n const result = await runRipgrep(input, context.cwd, signal);\n return tagServiceGrepResult(result, input, context.cwd, signal, isWritableFile, fileSystem, outputOperations);\n },\n };\n}\n\nasync function runRipgrep(params: GrepParams, cwd: string, signal: AbortSignal | undefined): Promise<GrepResult> {\n const target = resolveInputPath(params.path ?? '.', cwd);\n const targetArg = relative(cwd, target) || '.';\n const args = ['--color', 'never', '--no-heading', '--with-filename', '--line-number'];\n if (params.ignoreCase === true) args.push('--ignore-case');\n if (params.literal === true) args.push('--fixed-strings');\n if (params.context !== undefined) args.push('--context', String(params.context));\n if (params.glob !== undefined) args.push('--glob', params.glob);\n args.push('--', params.pattern, targetArg);\n\n const output = await spawnRipgrep(args, cwd, signal);\n if (output.trim() === '') return { content: [{ type: 'text', text: 'No matches found' }] };\n return { content: [{ type: 'text', text: limitMatches(output, params.limit) }] };\n}\n\nfunction limitMatches(output: string, limit: number | undefined): string {\n if (limit === undefined) return output.trimEnd();\n let matches = 0;\n const lines = output.trimEnd().split('\\n');\n const selected: string[] = [];\n for (const line of lines) {\n if (/:(\\d+):/u.test(line)) {\n matches++;\n if (matches > limit) continue;\n }\n selected.push(line);\n }\n return selected.join('\\n');\n}\n\nfunction spawnRipgrep(args: readonly string[], cwd: string, signal: AbortSignal | undefined): Promise<string> {\n return new Promise((resolveOutput, reject) => {\n const child = spawn('rg', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n const abort = (): void => {\n child.kill('SIGTERM');\n reject(new Error('Operation aborted'));\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n signal?.addEventListener('abort', abort, { once: true });\n child.once('error', (error) => {\n signal?.removeEventListener('abort', abort);\n reject(new Error(`Could not start ripgrep: ${error.message}`, { cause: error }));\n });\n child.once('close', (code) => {\n signal?.removeEventListener('abort', abort);\n if (code === 0 || code === 1) {\n resolveOutput(stdout);\n return;\n }\n reject(new Error(stderr.trim() || `ripgrep exited with code ${code ?? 'unknown'}`));\n });\n });\n}\n"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import { GrepParamsSchema } from "../../schemas/grepTool.cjs";
2
- import { DoomHeadlessTool } from "@agimon-ai/doompi-core/headless";
3
- //#region src/services/headlessGrep/index.d.ts
4
- export declare function createHeadlessGrepTool(): DoomHeadlessTool<typeof GrepParamsSchema>;
5
- //#endregion
6
- //# sourceMappingURL=index.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/services/headlessGrep/index.ts"],"mappings":";;;wBAgCgB,0BAA0B,wBAAwB"}
@@ -1,6 +0,0 @@
1
- import { GrepParamsSchema } from "../../schemas/grepTool.mjs";
2
- import { DoomHeadlessTool } from "@agimon-ai/doompi-core/headless";
3
- //#region src/services/headlessGrep/index.d.ts
4
- export declare function createHeadlessGrepTool(): DoomHeadlessTool<typeof GrepParamsSchema>;
5
- //#endregion
6
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/headlessGrep/index.ts"],"mappings":";;;wBAgCgB,0BAA0B,wBAAwB"}
@@ -1,4 +0,0 @@
1
- import{GrepParamsSchema as e}from"../../schemas/grepTool.mjs";import{tagGrepResult as t}from"../grepTool/index.mjs";import{readFile as n,stat as r}from"node:fs/promises";import{isWritableFile as i,resolveInputPath as a}from"@agimon-ai/doompi-hashline/files";import{DEFAULT_MAX_BYTES as o,formatSize as s,truncateHead as c,truncateLine as l}from"@earendil-works/pi-coding-agent";import{relative as u}from"node:path";import{spawn as d}from"node:child_process";const f={stat:e=>r(e),readFile:e=>n(e)},p={maxBytes:o,formatSize:s,truncateHead:c,truncateLine:l};function m(){return{name:`grep`,label:`grep`,description:`Search file contents using ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Respects .gitignore.`,promptSnippet:`Search file contents and return editable hashline anchors`,parameters:e,executionMode:`parallel`,execute:async(e,n,r,a,o)=>{let s=n,c=await h(s,o.cwd,r);return t(c,s,o.cwd,r,i,f,p)}}}async function h(e,t,n){let r=a(e.path??`.`,t),i=u(t,r)||`.`,o=[`--color`,`never`,`--no-heading`,`--with-filename`,`--line-number`];e.ignoreCase===!0&&o.push(`--ignore-case`),e.literal===!0&&o.push(`--fixed-strings`),e.context!==void 0&&o.push(`--context`,String(e.context)),e.glob!==void 0&&o.push(`--glob`,e.glob),o.push(`--`,e.pattern,i);let s=await _(o,t,n);return s.trim()===``?{content:[{type:`text`,text:`No matches found`}]}:{content:[{type:`text`,text:g(s,e.limit)}]}}function g(e,t){if(t===void 0)return e.trimEnd();let n=0,r=e.trimEnd().split(`
2
- `),i=[];for(let e of r)/:(\d+):/u.test(e)&&(n++,n>t)||i.push(e);return i.join(`
3
- `)}function _(e,t,n){return new Promise((r,i)=>{let a=d(`rg`,e,{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]}),o=``,s=``;a.stdout.on(`data`,e=>{o+=e.toString()}),a.stderr.on(`data`,e=>{s+=e.toString()});let c=()=>{a.kill(`SIGTERM`),i(Error(`Operation aborted`))};if(n?.aborted){c();return}n?.addEventListener(`abort`,c,{once:!0}),a.once(`error`,e=>{n?.removeEventListener(`abort`,c),i(Error(`Could not start ripgrep: ${e.message}`,{cause:e}))}),a.once(`close`,e=>{if(n?.removeEventListener(`abort`,c),e===0||e===1){r(o);return}i(Error(s.trim()||`ripgrep exited with code ${e??`unknown`}`))})})}export{m as createHeadlessGrepTool};
4
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["tagServiceGrepResult"],"sources":["../../../src/services/headlessGrep/index.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { readFile, stat } from 'node:fs/promises';\nimport { relative } from 'node:path';\n\nimport type {\n DoomHeadlessExecutionContext,\n DoomHeadlessTool,\n DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\nimport { resolveInputPath, isWritableFile } from '@agimon-ai/doompi-hashline/files';\nimport { DEFAULT_MAX_BYTES, formatSize, truncateHead, truncateLine } from '@earendil-works/pi-coding-agent';\n\nimport { GrepParamsSchema, type GrepParams } from '../../schemas/grepTool';\nimport {\n type GrepFileSystem,\n type GrepOutputOperations,\n type GrepResult,\n tagGrepResult as tagServiceGrepResult,\n} from '../grepTool';\n\nconst fileSystem: GrepFileSystem = {\n stat: (path) => stat(path),\n readFile: (path) => readFile(path),\n};\n\nconst outputOperations: GrepOutputOperations = {\n maxBytes: DEFAULT_MAX_BYTES,\n formatSize,\n truncateHead,\n truncateLine,\n};\n\nexport function createHeadlessGrepTool(): DoomHeadlessTool<typeof GrepParamsSchema> {\n return {\n name: 'grep',\n label: 'grep',\n description:\n 'Search file contents using ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Respects .gitignore.',\n promptSnippet: 'Search file contents and return editable hashline anchors',\n parameters: GrepParamsSchema,\n executionMode: 'parallel',\n execute: async (\n _toolCallId: string,\n params: GrepParams,\n signal: AbortSignal | undefined,\n _onUpdate: ((result: DoomHeadlessToolResult) => void) | undefined,\n context: DoomHeadlessExecutionContext,\n ) => {\n const input = params as GrepParams;\n const result = await runRipgrep(input, context.cwd, signal);\n return tagServiceGrepResult(result, input, context.cwd, signal, isWritableFile, fileSystem, outputOperations);\n },\n };\n}\n\nasync function runRipgrep(params: GrepParams, cwd: string, signal: AbortSignal | undefined): Promise<GrepResult> {\n const target = resolveInputPath(params.path ?? '.', cwd);\n const targetArg = relative(cwd, target) || '.';\n const args = ['--color', 'never', '--no-heading', '--with-filename', '--line-number'];\n if (params.ignoreCase === true) args.push('--ignore-case');\n if (params.literal === true) args.push('--fixed-strings');\n if (params.context !== undefined) args.push('--context', String(params.context));\n if (params.glob !== undefined) args.push('--glob', params.glob);\n args.push('--', params.pattern, targetArg);\n\n const output = await spawnRipgrep(args, cwd, signal);\n if (output.trim() === '') return { content: [{ type: 'text', text: 'No matches found' }] };\n return { content: [{ type: 'text', text: limitMatches(output, params.limit) }] };\n}\n\nfunction limitMatches(output: string, limit: number | undefined): string {\n if (limit === undefined) return output.trimEnd();\n let matches = 0;\n const lines = output.trimEnd().split('\\n');\n const selected: string[] = [];\n for (const line of lines) {\n if (/:(\\d+):/u.test(line)) {\n matches++;\n if (matches > limit) continue;\n }\n selected.push(line);\n }\n return selected.join('\\n');\n}\n\nfunction spawnRipgrep(args: readonly string[], cwd: string, signal: AbortSignal | undefined): Promise<string> {\n return new Promise((resolveOutput, reject) => {\n const child = spawn('rg', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n const abort = (): void => {\n child.kill('SIGTERM');\n reject(new Error('Operation aborted'));\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n signal?.addEventListener('abort', abort, { once: true });\n child.once('error', (error) => {\n signal?.removeEventListener('abort', abort);\n reject(new Error(`Could not start ripgrep: ${error.message}`, { cause: error }));\n });\n child.once('close', (code) => {\n signal?.removeEventListener('abort', abort);\n if (code === 0 || code === 1) {\n resolveOutput(stdout);\n return;\n }\n reject(new Error(stderr.trim() || `ripgrep exited with code ${code ?? 'unknown'}`));\n });\n });\n}\n"],"mappings":"0cAoBA,MAAM,EAA6B,CACjC,KAAO,GAAS,EAAK,CAAI,EACzB,SAAW,GAAS,EAAS,CAAI,CACnC,EAEM,EAAyC,CAC7C,SAAU,EACV,aACA,eACA,cACF,EAEA,SAAgB,GAAoE,CAClF,MAAO,CACL,KAAM,OACN,MAAO,OACP,YACE,iJACF,cAAe,4DACf,WAAY,EACZ,cAAe,WACf,QAAS,MACP,EACA,EACA,EACA,EACA,IACG,CACH,IAAM,EAAQ,EACR,EAAS,MAAM,EAAW,EAAO,EAAQ,IAAK,CAAM,EAC1D,OAAOA,EAAqB,EAAQ,EAAO,EAAQ,IAAK,EAAQ,EAAgB,EAAY,CAAgB,CAC9G,CACF,CACF,CAEA,eAAe,EAAW,EAAoB,EAAa,EAAsD,CAC/G,IAAM,EAAS,EAAiB,EAAO,MAAQ,IAAK,CAAG,EACjD,EAAY,EAAS,EAAK,CAAM,GAAK,IACrC,EAAO,CAAC,UAAW,QAAS,eAAgB,kBAAmB,eAAe,EAChF,EAAO,aAAe,IAAM,EAAK,KAAK,eAAe,EACrD,EAAO,UAAY,IAAM,EAAK,KAAK,iBAAiB,EACpD,EAAO,UAAY,IAAA,IAAW,EAAK,KAAK,YAAa,OAAO,EAAO,OAAO,CAAC,EAC3E,EAAO,OAAS,IAAA,IAAW,EAAK,KAAK,SAAU,EAAO,IAAI,EAC9D,EAAK,KAAK,KAAM,EAAO,QAAS,CAAS,EAEzC,IAAM,EAAS,MAAM,EAAa,EAAM,EAAK,CAAM,EAEnD,OADI,EAAO,KAAK,IAAM,GAAW,CAAE,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,kBAAmB,CAAC,CAAE,EAClF,CAAE,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,EAAa,EAAQ,EAAO,KAAK,CAAE,CAAC,CAAE,CACjF,CAEA,SAAS,EAAa,EAAgB,EAAmC,CACvE,GAAI,IAAU,IAAA,GAAW,OAAO,EAAO,QAAQ,EAC/C,IAAI,EAAU,EACR,EAAQ,EAAO,QAAQ,CAAC,CAAC,MAAM;CAAI,EACnC,EAAqB,CAAC,EAC5B,IAAK,IAAM,KAAQ,EACb,WAAW,KAAK,CAAI,IACtB,IACI,EAAU,IAEhB,EAAS,KAAK,CAAI,EAEpB,OAAO,EAAS,KAAK;CAAI,CAC3B,CAEA,SAAS,EAAa,EAAyB,EAAa,EAAkD,CAC5G,OAAO,IAAI,SAAS,EAAe,IAAW,CAC5C,IAAM,EAAQ,EAAM,KAAM,EAAM,CAAE,MAAK,MAAO,CAAC,SAAU,OAAQ,MAAM,CAAE,CAAC,EACtE,EAAS,GACT,EAAS,GACb,EAAM,OAAO,GAAG,OAAS,GAAkB,CACzC,GAAU,EAAM,SAAS,CAC3B,CAAC,EACD,EAAM,OAAO,GAAG,OAAS,GAAkB,CACzC,GAAU,EAAM,SAAS,CAC3B,CAAC,EACD,IAAM,MAAoB,CACxB,EAAM,KAAK,SAAS,EACpB,EAAW,MAAM,mBAAmB,CAAC,CACvC,EACA,GAAI,GAAQ,QAAS,CACnB,EAAM,EACN,MACF,CACA,GAAQ,iBAAiB,QAAS,EAAO,CAAE,KAAM,EAAK,CAAC,EACvD,EAAM,KAAK,QAAU,GAAU,CAC7B,GAAQ,oBAAoB,QAAS,CAAK,EAC1C,EAAW,MAAM,4BAA4B,EAAM,UAAW,CAAE,MAAO,CAAM,CAAC,CAAC,CACjF,CAAC,EACD,EAAM,KAAK,QAAU,GAAS,CAE5B,GADA,GAAQ,oBAAoB,QAAS,CAAK,EACtC,IAAS,GAAK,IAAS,EAAG,CAC5B,EAAc,CAAM,EACpB,MACF,CACA,EAAW,MAAM,EAAO,KAAK,GAAK,4BAA4B,GAAQ,WAAW,CAAC,CACpF,CAAC,CACH,CAAC,CACH"}
@@ -1,2 +0,0 @@
1
- const e=require("../schemas/grepTool.cjs"),t=require("../services/grepTool/index.cjs");let n=require("node:fs/promises"),r=require("@agimon-ai/doompi-hashline/files"),i=require("@agimon-ai/doompi-ui/hashlineRendering"),a=require("@earendil-works/pi-coding-agent");const o={stat:e=>(0,n.stat)(e),readFile:e=>(0,n.readFile)(e)},s={maxBytes:a.DEFAULT_MAX_BYTES,formatSize:a.formatSize,truncateHead:a.truncateHead,truncateLine:a.truncateLine};async function c(e,n,i,a,c=r.isWritableFile){return t.tagGrepResult(e,n,i,a,c,o,s)}function l(n=r.isWritableFile){return{name:`grep`,label:`grep`,description:`Search file contents using Pi-compatible ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Non-writable matches retain native Pi output. Respects .gitignore.`,promptSnippet:`Search file contents and return editable hashline anchors`,parameters:e.GrepParamsSchema,executionMode:`parallel`,renderShell:`self`,async execute(e,r,i,o,s){let l=r,u=await(0,a.createGrepToolDefinition)(s.cwd).execute(e,l,i,o,s);return t.assertNotAborted(i),c(u,l,s.cwd,i,n)},renderCall(e,t){let n=e,r=[n.path??`.`,n.glob,n.ignoreCase===!0?`ignore case`:void 0,n.limit===void 0?void 0:`${n.limit} matches`].filter(e=>e!==void 0);return(0,i.renderHashlineCall)(`grep`,n.pattern,r,t)},renderResult(e,t,n,r){return(0,i.renderHashlineResult)(e,t,n,r,`grep`)}}}exports.createHashlineGrepTool=l,exports.tagGrepResult=c;
2
- //# sourceMappingURL=piGrep.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"piGrep.cjs","names":["stat","readFile","DEFAULT_MAX_BYTES","isWritableFile","tagServiceGrepResult","GrepParamsSchema","createGrepToolDefinition","renderHashlineCall","renderHashlineResult"],"sources":["../../src/tools/piGrep.ts"],"sourcesContent":["import { readFile, stat } from 'node:fs/promises';\n\nimport { isWritableFile } from '@agimon-ai/doompi-hashline/files';\nimport { renderHashlineCall, renderHashlineResult } from '@agimon-ai/doompi-ui/hashlineRendering';\nimport {\n DEFAULT_MAX_BYTES,\n formatSize,\n truncateHead,\n truncateLine,\n createGrepToolDefinition,\n type AgentToolResult,\n type ToolDefinition,\n} from '@earendil-works/pi-coding-agent';\n\nimport { GrepParamsSchema, type GrepParams } from '../schemas/grepTool';\nimport {\n assertNotAborted,\n type GrepFileSystem,\n type GrepOutputOperations,\n type GrepResult,\n tagGrepResult as tagServiceGrepResult,\n} from '../services/grepTool';\n\nconst fileSystem: GrepFileSystem = {\n stat: (path) => stat(path),\n readFile: (path) => readFile(path),\n};\n\nconst outputOperations: GrepOutputOperations = {\n maxBytes: DEFAULT_MAX_BYTES,\n formatSize,\n truncateHead,\n truncateLine,\n};\n\nexport async function tagGrepResult(\n nativeResult: GrepResult,\n params: GrepParams,\n cwd: string,\n signal: AbortSignal | undefined,\n writable: WritableCheck = isWritableFile,\n): Promise<GrepResult> {\n return tagServiceGrepResult(nativeResult, params, cwd, signal, writable, fileSystem, outputOperations);\n}\n\nexport { groupGrepRows, parseGrepRow } from '../services/grepTool';\nexport type { GrepGroup, GrepRow } from '../services/grepTool';\n\ntype WritableCheck = (path: string) => Promise<boolean>;\n\n/** Register only the snapshot-bound replacement for Pi's grep tool. */\nexport function createHashlineGrepTool(\n writable: WritableCheck = isWritableFile,\n): ToolDefinition<typeof GrepParamsSchema> {\n return {\n name: 'grep',\n label: 'grep',\n description:\n 'Search file contents using Pi-compatible ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Non-writable matches retain native Pi output. Respects .gitignore.',\n promptSnippet: 'Search file contents and return editable hashline anchors',\n parameters: GrepParamsSchema,\n executionMode: 'parallel',\n renderShell: 'self',\n async execute(toolCallId, params, signal, onUpdate, ctx) {\n const input = params as GrepParams;\n const nativeGrep = createGrepToolDefinition(ctx.cwd);\n const nativeResult = await nativeGrep.execute(toolCallId, input, signal, onUpdate, ctx);\n assertNotAborted(signal);\n return tagGrepResult(\n nativeResult as GrepResult,\n input,\n ctx.cwd,\n signal,\n writable,\n ) as unknown as AgentToolResult<unknown>;\n },\n renderCall(args, theme) {\n const input = args as GrepParams;\n const details = [\n input.path ?? '.',\n input.glob,\n input.ignoreCase === true ? 'ignore case' : undefined,\n input.limit === undefined ? undefined : `${input.limit} matches`,\n ].filter((value): value is string => value !== undefined);\n return renderHashlineCall('grep', input.pattern, details, theme);\n },\n renderResult(result, options, theme, context) {\n return renderHashlineResult(result, options, theme, context, 'grep');\n },\n };\n}\n"],"mappings":"wQAuBA,MAAM,EAA6B,CACjC,KAAO,IAAA,EAASA,EAAAA,KAAAA,CAAK,CAAI,EACzB,SAAW,IAAA,EAASC,EAAAA,SAAAA,CAAS,CAAI,CACnC,EAEM,EAAyC,CAC7C,SAAUC,EAAAA,kBACV,WAAA,EAAA,WACA,aAAA,EAAA,aACA,aAAA,EAAA,YACF,EAEA,eAAsB,EACpB,EACA,EACA,EACA,EACA,EAA0BC,EAAAA,eACL,CACrB,OAAOC,EAAAA,cAAqB,EAAc,EAAQ,EAAK,EAAQ,EAAU,EAAY,CAAgB,CACvG,CAQA,SAAgB,EACd,EAA0BD,EAAAA,eACe,CACzC,MAAO,CACL,KAAM,OACN,MAAO,OACP,YACE,6MACF,cAAe,4DACf,WAAYE,EAAAA,iBACZ,cAAe,WACf,YAAa,OACb,MAAM,QAAQ,EAAY,EAAQ,EAAQ,EAAU,EAAK,CACvD,IAAM,EAAQ,EAER,EAAe,MAAA,EADFC,EAAAA,yBAAAA,CAAyB,EAAI,GACZ,CAAC,CAAC,QAAQ,EAAY,EAAO,EAAQ,EAAU,CAAG,EAEtF,OADA,EAAA,iBAAiB,CAAM,EAChB,EACL,EACA,EACA,EAAI,IACJ,EACA,CACF,CACF,EACA,WAAW,EAAM,EAAO,CACtB,IAAM,EAAQ,EACR,EAAU,CACd,EAAM,MAAQ,IACd,EAAM,KACN,EAAM,aAAe,GAAO,cAAgB,IAAA,GAC5C,EAAM,QAAU,IAAA,GAAY,IAAA,GAAY,GAAG,EAAM,MAAM,SACzD,CAAC,CAAC,OAAQ,GAA2B,IAAU,IAAA,EAAS,EACxD,OAAA,EAAOC,EAAAA,mBAAAA,CAAmB,OAAQ,EAAM,QAAS,EAAS,CAAK,CACjE,EACA,aAAa,EAAQ,EAAS,EAAO,EAAS,CAC5C,OAAA,EAAOC,EAAAA,qBAAAA,CAAqB,EAAQ,EAAS,EAAO,EAAS,MAAM,CACrE,CACF,CACF"}
@@ -1,9 +0,0 @@
1
- import { GrepParamsSchema } from "../schemas/grepTool.cjs";
2
- import "../services/grepTool/index.cjs";
3
- import { ToolDefinition } from "@earendil-works/pi-coding-agent";
4
- //#region src/tools/piGrep.d.ts
5
- type WritableCheck = (path: string) => Promise<boolean>;
6
- /** Register only the snapshot-bound replacement for Pi's grep tool. */
7
- export declare function createHashlineGrepTool(writable?: WritableCheck): ToolDefinition<typeof GrepParamsSchema>;
8
- //#endregion
9
- //# sourceMappingURL=piGrep.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"piGrep.d.cts","names":[],"sources":["../../src/tools/piGrep.ts"],"mappings":";;;;KAgDK,iBAAiB,iBAAiB;;wBAGvB,uBACd,WAAU,gBACT,sBAAsB"}
@@ -1,9 +0,0 @@
1
- import { GrepParamsSchema } from "../schemas/grepTool.mjs";
2
- import "../services/grepTool/index.mjs";
3
- import { ToolDefinition } from "@earendil-works/pi-coding-agent";
4
- //#region src/tools/piGrep.d.ts
5
- type WritableCheck = (path: string) => Promise<boolean>;
6
- /** Register only the snapshot-bound replacement for Pi's grep tool. */
7
- export declare function createHashlineGrepTool(writable?: WritableCheck): ToolDefinition<typeof GrepParamsSchema>;
8
- //#endregion
9
- //# sourceMappingURL=piGrep.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"piGrep.d.mts","names":[],"sources":["../../src/tools/piGrep.ts"],"mappings":";;;;KAgDK,iBAAiB,iBAAiB;;wBAGvB,uBACd,WAAU,gBACT,sBAAsB"}
@@ -1,2 +0,0 @@
1
- import{GrepParamsSchema as e}from"../schemas/grepTool.mjs";import{assertNotAborted as t,tagGrepResult as n}from"../services/grepTool/index.mjs";import{readFile as r,stat as i}from"node:fs/promises";import{isWritableFile as a}from"@agimon-ai/doompi-hashline/files";import{renderHashlineCall as o,renderHashlineResult as s}from"@agimon-ai/doompi-ui/hashlineRendering";import{DEFAULT_MAX_BYTES as c,createGrepToolDefinition as l,formatSize as u,truncateHead as d,truncateLine as f}from"@earendil-works/pi-coding-agent";const p={stat:e=>i(e),readFile:e=>r(e)},m={maxBytes:c,formatSize:u,truncateHead:d,truncateLine:f};async function h(e,t,r,i,o=a){return n(e,t,r,i,o,p,m)}function g(n=a){return{name:`grep`,label:`grep`,description:`Search file contents using Pi-compatible ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Non-writable matches retain native Pi output. Respects .gitignore.`,promptSnippet:`Search file contents and return editable hashline anchors`,parameters:e,executionMode:`parallel`,renderShell:`self`,async execute(e,r,i,a,o){let s=r,c=await l(o.cwd).execute(e,s,i,a,o);return t(i),h(c,s,o.cwd,i,n)},renderCall(e,t){let n=e,r=[n.path??`.`,n.glob,n.ignoreCase===!0?`ignore case`:void 0,n.limit===void 0?void 0:`${n.limit} matches`].filter(e=>e!==void 0);return o(`grep`,n.pattern,r,t)},renderResult(e,t,n,r){return s(e,t,n,r,`grep`)}}}export{g as createHashlineGrepTool,h as tagGrepResult};
2
- //# sourceMappingURL=piGrep.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"piGrep.mjs","names":["tagServiceGrepResult"],"sources":["../../src/tools/piGrep.ts"],"sourcesContent":["import { readFile, stat } from 'node:fs/promises';\n\nimport { isWritableFile } from '@agimon-ai/doompi-hashline/files';\nimport { renderHashlineCall, renderHashlineResult } from '@agimon-ai/doompi-ui/hashlineRendering';\nimport {\n DEFAULT_MAX_BYTES,\n formatSize,\n truncateHead,\n truncateLine,\n createGrepToolDefinition,\n type AgentToolResult,\n type ToolDefinition,\n} from '@earendil-works/pi-coding-agent';\n\nimport { GrepParamsSchema, type GrepParams } from '../schemas/grepTool';\nimport {\n assertNotAborted,\n type GrepFileSystem,\n type GrepOutputOperations,\n type GrepResult,\n tagGrepResult as tagServiceGrepResult,\n} from '../services/grepTool';\n\nconst fileSystem: GrepFileSystem = {\n stat: (path) => stat(path),\n readFile: (path) => readFile(path),\n};\n\nconst outputOperations: GrepOutputOperations = {\n maxBytes: DEFAULT_MAX_BYTES,\n formatSize,\n truncateHead,\n truncateLine,\n};\n\nexport async function tagGrepResult(\n nativeResult: GrepResult,\n params: GrepParams,\n cwd: string,\n signal: AbortSignal | undefined,\n writable: WritableCheck = isWritableFile,\n): Promise<GrepResult> {\n return tagServiceGrepResult(nativeResult, params, cwd, signal, writable, fileSystem, outputOperations);\n}\n\nexport { groupGrepRows, parseGrepRow } from '../services/grepTool';\nexport type { GrepGroup, GrepRow } from '../services/grepTool';\n\ntype WritableCheck = (path: string) => Promise<boolean>;\n\n/** Register only the snapshot-bound replacement for Pi's grep tool. */\nexport function createHashlineGrepTool(\n writable: WritableCheck = isWritableFile,\n): ToolDefinition<typeof GrepParamsSchema> {\n return {\n name: 'grep',\n label: 'grep',\n description:\n 'Search file contents using Pi-compatible ripgrep semantics, then add exact-byte file tags and stable line anchors for writable matches. Non-writable matches retain native Pi output. Respects .gitignore.',\n promptSnippet: 'Search file contents and return editable hashline anchors',\n parameters: GrepParamsSchema,\n executionMode: 'parallel',\n renderShell: 'self',\n async execute(toolCallId, params, signal, onUpdate, ctx) {\n const input = params as GrepParams;\n const nativeGrep = createGrepToolDefinition(ctx.cwd);\n const nativeResult = await nativeGrep.execute(toolCallId, input, signal, onUpdate, ctx);\n assertNotAborted(signal);\n return tagGrepResult(\n nativeResult as GrepResult,\n input,\n ctx.cwd,\n signal,\n writable,\n ) as unknown as AgentToolResult<unknown>;\n },\n renderCall(args, theme) {\n const input = args as GrepParams;\n const details = [\n input.path ?? '.',\n input.glob,\n input.ignoreCase === true ? 'ignore case' : undefined,\n input.limit === undefined ? undefined : `${input.limit} matches`,\n ].filter((value): value is string => value !== undefined);\n return renderHashlineCall('grep', input.pattern, details, theme);\n },\n renderResult(result, options, theme, context) {\n return renderHashlineResult(result, options, theme, context, 'grep');\n },\n };\n}\n"],"mappings":"ogBAuBA,MAAM,EAA6B,CACjC,KAAO,GAAS,EAAK,CAAI,EACzB,SAAW,GAAS,EAAS,CAAI,CACnC,EAEM,EAAyC,CAC7C,SAAU,EACV,aACA,eACA,cACF,EAEA,eAAsB,EACpB,EACA,EACA,EACA,EACA,EAA0B,EACL,CACrB,OAAOA,EAAqB,EAAc,EAAQ,EAAK,EAAQ,EAAU,EAAY,CAAgB,CACvG,CAQA,SAAgB,EACd,EAA0B,EACe,CACzC,MAAO,CACL,KAAM,OACN,MAAO,OACP,YACE,6MACF,cAAe,4DACf,WAAY,EACZ,cAAe,WACf,YAAa,OACb,MAAM,QAAQ,EAAY,EAAQ,EAAQ,EAAU,EAAK,CACvD,IAAM,EAAQ,EAER,EAAe,MADF,EAAyB,EAAI,GACZ,CAAC,CAAC,QAAQ,EAAY,EAAO,EAAQ,EAAU,CAAG,EAEtF,OADA,EAAiB,CAAM,EAChB,EACL,EACA,EACA,EAAI,IACJ,EACA,CACF,CACF,EACA,WAAW,EAAM,EAAO,CACtB,IAAM,EAAQ,EACR,EAAU,CACd,EAAM,MAAQ,IACd,EAAM,KACN,EAAM,aAAe,GAAO,cAAgB,IAAA,GAC5C,EAAM,QAAU,IAAA,GAAY,IAAA,GAAY,GAAG,EAAM,MAAM,SACzD,CAAC,CAAC,OAAQ,GAA2B,IAAU,IAAA,EAAS,EACxD,OAAO,EAAmB,OAAQ,EAAM,QAAS,EAAS,CAAK,CACjE,EACA,aAAa,EAAQ,EAAS,EAAO,EAAS,CAC5C,OAAO,EAAqB,EAAQ,EAAS,EAAO,EAAS,MAAM,CACrE,CACF,CACF"}
@@ -1,14 +0,0 @@
1
- import { defineWebPlugin } from '@agimon-ai/doompi-core/web';
2
-
3
- import { GrepToolMessage } from '../web/components/GrepToolMessage';
4
-
5
- /**
6
- * This package's cockpit presence: the grep tool's timeline card, the web
7
- * half of the TUI's renderCall and renderResult for hashline searches.
8
- */
9
- export const webPlugin = defineWebPlugin({
10
- id: 'grep',
11
- session: {
12
- toolRenderers: [{ tools: ['grep'], message: GrepToolMessage }],
13
- },
14
- });
@@ -1,65 +0,0 @@
1
- import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';
2
- import {
3
- HashlineLines,
4
- hashlineBody,
5
- MessageItem,
6
- MessageItemBody,
7
- MessageItemHeader,
8
- MessageItemStatus,
9
- resultTextLines,
10
- toolTone,
11
- } from '@agimon-ai/doompi-web-components';
12
-
13
- import { grepCallView } from '../lib/grepToolView';
14
-
15
- /**
16
- * The grep tool's timeline item, the web half of its renderCall and
17
- * renderResult: the call summary in the header and, when expanded, the
18
- * anchored matches with a line-number gutter in the body. A failure shows the
19
- * tool's message in red inside the expanded body instead.
20
- */
21
- export function GrepToolMessage({ args, result, output, running, isError }: ToolMessageRenderProps) {
22
- const view = grepCallView(args);
23
- const body = result === null || isError ? null : hashlineBody(result, output, 'grep', true);
24
- return (
25
- <MessageItem tone={toolTone({ running, isError })} expandable defaultExpanded={false}>
26
- {({ expanded }) => {
27
- return (
28
- <>
29
- <MessageItemHeader title="grep">
30
- <span data-testid="tool-call-grep" className="flex min-w-0 flex-1 items-center gap-2">
31
- <span className="truncate text-doom-text">{view.pattern}</span>
32
- {view.details.length > 0 ? (
33
- <span className="shrink-0 text-doom-faint">· {view.details.join(' · ')}</span>
34
- ) : null}
35
- </span>
36
- </MessageItemHeader>
37
- {expanded ? (
38
- isError ? (
39
- <MessageItemBody data-testid="tool-result-grep" className="flex flex-col">
40
- <MessageItemStatus tone="error">failed</MessageItemStatus>
41
- {resultTextLines(result, output).map((line, index) => (
42
- <span key={`${String(index)}-${line}`} className="whitespace-pre-wrap break-words text-doom-red">
43
- {line}
44
- </span>
45
- ))}
46
- </MessageItemBody>
47
- ) : body === null ? (
48
- running ? (
49
- <MessageItemBody data-testid="tool-result-grep">
50
- <MessageItemStatus tone="running">running</MessageItemStatus>
51
- </MessageItemBody>
52
- ) : null
53
- ) : body.shown.length === 0 && body.notice === undefined ? null : (
54
- <MessageItemBody data-testid="tool-result-grep" className="flex flex-col gap-1">
55
- <HashlineLines lines={body.shown} gutter={body.gutter} />
56
- {body.notice !== undefined ? <span className="text-doom-faint">{body.notice}</span> : null}
57
- </MessageItemBody>
58
- )
59
- ) : null}
60
- </>
61
- );
62
- }}
63
- </MessageItem>
64
- );
65
- }
@@ -1,21 +0,0 @@
1
- import { compactDetails } from '@agimon-ai/doompi-web-components';
2
-
3
- export interface GrepCallView {
4
- readonly pattern: string;
5
- /** Search path, glob, case flag, and limit, as the TUI's call heading lists them. */
6
- readonly details: readonly string[];
7
- }
8
-
9
- /** What the grep call heading shows: the pattern, then where and how it searched. */
10
- export function grepCallView(args: Readonly<Record<string, unknown>>): GrepCallView {
11
- const limit = typeof args.limit === 'number' && Number.isFinite(args.limit) ? args.limit : undefined;
12
- return {
13
- pattern: typeof args.pattern === 'string' ? args.pattern : '',
14
- details: compactDetails([
15
- typeof args.path === 'string' && args.path.length > 0 ? args.path : '.',
16
- typeof args.glob === 'string' ? args.glob : undefined,
17
- args.ignoreCase === true ? 'ignore case' : undefined,
18
- limit === undefined ? undefined : `${limit} matches`,
19
- ]),
20
- };
21
- }
@@ -1,23 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "lib": ["ES2023", "DOM", "DOM.Iterable"],
5
- "module": "ESNext",
6
- "moduleResolution": "Bundler",
7
- "jsx": "react-jsx",
8
- "strict": true,
9
- "noImplicitAny": true,
10
- "noUnusedLocals": true,
11
- "noUnusedParameters": true,
12
- "noImplicitReturns": true,
13
- "noFallthroughCasesInSwitch": true,
14
- "noEmit": true,
15
- "resolveJsonModule": true,
16
- "esModuleInterop": true,
17
- "skipLibCheck": true,
18
- "allowImportingTsExtensions": true,
19
- "forceConsistentCasingInFileNames": true,
20
- "types": ["node"]
21
- },
22
- "include": [".", "../types", "../extensions/web.ts"]
23
- }