@kvman/kvcoder 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +45 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/calls/call-name.d.ts.map +1 -1
- package/dist/calls/call-name.js +10 -1
- package/dist/calls/call-name.js.map +1 -1
- package/dist/calls/run-tool.d.ts.map +1 -1
- package/dist/calls/run-tool.js +2 -0
- package/dist/calls/run-tool.js.map +1 -1
- package/dist/connector-call.d.ts +2 -2
- package/dist/connector-call.d.ts.map +1 -1
- package/dist/connector-call.js +5 -3
- package/dist/connector-call.js.map +1 -1
- package/dist/connectors/artifact.d.ts +1 -0
- package/dist/connectors/artifact.d.ts.map +1 -1
- package/dist/connectors/background.d.ts.map +1 -1
- package/dist/connectors/background.js +8 -4
- package/dist/connectors/background.js.map +1 -1
- package/dist/connectors/builtin-connectors.d.ts +38 -0
- package/dist/connectors/builtin-connectors.d.ts.map +1 -1
- package/dist/connectors/builtin-connectors.js +4 -1
- package/dist/connectors/builtin-connectors.js.map +1 -1
- package/dist/connectors/delegate.d.ts.map +1 -1
- package/dist/connectors/delegate.js +3 -0
- package/dist/connectors/delegate.js.map +1 -1
- package/dist/connectors/execution-map.d.ts +1 -1
- package/dist/connectors/execution-map.d.ts.map +1 -1
- package/dist/connectors/execution-map.js +1 -1
- package/dist/connectors/execution-map.js.map +1 -1
- package/dist/connectors/fs.d.ts +29 -1
- package/dist/connectors/fs.d.ts.map +1 -1
- package/dist/connectors/fs.js +46 -9
- package/dist/connectors/fs.js.map +1 -1
- package/dist/connectors/payload-fields.d.ts +3 -0
- package/dist/connectors/payload-fields.d.ts.map +1 -1
- package/dist/connectors/payload-fields.js +8 -2
- package/dist/connectors/payload-fields.js.map +1 -1
- package/dist/connectors/web.d.ts +16 -0
- package/dist/connectors/web.d.ts.map +1 -0
- package/dist/connectors/web.js +22 -0
- package/dist/connectors/web.js.map +1 -0
- package/dist/delegate/permission.d.ts +6 -0
- package/dist/delegate/permission.d.ts.map +1 -1
- package/dist/files/change-diff.d.ts +17 -0
- package/dist/files/change-diff.d.ts.map +1 -0
- package/dist/files/change-diff.js +59 -0
- package/dist/files/change-diff.js.map +1 -0
- package/dist/files/edit-places.d.ts +11 -0
- package/dist/files/edit-places.d.ts.map +1 -0
- package/dist/files/edit-places.js +105 -0
- package/dist/files/edit-places.js.map +1 -0
- package/dist/files/edit-text.d.ts +1 -0
- package/dist/files/edit-text.d.ts.map +1 -1
- package/dist/files/edit-text.js +22 -10
- package/dist/files/edit-text.js.map +1 -1
- package/dist/files/file-change.d.ts.map +1 -1
- package/dist/files/file-change.js +12 -0
- package/dist/files/file-change.js.map +1 -1
- package/dist/files/find-paths.d.ts +9 -0
- package/dist/files/find-paths.d.ts.map +1 -0
- package/dist/files/find-paths.js +38 -0
- package/dist/files/find-paths.js.map +1 -0
- package/dist/files/read-file.d.ts +3 -1
- package/dist/files/read-file.d.ts.map +1 -1
- package/dist/files/read-file.js +7 -6
- package/dist/files/read-file.js.map +1 -1
- package/dist/files/read-files.d.ts +11 -0
- package/dist/files/read-files.d.ts.map +1 -0
- package/dist/files/read-files.js +35 -0
- package/dist/files/read-files.js.map +1 -0
- package/dist/files/read-text.d.ts +63 -0
- package/dist/files/read-text.d.ts.map +1 -0
- package/dist/files/read-text.js +67 -0
- package/dist/files/read-text.js.map +1 -0
- package/dist/files/register-changes.d.ts +3 -0
- package/dist/files/register-changes.d.ts.map +1 -0
- package/dist/files/register-changes.js +78 -0
- package/dist/files/register-changes.js.map +1 -0
- package/dist/files/search-text.d.ts +10 -1
- package/dist/files/search-text.d.ts.map +1 -1
- package/dist/files/search-text.js +32 -57
- package/dist/files/search-text.js.map +1 -1
- package/dist/files/workspace-files.d.ts +5 -0
- package/dist/files/workspace-files.d.ts.map +1 -0
- package/dist/files/workspace-files.js +66 -0
- package/dist/files/workspace-files.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/prompt/build-prompt.d.ts +4 -0
- package/dist/prompt/build-prompt.d.ts.map +1 -1
- package/dist/prompt/build-prompt.js +6 -2
- package/dist/prompt/build-prompt.js.map +1 -1
- package/dist/prompt/person-preferences.d.ts +5 -0
- package/dist/prompt/person-preferences.d.ts.map +1 -0
- package/dist/prompt/person-preferences.js +14 -0
- package/dist/prompt/person-preferences.js.map +1 -0
- package/dist/prompt/session-grants.d.ts +4 -0
- package/dist/prompt/session-grants.d.ts.map +1 -1
- package/dist/prompt/session-grants.js +3 -2
- package/dist/prompt/session-grants.js.map +1 -1
- package/dist/prompt/session-prompt.d.ts.map +1 -1
- package/dist/prompt/session-prompt.js +15 -6
- package/dist/prompt/session-prompt.js.map +1 -1
- package/dist/prompt/working-method.d.ts +2 -2
- package/dist/prompt/working-method.d.ts.map +1 -1
- package/dist/prompt/working-method.js +49 -43
- package/dist/prompt/working-method.js.map +1 -1
- package/dist/register-settings.d.ts +23 -0
- package/dist/register-settings.d.ts.map +1 -1
- package/dist/register-settings.js +13 -0
- package/dist/register-settings.js.map +1 -1
- package/dist/schemas/approval-rule.d.ts +9 -0
- package/dist/schemas/approval-rule.d.ts.map +1 -0
- package/dist/schemas/approval-rule.js +7 -0
- package/dist/schemas/approval-rule.js.map +1 -0
- package/dist/schemas/check.d.ts +7 -0
- package/dist/schemas/check.d.ts.map +1 -0
- package/dist/schemas/check.js +9 -0
- package/dist/schemas/check.js.map +1 -0
- package/dist/schemas/records.d.ts +10 -0
- package/dist/schemas/records.d.ts.map +1 -1
- package/dist/schemas/records.js +8 -0
- package/dist/schemas/records.js.map +1 -1
- package/dist/sessions/new-session.d.ts.map +1 -1
- package/dist/sessions/new-session.js +4 -1
- package/dist/sessions/new-session.js.map +1 -1
- package/dist/sessions/register-fork-export.d.ts.map +1 -1
- package/dist/sessions/register-fork-export.js +3 -2
- package/dist/sessions/register-fork-export.js.map +1 -1
- package/dist/sessions/register-sessions.d.ts.map +1 -1
- package/dist/sessions/register-sessions.js +17 -9
- package/dist/sessions/register-sessions.js.map +1 -1
- package/dist/sessions/session-view.d.ts +8 -1
- package/dist/sessions/session-view.d.ts.map +1 -1
- package/dist/sessions/session-view.js +6 -1
- package/dist/sessions/session-view.js.map +1 -1
- package/dist/sessions/waiting-on.d.ts +7 -0
- package/dist/sessions/waiting-on.d.ts.map +1 -0
- package/dist/sessions/waiting-on.js +20 -0
- package/dist/sessions/waiting-on.js.map +1 -0
- package/dist/store/collections.d.ts +18 -0
- package/dist/store/collections.d.ts.map +1 -1
- package/dist/store/collections.js +3 -1
- package/dist/store/collections.js.map +1 -1
- package/dist/turns/answer-extras.d.ts +21 -0
- package/dist/turns/answer-extras.d.ts.map +1 -0
- package/dist/turns/answer-extras.js +43 -0
- package/dist/turns/answer-extras.js.map +1 -0
- package/dist/turns/answer-fingerprint.d.ts +6 -2
- package/dist/turns/answer-fingerprint.d.ts.map +1 -1
- package/dist/turns/answer-fingerprint.js +9 -3
- package/dist/turns/answer-fingerprint.js.map +1 -1
- package/dist/turns/apply-answer.d.ts +2 -1
- package/dist/turns/apply-answer.d.ts.map +1 -1
- package/dist/turns/apply-answer.js +10 -4
- package/dist/turns/apply-answer.js.map +1 -1
- package/dist/turns/approval-rules.d.ts +13 -0
- package/dist/turns/approval-rules.d.ts.map +1 -0
- package/dist/turns/approval-rules.js +65 -0
- package/dist/turns/approval-rules.js.map +1 -0
- package/dist/turns/check-after-edits.d.ts +8 -0
- package/dist/turns/check-after-edits.d.ts.map +1 -0
- package/dist/turns/check-after-edits.js +23 -0
- package/dist/turns/check-after-edits.js.map +1 -0
- package/dist/turns/clear-results.d.ts +15 -0
- package/dist/turns/clear-results.d.ts.map +1 -0
- package/dist/turns/clear-results.js +58 -0
- package/dist/turns/clear-results.js.map +1 -0
- package/dist/turns/cleared-results.d.ts +17 -0
- package/dist/turns/cleared-results.d.ts.map +1 -0
- package/dist/turns/cleared-results.js +46 -0
- package/dist/turns/cleared-results.js.map +1 -0
- package/dist/turns/compaction.js +6 -6
- package/dist/turns/compaction.js.map +1 -1
- package/dist/turns/file-results.d.ts +15 -0
- package/dist/turns/file-results.d.ts.map +1 -0
- package/dist/turns/file-results.js +39 -0
- package/dist/turns/file-results.js.map +1 -0
- package/dist/turns/lost-reply.js +2 -2
- package/dist/turns/lost-reply.js.map +1 -1
- package/dist/turns/model-context.d.ts +2 -0
- package/dist/turns/model-context.d.ts.map +1 -1
- package/dist/turns/model-context.js +28 -5
- package/dist/turns/model-context.js.map +1 -1
- package/dist/turns/read-again.d.ts +11 -5
- package/dist/turns/read-again.d.ts.map +1 -1
- package/dist/turns/read-again.js +39 -10
- package/dist/turns/read-again.js.map +1 -1
- package/dist/turns/register-turns.d.ts.map +1 -1
- package/dist/turns/register-turns.js +12 -4
- package/dist/turns/register-turns.js.map +1 -1
- package/dist/turns/run-calls.d.ts +4 -0
- package/dist/turns/run-calls.d.ts.map +1 -1
- package/dist/turns/run-calls.js +35 -5
- package/dist/turns/run-calls.js.map +1 -1
- package/dist/turns/run-command.d.ts.map +1 -1
- package/dist/turns/run-command.js +4 -4
- package/dist/turns/run-command.js.map +1 -1
- package/dist/turns/step.d.ts.map +1 -1
- package/dist/turns/step.js +43 -8
- package/dist/turns/step.js.map +1 -1
- package/dist/ui/register-ui.js +2 -2
- package/dist/ui/register-ui.js.map +1 -1
- package/dist/web/components/approval.css +1 -1
- package/dist/web/components/approval.js +122 -89
- package/dist/web/components/call.css +1 -1
- package/dist/web/components/call.js +403 -305
- package/dist/web/components/connectors.css +1 -1
- package/dist/web/components/connectors.js +440 -427
- package/dist/web/components/conversation.css +1 -1
- package/dist/web/components/conversation.js +2532 -1503
- package/dist/web/components/mcp-sign-in.css +1 -1
- package/dist/web/components/model.css +1 -1
- package/dist/web/components/model.js +138 -126
- package/dist/web/components/preferences.css +2 -0
- package/dist/web/components/preferences.js +151 -0
- package/dist/web/components/question.css +1 -1
- package/dist/web/components/sessions.css +1 -1
- package/dist/web/components/sessions.js +44 -21
- package/dist/web-fetch/fetch-page.d.ts +28 -0
- package/dist/web-fetch/fetch-page.d.ts.map +1 -0
- package/dist/web-fetch/fetch-page.js +108 -0
- package/dist/web-fetch/fetch-page.js.map +1 -0
- package/dist/web-fetch/private-address.d.ts +3 -0
- package/dist/web-fetch/private-address.d.ts.map +1 -0
- package/dist/web-fetch/private-address.js +69 -0
- package/dist/web-fetch/private-address.js.map +1 -0
- package/dist/web-fetch/web-hosts.d.ts +7 -0
- package/dist/web-fetch/web-hosts.d.ts.map +1 -0
- package/dist/web-fetch/web-hosts.js +19 -0
- package/dist/web-fetch/web-hosts.js.map +1 -0
- package/docs/connectors.md +2 -2
- package/locales/ar.json +80 -14
- package/locales/en.json +81 -15
- package/package.json +20 -6
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
/** One line as a read shows it: its number, a tab, and its text without the line ending. */
|
|
3
|
+
export declare const numberedLine: (number: number, line: string) => string;
|
|
4
|
+
/** A text's lines, each with its line ending. */
|
|
5
|
+
export declare const linesOf: (content: string) => string[];
|
|
6
|
+
/** Text numbered from `fromLine`. */
|
|
7
|
+
export declare const numberedLines: (content: string, fromLine: number) => string;
|
|
8
|
+
export declare const fileReadSchema: z.ZodObject<{
|
|
9
|
+
path: z.ZodString;
|
|
10
|
+
fromLine: z.ZodNumber;
|
|
11
|
+
totalLines: z.ZodNumber;
|
|
12
|
+
content: z.ZodString;
|
|
13
|
+
truncated: z.ZodBoolean;
|
|
14
|
+
next: z.ZodExactOptional<z.ZodObject<{
|
|
15
|
+
fromLine: z.ZodNumber;
|
|
16
|
+
fromColumn: z.ZodExactOptional<z.ZodNumber>;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type FileReadValue = z.output<typeof fileReadSchema>;
|
|
20
|
+
/** A file's read as the model reads it; `fromColumn` is where the read started in its first line. */
|
|
21
|
+
export declare function readText(read: FileReadValue, fromColumn?: number): string;
|
|
22
|
+
/** What a read of lines the chat already holds reads instead (ADR 0034, 2). */
|
|
23
|
+
export declare const unchangedText: (path: string) => string;
|
|
24
|
+
/** One file of `fs read-files` (ADR 0097, 1): its read, why it couldn't be read, that the budget was used, or that the chat holds it. */
|
|
25
|
+
export declare const filesEntrySchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
26
|
+
path: z.ZodString;
|
|
27
|
+
fromLine: z.ZodNumber;
|
|
28
|
+
totalLines: z.ZodNumber;
|
|
29
|
+
content: z.ZodString;
|
|
30
|
+
truncated: z.ZodBoolean;
|
|
31
|
+
next: z.ZodExactOptional<z.ZodObject<{
|
|
32
|
+
fromLine: z.ZodNumber;
|
|
33
|
+
fromColumn: z.ZodExactOptional<z.ZodNumber>;
|
|
34
|
+
}, z.core.$strip>>;
|
|
35
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
36
|
+
path: z.ZodString;
|
|
37
|
+
error: z.ZodObject<{
|
|
38
|
+
code: z.ZodString;
|
|
39
|
+
message: z.ZodString;
|
|
40
|
+
}, z.core.$strip>;
|
|
41
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
42
|
+
path: z.ZodString;
|
|
43
|
+
notRead: z.ZodLiteral<true>;
|
|
44
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
45
|
+
path: z.ZodString;
|
|
46
|
+
unchanged: z.ZodLiteral<true>;
|
|
47
|
+
}, z.core.$strip>]>;
|
|
48
|
+
export type FilesEntry = z.output<typeof filesEntrySchema>;
|
|
49
|
+
/** One file of `fs read-files` as the model reads it. */
|
|
50
|
+
export declare function filesEntryText(entry: FilesEntry): string;
|
|
51
|
+
export declare const editValueSchema: z.ZodObject<{
|
|
52
|
+
path: z.ZodString;
|
|
53
|
+
replacements: z.ZodNumber;
|
|
54
|
+
fromLine: z.ZodNumber;
|
|
55
|
+
content: z.ZodString;
|
|
56
|
+
skipped: z.ZodExactOptional<z.ZodObject<{
|
|
57
|
+
afterLine: z.ZodNumber;
|
|
58
|
+
lines: z.ZodNumber;
|
|
59
|
+
}, z.core.$strip>>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
/** An edit's result as the model reads it: the changed lines numbered, a long change's marker unnumbered. */
|
|
62
|
+
export declare function editText(edit: z.output<typeof editValueSchema>): string;
|
|
63
|
+
//# sourceMappingURL=read-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-text.d.ts","sourceRoot":"","sources":["../../src/files/read-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAO/B,4FAA4F;AAC5F,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,MAAM,MAAM,KAAG,MAAkF,CAAC;AAE/I,iDAAiD;AACjD,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MAAM,EAA8C,CAAC;AAE/F,qCAAqC;AACrC,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,KAAG,MAAgG,CAAC;AAEnK,eAAO,MAAM,cAAc;;;;;;;;;;iBAAsP,CAAC;AAElR,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAS5D,qGAAqG;AACrG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,SAAI,GAAG,MAAM,CAQpE;AAED,+EAA+E;AAC/E,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAA+G,CAAC;AAM7J,yIAAyI;AACzI,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;mBAA+E,CAAC;AAE7G,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE3D,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAKxD;AAED,eAAO,MAAM,eAAe;;;;;;;;;iBAA+M,CAAC;AAE5O,6GAA6G;AAC7G,wBAAgB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,GAAG,MAAM,CAiBvE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from '@kvman/sdk';
|
|
2
|
+
// How a read and an edit read to the model (plan 08 §8.5, ADR 0097, 2): a header, then each line as `cat -n` prints
|
|
3
|
+
// it, its number right-aligned to six places, a tab, and its text. The call's `details` keep the JSON.
|
|
4
|
+
const numberWidth = 6;
|
|
5
|
+
/** One line as a read shows it: its number, a tab, and its text without the line ending. */
|
|
6
|
+
export const numberedLine = (number, line) => `${String(number).padStart(numberWidth)}\t${line.replace(/\r?\n$/, '')}`;
|
|
7
|
+
/** A text's lines, each with its line ending. */
|
|
8
|
+
export const linesOf = (content) => content.match(/[^\n]*\n|[^\n]+$/g) ?? [];
|
|
9
|
+
/** Text numbered from `fromLine`. */
|
|
10
|
+
export const numberedLines = (content, fromLine) => linesOf(content).map((line, index) => numberedLine(fromLine + index, line)).join('\n');
|
|
11
|
+
export const fileReadSchema = z.object({ path: z.string(), fromLine: z.number().int(), totalLines: z.number().int(), content: z.string(), truncated: z.boolean(), next: z.object({ fromLine: z.number().int(), fromColumn: z.number().int().exactOptional() }).exactOptional() });
|
|
12
|
+
const linesWord = (count) => `${String(count)} ${count === 1 ? 'line' : 'lines'}`;
|
|
13
|
+
function readOn(next) {
|
|
14
|
+
if (next === undefined)
|
|
15
|
+
return '';
|
|
16
|
+
return ` · read on with fromLine ${String(next.fromLine)}${next.fromColumn === undefined ? '' : `, fromColumn ${String(next.fromColumn)}`}`;
|
|
17
|
+
}
|
|
18
|
+
/** A file's read as the model reads it; `fromColumn` is where the read started in its first line. */
|
|
19
|
+
export function readText(read, fromColumn = 1) {
|
|
20
|
+
if (read.totalLines === 0)
|
|
21
|
+
return `${read.path} · empty (0 lines)`;
|
|
22
|
+
const count = linesOf(read.content).length;
|
|
23
|
+
if (count === 0)
|
|
24
|
+
return `${read.path} · no lines from line ${String(read.fromLine)}: the file has ${linesWord(read.totalLines)}`;
|
|
25
|
+
const last = read.fromLine + count - 1;
|
|
26
|
+
const range = count === 1 ? `line ${String(read.fromLine)} of ${String(read.totalLines)}` : `lines ${String(read.fromLine)}–${String(last)} of ${String(read.totalLines)}`;
|
|
27
|
+
const column = fromColumn > 1 ? ` (line ${String(read.fromLine)} from character ${String(fromColumn)})` : '';
|
|
28
|
+
return `${read.path} · ${range}${column}${readOn(read.next)}\n${numberedLines(read.content, read.fromLine)}`;
|
|
29
|
+
}
|
|
30
|
+
/** What a read of lines the chat already holds reads instead (ADR 0034, 2). */
|
|
31
|
+
export const unchangedText = (path) => `${path} is unchanged since you read these lines earlier in this conversation; that result is above.`;
|
|
32
|
+
const readFailureSchema = z.object({ path: z.string(), error: z.object({ code: z.string(), message: z.string() }) });
|
|
33
|
+
const notReadSchema = z.object({ path: z.string(), notRead: z.literal(true) });
|
|
34
|
+
const unchangedSchema = z.object({ path: z.string(), unchanged: z.literal(true) });
|
|
35
|
+
/** One file of `fs read-files` (ADR 0097, 1): its read, why it couldn't be read, that the budget was used, or that the chat holds it. */
|
|
36
|
+
export const filesEntrySchema = z.union([fileReadSchema, readFailureSchema, notReadSchema, unchangedSchema]);
|
|
37
|
+
/** One file of `fs read-files` as the model reads it. */
|
|
38
|
+
export function filesEntryText(entry) {
|
|
39
|
+
if ('error' in entry)
|
|
40
|
+
return `${entry.path} · error ${entry.error.code}: ${entry.error.message}`;
|
|
41
|
+
if ('notRead' in entry)
|
|
42
|
+
return `${entry.path} · not read: the files before it used this call's 30 KB; read it in another call`;
|
|
43
|
+
if ('unchanged' in entry)
|
|
44
|
+
return unchangedText(entry.path);
|
|
45
|
+
return readText(entry);
|
|
46
|
+
}
|
|
47
|
+
export const editValueSchema = z.object({ path: z.string(), replacements: z.number().int(), fromLine: z.number().int(), content: z.string(), skipped: z.object({ afterLine: z.number().int(), lines: z.number().int() }).exactOptional() });
|
|
48
|
+
/** An edit's result as the model reads it: the changed lines numbered, a long change's marker unnumbered. */
|
|
49
|
+
export function editText(edit) {
|
|
50
|
+
const marker = edit.skipped === undefined ? -1 : edit.skipped.afterLine - edit.fromLine + 1;
|
|
51
|
+
const shown = [];
|
|
52
|
+
let number = edit.fromLine;
|
|
53
|
+
for (const [index, line] of linesOf(edit.content).entries()) {
|
|
54
|
+
if (index === marker) {
|
|
55
|
+
shown.push(line.replace(/\r?\n$/, ''));
|
|
56
|
+
number += edit.skipped?.lines ?? 0;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
shown.push(numberedLine(number, line));
|
|
60
|
+
number += 1;
|
|
61
|
+
}
|
|
62
|
+
const last = number - 1;
|
|
63
|
+
const range = last <= edit.fromLine ? `line ${String(edit.fromLine)} now reads` : `lines ${String(edit.fromLine)}–${String(last)} now read`;
|
|
64
|
+
const replacements = `${String(edit.replacements)} ${edit.replacements === 1 ? 'replacement' : 'replacements'}`;
|
|
65
|
+
return `${edit.path} · ${replacements} · ${range}:\n${shown.join('\n')}`;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=read-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-text.js","sourceRoot":"","sources":["../../src/files/read-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-changes.d.ts","sourceRoot":"","sources":["../../src/files/register-changes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAK,KAAK,GAAG,EAAe,MAAM,YAAY,CAAC;AAyCtD,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAsC9C"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { stat, realpath } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { z } from '@kvman/sdk';
|
|
4
|
+
import { invalid } from "../problems.js";
|
|
5
|
+
import { findSession, userOnly } from "../sessions/session-lookup.js";
|
|
6
|
+
import { records } from "../store/collections.js";
|
|
7
|
+
import { copyDiff, gitIn, headDiff } from "./change-diff.js";
|
|
8
|
+
import { undoChange } from "./file-change.js";
|
|
9
|
+
import { resolveInWorkspace } from "./workspace-path.js";
|
|
10
|
+
// A chat's changes (plan 08 §8.6 and §8.7, ADR 0093, 2): the files its tree changed with `fs`, each diffed, and the
|
|
11
|
+
// person's undo of one.
|
|
12
|
+
const changesLimit = 200;
|
|
13
|
+
const fileSchema = z.object({ path: z.string(), added: z.number().int(), removed: z.number().int(), diff: z.string(), state: z.enum(['changed', 'created', 'deleted']) });
|
|
14
|
+
// The chat at the root of a session, and every session in its tree.
|
|
15
|
+
async function chatTree(ctx, session) {
|
|
16
|
+
const root = session.parentId ?? session.id;
|
|
17
|
+
const children = await records(ctx.store).sessions.find({ parentId: root }, { limit: 1000 });
|
|
18
|
+
return { root, sessions: [root, ...children.map((child) => child.id)] };
|
|
19
|
+
}
|
|
20
|
+
// The oldest copy the tree keeps of a file: its content before the chat changed it, `null` when the chat created it.
|
|
21
|
+
async function oldestCopy(ctx, sessions, real) {
|
|
22
|
+
const copies = (await Promise.all(sessions.map((sessionId) => records(ctx.store).fileBackups.find({ sessionId, path: real }, { limit: 1000 })))).flat();
|
|
23
|
+
const oldest = copies.sort((first, second) => first.createdAt.localeCompare(second.createdAt))[0];
|
|
24
|
+
return oldest === undefined ? undefined : { previous: oldest.previous === null ? null : Buffer.from(oldest.previous, 'base64'), sessionId: oldest.sessionId };
|
|
25
|
+
}
|
|
26
|
+
const exists = (real) => stat(real).then(() => true, () => false);
|
|
27
|
+
async function fileView(ctx, git, tracked, sessions, base, change) {
|
|
28
|
+
const shown = path.relative(base, change.path).split(path.sep).join('/');
|
|
29
|
+
const present = await exists(change.path);
|
|
30
|
+
const inHead = tracked && (await git(['cat-file', '-e', `HEAD:${shown}`]))?.code === 0;
|
|
31
|
+
const copy = inHead ? undefined : await oldestCopy(ctx, sessions, change.path);
|
|
32
|
+
const state = !present ? 'deleted' : !inHead && copy?.previous === null ? 'created' : 'changed';
|
|
33
|
+
const found = inHead ? await headDiff(git, shown) : copy === undefined ? { added: 0, removed: 0, diff: '' } : await copyDiff(git, shown, present ? change.path : undefined, copy.previous);
|
|
34
|
+
return { path: shown, state, ...(found ?? { added: 0, removed: 0, diff: '' }), ran: found !== undefined };
|
|
35
|
+
}
|
|
36
|
+
export function registerChanges(ctx) {
|
|
37
|
+
ctx.registerQuery('kvcoder.change.list', {
|
|
38
|
+
description: "Lists the files a chat changed with fs, newest first, each with its diff.",
|
|
39
|
+
input: z.object({ sessionId: z.string(), withDiffs: z.boolean().exactOptional() }),
|
|
40
|
+
output: z.object({ files: z.array(fileSchema), diffs: z.boolean() }),
|
|
41
|
+
public: true,
|
|
42
|
+
handle: async ({ sessionId, withDiffs }) => {
|
|
43
|
+
const tree = await chatTree(ctx, await findSession(ctx, sessionId));
|
|
44
|
+
const changes = (await records(ctx.store).fileChanges.find({ sessionId: tree.root }, { limit: 1000 })).sort((first, second) => second.lastAt.localeCompare(first.lastAt)).slice(0, changesLimit);
|
|
45
|
+
const base = await realpath(ctx.job.workspace.path);
|
|
46
|
+
// The header's count needs the files only: no Git runs (ADR 0093, 2).
|
|
47
|
+
if (withDiffs === false)
|
|
48
|
+
return { files: await Promise.all(changes.map(async (change) => ({ path: path.relative(base, change.path).split(path.sep).join('/'), added: 0, removed: 0, diff: '', state: (await exists(change.path)) ? 'changed' : 'deleted' }))), diffs: false };
|
|
49
|
+
const git = gitIn(base, ctx.job.signal);
|
|
50
|
+
const tracked = (await git(['rev-parse', '--is-inside-work-tree']))?.out.trim() === 'true';
|
|
51
|
+
const files = [];
|
|
52
|
+
for (const change of changes)
|
|
53
|
+
files.push(await fileView(ctx, git, tracked, tree.sessions, base, change));
|
|
54
|
+
return { files: files.map(({ ran: _ran, ...file }) => file), diffs: files.every((file) => file.ran) };
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
ctx.registerCommand('kvcoder.change.undo', {
|
|
58
|
+
description: "Takes back the chat's latest change to a file, as fs undo does; for the person.",
|
|
59
|
+
input: z.object({ sessionId: z.string(), path: z.string().min(1) }),
|
|
60
|
+
output: z.object({}),
|
|
61
|
+
public: true,
|
|
62
|
+
retries: 0,
|
|
63
|
+
handle: async ({ sessionId, path: shown }) => {
|
|
64
|
+
userOnly(ctx, 'kvcoder.change.undo');
|
|
65
|
+
const session = await findSession(ctx, sessionId);
|
|
66
|
+
if (session.parentId !== null)
|
|
67
|
+
throw invalid("A helper's chat is for reading; undo from its chat.", { sessionId });
|
|
68
|
+
const tree = await chatTree(ctx, session);
|
|
69
|
+
const real = await resolveInWorkspace(ctx.job.workspace.path, shown);
|
|
70
|
+
// The tree's newest change of the file, whichever session of the chat made it.
|
|
71
|
+
const copies = (await Promise.all(tree.sessions.map((id) => records(ctx.store).fileBackups.find({ sessionId: id, path: real }, { limit: 1, order: 'desc' })))).flat();
|
|
72
|
+
const newest = copies.sort((first, second) => second.createdAt.localeCompare(first.createdAt))[0];
|
|
73
|
+
await undoChange(ctx, { sessionId: newest?.sessionId ?? sessionId, shown, real });
|
|
74
|
+
return {};
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=register-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-changes.js","sourceRoot":"","sources":["../../src/files/register-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAyB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAA2C,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,oHAAoH;AACpH,wBAAwB;AAExB,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AAE1K,oEAAoE;AACpE,KAAK,UAAU,QAAQ,CAAC,GAAQ,EAAE,OAA2B;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,qHAAqH;AACrH,KAAK,UAAU,UAAU,CAAC,GAAQ,EAAE,QAA2B,EAAE,IAAY;IAC3E,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxJ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AAChK,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAoB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAE5F,KAAK,UAAU,QAAQ,CAAC,GAAQ,EAAE,GAAQ,EAAE,OAAgB,EAAE,QAA2B,EAAE,IAAY,EAAE,MAA6B;IACpI,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAc,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3G,MAAM,KAAK,GAAyB,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjN,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,GAAG,CAAC,aAAa,CAAC,qBAAqB,EAAE;QACvC,WAAW,EAAE,2EAA2E;QACxF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;QAClF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACpE,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACjM,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpD,sEAAsE;YACtE,IAAI,SAAS,KAAK,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,SAAmB,CAAC,CAAC,CAAE,SAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACpS,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;YAC3F,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACzG,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxG,CAAC;KACF,CAAC,CAAC;IACH,GAAG,CAAC,eAAe,CAAC,qBAAqB,EAAE;QACzC,WAAW,EAAE,iFAAiF;QAC9F,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3C,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;gBAAE,MAAM,OAAO,CAAC,qDAAqD,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACnH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrE,+EAA+E;YAC/E,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtK,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClG,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -4,14 +4,19 @@ export type SearchLimits = {
|
|
|
4
4
|
totalMs: number;
|
|
5
5
|
};
|
|
6
6
|
export declare const searchLimits: SearchLimits;
|
|
7
|
+
/** A matching line, or with `context` a line around one. */
|
|
7
8
|
export type Match = {
|
|
8
9
|
line: number;
|
|
9
10
|
text: string;
|
|
11
|
+
context?: true;
|
|
10
12
|
};
|
|
11
|
-
/** The matches of one file; files are in path order (ADR 0034, 5). */
|
|
13
|
+
/** The matches of one file, or with `filesOnly` their count; files are in path order (ADR 0034, 5). */
|
|
12
14
|
export type FileMatches = {
|
|
13
15
|
path: string;
|
|
14
16
|
matches: Match[];
|
|
17
|
+
} | {
|
|
18
|
+
path: string;
|
|
19
|
+
count: number;
|
|
15
20
|
};
|
|
16
21
|
export type SearchResult = {
|
|
17
22
|
files: FileMatches[];
|
|
@@ -23,6 +28,10 @@ export type SearchInput = {
|
|
|
23
28
|
path?: string | undefined;
|
|
24
29
|
literal?: boolean | undefined;
|
|
25
30
|
glob?: string | undefined;
|
|
31
|
+
context?: number | undefined;
|
|
32
|
+
filesOnly?: boolean | undefined;
|
|
26
33
|
};
|
|
34
|
+
/** The most lines `context` adds on each side of a match. */
|
|
35
|
+
export declare const contextLimit = 10;
|
|
27
36
|
export declare function searchText(workspace: string, input: SearchInput, signal: AbortSignal, limits?: SearchLimits): Promise<SearchResult>;
|
|
28
37
|
//# sourceMappingURL=search-text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-text.d.ts","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search-text.d.ts","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"AAkBA,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,eAAO,MAAM,YAAY,EAAE,YAAiD,CAAC;AAE7E,4DAA4D;AAC5D,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnE,uGAAuG;AACvG,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,CAAC;AACrG,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC;AAElM,6DAA6D;AAC7D,eAAO,MAAM,YAAY,KAAK,CAAC;AAkC/B,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,YAA2B,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CvJ"}
|
|
@@ -1,20 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { lstat, readdir, readFile, realpath, stat } from 'node:fs/promises';
|
|
1
|
+
import { readFile, realpath, stat } from 'node:fs/promises';
|
|
3
2
|
import path from 'node:path';
|
|
4
|
-
import { promisify } from 'node:util';
|
|
5
3
|
import { createContext, Script } from 'node:vm';
|
|
4
|
+
import { cutInto } from "../connectors/payload-fields.js";
|
|
6
5
|
import { invalid, notFound } from "../problems.js";
|
|
7
6
|
import { decodeText, isMissing } from "./read-file.js";
|
|
7
|
+
import { filesIn, globMatcher } from "./workspace-files.js";
|
|
8
8
|
import { resolveInWorkspace } from "./workspace-path.js";
|
|
9
9
|
// `fs search` (plan 08 §8.5, ADR 0011, 8; ADR 0055): the lines that match a regular expression or a plain text, in a
|
|
10
10
|
// file or under a folder inside the workspace folder, in path order. Dependency and dot folders are skipped, and so is
|
|
11
11
|
// what Git ignores and anything that isn't UTF-8 text; a symlink is never followed, so the walk can't leave the
|
|
12
|
-
// workspace or loop. A file's matching runs where it can be interrupted, so a slow expression is stopped.
|
|
12
|
+
// workspace or loop. A file's matching runs where it can be interrupted, so a slow expression is stopped. `context`
|
|
13
|
+
// adds the lines around each match, and `filesOnly` gives each file's count in place of its lines (ADR 0090, 3).
|
|
13
14
|
const matchesLimit = 200;
|
|
14
15
|
const lineLimit = 500;
|
|
15
16
|
export const searchLimits = { fileMs: 2_000, totalMs: 10_000 };
|
|
16
|
-
|
|
17
|
-
const
|
|
17
|
+
/** The most lines `context` adds on each side of a match. */
|
|
18
|
+
export const contextLimit = 10;
|
|
19
|
+
// The kept matches and the lines around them, each line once, in line order; `last` is the file's last real line.
|
|
20
|
+
function shownLines(lines, kept, context) {
|
|
21
|
+
const last = lines.length - (lines.at(-1) === '' ? 2 : 1);
|
|
22
|
+
const hits = new Set(kept);
|
|
23
|
+
const shown = new Set();
|
|
24
|
+
for (const index of kept)
|
|
25
|
+
for (let line = Math.max(index - context, 0); line <= Math.min(index + context, Math.max(last, index)); line += 1)
|
|
26
|
+
shown.add(line);
|
|
27
|
+
return [...shown].sort((first, second) => first - second).map((index) => ({ line: index + 1, text: (lines[index] ?? '').slice(0, lineLimit), ...(hits.has(index) ? {} : { context: true }) }));
|
|
28
|
+
}
|
|
18
29
|
function expression(pattern) {
|
|
19
30
|
try {
|
|
20
31
|
return new RegExp(pattern);
|
|
@@ -25,53 +36,6 @@ function expression(pattern) {
|
|
|
25
36
|
throw error;
|
|
26
37
|
}
|
|
27
38
|
}
|
|
28
|
-
// A glob as an expression: `**` is any run, `*` any run but `/`, `?` one character but `/`.
|
|
29
|
-
function globExpression(glob) {
|
|
30
|
-
const body = glob.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*\*\/?|\*|\?/g, (found) => (found.startsWith('**') ? '.*' : found === '*' ? '[^/]*' : '[^/]'));
|
|
31
|
-
return new RegExp(`^${body}$`);
|
|
32
|
-
}
|
|
33
|
-
// Every file under `folder`, in path order.
|
|
34
|
-
async function* filesUnder(folder, signal) {
|
|
35
|
-
for (const entry of (await readdir(folder, { withFileTypes: true })).sort((first, second) => (first.name < second.name ? -1 : 1))) {
|
|
36
|
-
signal.throwIfAborted();
|
|
37
|
-
const child = path.join(folder, entry.name);
|
|
38
|
-
if (skipped(entry.name))
|
|
39
|
-
continue;
|
|
40
|
-
if (entry.isDirectory())
|
|
41
|
-
yield* filesUnder(child, signal);
|
|
42
|
-
else if (entry.isFile())
|
|
43
|
-
yield child;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// Git lists symlinks too, and a folder on the way may be one: only a regular file whose real path is under the
|
|
47
|
-
// searched folder is read, as the walk never follows a link.
|
|
48
|
-
async function regularInside(file, folder) {
|
|
49
|
-
const found = await lstat(file).catch(() => undefined);
|
|
50
|
-
if (found?.isFile() !== true)
|
|
51
|
-
return false;
|
|
52
|
-
const inside = path.relative(folder, await realpath(file));
|
|
53
|
-
return inside !== '' && !inside.startsWith('..') && !path.isAbsolute(inside);
|
|
54
|
-
}
|
|
55
|
-
// The files Git lists under `folder` as tracked or untracked and not ignored; `undefined` where Git can't say.
|
|
56
|
-
// A repository's own configuration may name a program as its file monitor, which listing would run: it is turned off.
|
|
57
|
-
async function gitFiles(folder, signal) {
|
|
58
|
-
let listed;
|
|
59
|
-
try {
|
|
60
|
-
listed = (await run('git', ['-c', 'core.fsmonitor=false', 'ls-files', '--cached', '--others', '--exclude-standard', '-z'], { cwd: folder, signal, maxBuffer: 64 * 1024 * 1024 })).stdout;
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
signal.throwIfAborted();
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
const real = await realpath(folder);
|
|
67
|
-
const files = [];
|
|
68
|
-
for (const name of listed.split('\0').filter((entry) => entry !== '' && !entry.split('/').some(skipped)).sort()) {
|
|
69
|
-
const file = path.join(real, name);
|
|
70
|
-
if (await regularInside(file, real))
|
|
71
|
-
files.push(file);
|
|
72
|
-
}
|
|
73
|
-
return files;
|
|
74
|
-
}
|
|
75
39
|
const matching = new Script('lines.flatMap((line, index) => (pattern.test(line) ? [index] : []))');
|
|
76
40
|
// The numbers of the matching lines, or `undefined` when the expression passed its time (ADR 0055, 4).
|
|
77
41
|
function matchingLines(lines, pattern, timeoutMs) {
|
|
@@ -88,6 +52,9 @@ function matchingLines(lines, pattern, timeoutMs) {
|
|
|
88
52
|
}
|
|
89
53
|
}
|
|
90
54
|
export async function searchText(workspace, input, signal, limits = searchLimits) {
|
|
55
|
+
if (input.filesOnly === true && input.context !== undefined)
|
|
56
|
+
throw invalid('context and filesOnly can\'t be used together: filesOnly gives no lines to show context around.', { pattern: input.pattern });
|
|
57
|
+
const context = cutInto(input.context ?? 0, 0, contextLimit);
|
|
91
58
|
const pattern = input.literal === true ? input.pattern : expression(input.pattern);
|
|
92
59
|
const requested = input.path === undefined || input.path === '' ? '.' : input.path;
|
|
93
60
|
const target = await resolveInWorkspace(workspace, requested);
|
|
@@ -97,9 +64,8 @@ export async function searchText(workspace, input, signal, limits = searchLimits
|
|
|
97
64
|
throw error;
|
|
98
65
|
});
|
|
99
66
|
const base = await realpath(workspace);
|
|
100
|
-
const
|
|
101
|
-
const
|
|
102
|
-
const files = !found.isDirectory() ? [target] : ((await gitFiles(target, signal)) ?? filesUnder(target, signal));
|
|
67
|
+
const wanted = input.glob === undefined ? () => true : globMatcher(input.glob, target);
|
|
68
|
+
const files = !found.isDirectory() ? [target] : await filesIn(target, signal);
|
|
103
69
|
const grouped = [];
|
|
104
70
|
const started = Date.now();
|
|
105
71
|
let count = 0;
|
|
@@ -122,10 +88,19 @@ export async function searchText(workspace, input, signal, limits = searchLimits
|
|
|
122
88
|
const hits = matchingLines(lines, pattern, Math.min(limits.fileMs, left));
|
|
123
89
|
if (hits === undefined)
|
|
124
90
|
return { files: grouped, truncated: true, reason: 'time' };
|
|
91
|
+
if (hits.length === 0)
|
|
92
|
+
continue;
|
|
93
|
+
const shown = path.relative(base, file).split(path.sep).join('/');
|
|
94
|
+
if (input.filesOnly === true) {
|
|
95
|
+
if (grouped.length === matchesLimit)
|
|
96
|
+
return { files: grouped, truncated: true, reason: 'matches' };
|
|
97
|
+
grouped.push({ path: shown, count: hits.length });
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
125
100
|
const kept = hits.slice(0, matchesLimit - count);
|
|
126
101
|
count += kept.length;
|
|
127
102
|
if (kept.length > 0)
|
|
128
|
-
grouped.push({ path:
|
|
103
|
+
grouped.push({ path: shown, matches: shownLines(lines, kept, context) });
|
|
129
104
|
if (kept.length < hits.length)
|
|
130
105
|
return { files: grouped, truncated: true, reason: 'matches' };
|
|
131
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-text.js","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"search-text.js","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The files under `folder`, in path order: Git's list in a Git workspace, else a walk. */
|
|
2
|
+
export declare function filesIn(folder: string, signal: AbortSignal): Promise<AsyncIterable<string> | Iterable<string>>;
|
|
3
|
+
/** Whether a file under `folder` matches `glob`: by its path from `folder` when the glob has a `/`, else by its name. */
|
|
4
|
+
export declare function globMatcher(glob: string, folder: string): (file: string) => boolean;
|
|
5
|
+
//# sourceMappingURL=workspace-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../src/files/workspace-files.ts"],"names":[],"mappings":"AAmDA,2FAA2F;AAC3F,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAEpH;AAQD,yHAAyH;AACzH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAGnF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { lstat, readdir, realpath } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
// The files `fs search` and `fs find` look at (plan 08 §8.5; ADR 0055; ADR 0090, 2): every file under a folder inside
|
|
6
|
+
// the workspace folder, in path order, without dependency and dot folders, and in a Git workspace without what Git
|
|
7
|
+
// ignores. A symlink is never followed, so the walk can't leave the workspace or loop.
|
|
8
|
+
const skipped = (name) => name === 'node_modules' || name.startsWith('.');
|
|
9
|
+
const run = promisify(execFile);
|
|
10
|
+
// Every file under `folder`, in path order.
|
|
11
|
+
async function* filesUnder(folder, signal) {
|
|
12
|
+
for (const entry of (await readdir(folder, { withFileTypes: true })).sort((first, second) => (first.name < second.name ? -1 : 1))) {
|
|
13
|
+
signal.throwIfAborted();
|
|
14
|
+
const child = path.join(folder, entry.name);
|
|
15
|
+
if (skipped(entry.name))
|
|
16
|
+
continue;
|
|
17
|
+
if (entry.isDirectory())
|
|
18
|
+
yield* filesUnder(child, signal);
|
|
19
|
+
else if (entry.isFile())
|
|
20
|
+
yield child;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Git lists symlinks too, and a folder on the way may be one: only a regular file whose real path is under the
|
|
24
|
+
// searched folder is read, as the walk never follows a link.
|
|
25
|
+
async function regularInside(file, folder) {
|
|
26
|
+
const found = await lstat(file).catch(() => undefined);
|
|
27
|
+
if (found?.isFile() !== true)
|
|
28
|
+
return false;
|
|
29
|
+
const inside = path.relative(folder, await realpath(file));
|
|
30
|
+
return inside !== '' && !inside.startsWith('..') && !path.isAbsolute(inside);
|
|
31
|
+
}
|
|
32
|
+
// The files Git lists under `folder` as tracked or untracked and not ignored; `undefined` where Git can't say.
|
|
33
|
+
// A repository's own configuration may name a program as its file monitor, which listing would run: it is turned off.
|
|
34
|
+
async function gitFiles(folder, signal) {
|
|
35
|
+
let listed;
|
|
36
|
+
try {
|
|
37
|
+
listed = (await run('git', ['-c', 'core.fsmonitor=false', 'ls-files', '--cached', '--others', '--exclude-standard', '-z'], { cwd: folder, signal, maxBuffer: 64 * 1024 * 1024 })).stdout;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
signal.throwIfAborted();
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const real = await realpath(folder);
|
|
44
|
+
const files = [];
|
|
45
|
+
for (const name of listed.split('\0').filter((entry) => entry !== '' && !entry.split('/').some(skipped)).sort()) {
|
|
46
|
+
const file = path.join(real, name);
|
|
47
|
+
if (await regularInside(file, real))
|
|
48
|
+
files.push(file);
|
|
49
|
+
}
|
|
50
|
+
return files;
|
|
51
|
+
}
|
|
52
|
+
/** The files under `folder`, in path order: Git's list in a Git workspace, else a walk. */
|
|
53
|
+
export async function filesIn(folder, signal) {
|
|
54
|
+
return (await gitFiles(folder, signal)) ?? filesUnder(folder, signal);
|
|
55
|
+
}
|
|
56
|
+
// A glob as an expression: `**` is any run, `*` any run but `/`, `?` one character but `/`.
|
|
57
|
+
function globExpression(glob) {
|
|
58
|
+
const body = glob.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*\*\/?|\*|\?/g, (found) => (found.startsWith('**') ? '.*' : found === '*' ? '[^/]*' : '[^/]'));
|
|
59
|
+
return new RegExp(`^${body}$`);
|
|
60
|
+
}
|
|
61
|
+
/** Whether a file under `folder` matches `glob`: by its path from `folder` when the glob has a `/`, else by its name. */
|
|
62
|
+
export function globMatcher(glob, folder) {
|
|
63
|
+
const expression = globExpression(glob);
|
|
64
|
+
return glob.includes('/') ? (file) => expression.test(path.relative(folder, file).split(path.sep).join('/')) : (file) => expression.test(path.basename(file));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=workspace-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-files.js","sourceRoot":"","sources":["../../src/files/workspace-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,sHAAsH;AACtH,mHAAmH;AACnH,uFAAuF;AAEvF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC3F,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEhC,4CAA4C;AAC5C,KAAK,SAAS,CAAC,CAAC,UAAU,CAAC,MAAc,EAAE,MAAmB;IAC5D,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClI,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aACrD,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,MAAM,KAAK,CAAC;IACvC,CAAC;AACH,CAAC;AAED,+GAA+G;AAC/G,6DAA6D;AAC7D,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACvD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED,+GAA+G;AAC/G,sHAAsH;AACtH,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,MAAmB;IACzD,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3L,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,MAAmB;IAC/D,OAAO,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,4FAA4F;AAC5F,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAChK,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,yHAAyH;AACzH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAChK,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAqCtC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,EAAE,MAAM,UAAU,CAAC;yBAGf,KAAK,GAAG,KAAG,IAAI;AAA/B,wBA6CE"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,9 @@ import { registerAskConnector } from "./connectors/ask.js";
|
|
|
7
7
|
import { registerBackgroundConnector } from "./connectors/background.js";
|
|
8
8
|
import { registerBinaryConnector } from "./connectors/binary.js";
|
|
9
9
|
import { registerFsConnector } from "./connectors/fs.js";
|
|
10
|
+
import { registerChanges } from "./files/register-changes.js";
|
|
10
11
|
import { registerMcpConnector } from "./connectors/mcp.js";
|
|
12
|
+
import { registerWebConnector } from "./connectors/web.js";
|
|
11
13
|
import { registerShellConnector } from "./connectors/shell.js";
|
|
12
14
|
import { registerDelegateConnector } from "./connectors/delegate.js";
|
|
13
15
|
import { registerContinueCheck } from "./delegate/continue-helper.js";
|
|
@@ -44,6 +46,7 @@ export default (ctx) => {
|
|
|
44
46
|
registerShellConnector(ctx);
|
|
45
47
|
registerBinaryConnector(ctx);
|
|
46
48
|
registerFsConnector(ctx);
|
|
49
|
+
registerChanges(ctx);
|
|
47
50
|
registerArtifactConnector(ctx);
|
|
48
51
|
registerExecutionMapConnector(ctx);
|
|
49
52
|
registerMaps(ctx);
|
|
@@ -53,6 +56,7 @@ export default (ctx) => {
|
|
|
53
56
|
registerContinueCheck(ctx);
|
|
54
57
|
registerWorkerRun(ctx);
|
|
55
58
|
registerMcpConnector(ctx);
|
|
59
|
+
registerWebConnector(ctx);
|
|
56
60
|
registerMcp(ctx);
|
|
57
61
|
registerConnectorHelp(ctx);
|
|
58
62
|
registerInterruptions(ctx);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|