@chances-ai/engine 28.0.0 → 30.0.0

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 (151) hide show
  1. package/dist/agents/index.js +1 -1
  2. package/dist/ai/adapters/ai-sdk-stream.js +15 -0
  3. package/dist/ai/adapters/ai-sdk-stream.js.map +1 -1
  4. package/dist/ai/adapters/ai-sdk.js +1 -1
  5. package/dist/ai/adapters/ai-sdk.js.map +1 -1
  6. package/dist/ai/setup.d.ts +1 -1
  7. package/dist/ai/setup.js +1 -1
  8. package/dist/ai/types.d.ts +13 -1
  9. package/dist/ai/types.d.ts.map +1 -1
  10. package/dist/core/engine.d.ts +17 -3
  11. package/dist/core/engine.d.ts.map +1 -1
  12. package/dist/core/engine.js +49 -3
  13. package/dist/core/engine.js.map +1 -1
  14. package/dist/core/task-tool.d.ts +1 -1
  15. package/dist/core/task-tool.js +1 -1
  16. package/dist/core/workspace-query.d.ts +1 -1
  17. package/dist/core/workspace-query.js +1 -1
  18. package/dist/hashline/apply.d.ts +9 -0
  19. package/dist/hashline/apply.d.ts.map +1 -0
  20. package/dist/hashline/apply.js +523 -0
  21. package/dist/hashline/apply.js.map +1 -0
  22. package/dist/hashline/block.d.ts +25 -0
  23. package/dist/hashline/block.d.ts.map +1 -0
  24. package/dist/hashline/block.js +71 -0
  25. package/dist/hashline/block.js.map +1 -0
  26. package/dist/hashline/format.d.ts +106 -0
  27. package/dist/hashline/format.d.ts.map +1 -0
  28. package/dist/hashline/format.js +191 -0
  29. package/dist/hashline/format.js.map +1 -0
  30. package/dist/hashline/fs.d.ts +87 -0
  31. package/dist/hashline/fs.d.ts.map +1 -0
  32. package/dist/hashline/fs.js +123 -0
  33. package/dist/hashline/fs.js.map +1 -0
  34. package/dist/hashline/index.d.ts +27 -0
  35. package/dist/hashline/index.d.ts.map +1 -0
  36. package/dist/hashline/index.js +27 -0
  37. package/dist/hashline/index.js.map +1 -0
  38. package/dist/hashline/input.d.ts +101 -0
  39. package/dist/hashline/input.d.ts.map +1 -0
  40. package/dist/hashline/input.js +378 -0
  41. package/dist/hashline/input.js.map +1 -0
  42. package/dist/hashline/messages.d.ts +87 -0
  43. package/dist/hashline/messages.d.ts.map +1 -0
  44. package/dist/hashline/messages.js +94 -0
  45. package/dist/hashline/messages.js.map +1 -0
  46. package/dist/hashline/mismatch.d.ts +45 -0
  47. package/dist/hashline/mismatch.d.ts.map +1 -0
  48. package/dist/hashline/mismatch.js +118 -0
  49. package/dist/hashline/mismatch.js.map +1 -0
  50. package/dist/hashline/normalize.d.ts +22 -0
  51. package/dist/hashline/normalize.d.ts.map +1 -0
  52. package/dist/hashline/normalize.js +31 -0
  53. package/dist/hashline/normalize.js.map +1 -0
  54. package/dist/hashline/parser.d.ts +24 -0
  55. package/dist/hashline/parser.d.ts.map +1 -0
  56. package/dist/hashline/parser.js +295 -0
  57. package/dist/hashline/parser.js.map +1 -0
  58. package/dist/hashline/patcher.d.ts +111 -0
  59. package/dist/hashline/patcher.d.ts.map +1 -0
  60. package/dist/hashline/patcher.js +332 -0
  61. package/dist/hashline/patcher.js.map +1 -0
  62. package/dist/hashline/recovery.d.ts +41 -0
  63. package/dist/hashline/recovery.d.ts.map +1 -0
  64. package/dist/hashline/recovery.js +175 -0
  65. package/dist/hashline/recovery.js.map +1 -0
  66. package/dist/hashline/snapshots.d.ts +62 -0
  67. package/dist/hashline/snapshots.d.ts.map +1 -0
  68. package/dist/hashline/snapshots.js +127 -0
  69. package/dist/hashline/snapshots.js.map +1 -0
  70. package/dist/hashline/tokenizer.d.ts +66 -0
  71. package/dist/hashline/tokenizer.d.ts.map +1 -0
  72. package/dist/hashline/tokenizer.js +408 -0
  73. package/dist/hashline/tokenizer.js.map +1 -0
  74. package/dist/hashline/types.d.ts +117 -0
  75. package/dist/hashline/types.d.ts.map +1 -0
  76. package/dist/hashline/types.js +13 -0
  77. package/dist/hashline/types.js.map +1 -0
  78. package/dist/local-vault/index.d.ts +1 -1
  79. package/dist/local-vault/index.js +1 -1
  80. package/dist/lsp/index.d.ts +1 -1
  81. package/dist/lsp/index.js +1 -1
  82. package/dist/lsp/types.d.ts +2 -2
  83. package/dist/mcp/host.d.ts +3 -3
  84. package/dist/mcp/load-mcp-host.d.ts +4 -4
  85. package/dist/mcp/load-mcp-host.js +4 -4
  86. package/dist/mcp/oauth/provider.d.ts.map +1 -1
  87. package/dist/mcp/oauth/provider.js +10 -1
  88. package/dist/mcp/oauth/provider.js.map +1 -1
  89. package/dist/plugin-api/index.d.ts +10 -2
  90. package/dist/plugin-api/index.d.ts.map +1 -1
  91. package/dist/plugin-api/index.js +15 -0
  92. package/dist/plugin-api/index.js.map +1 -1
  93. package/dist/tools/approval.d.ts +1 -1
  94. package/dist/tools/approval.js +1 -1
  95. package/dist/tools/builtins/_hashline-fs.d.ts +16 -0
  96. package/dist/tools/builtins/_hashline-fs.d.ts.map +1 -0
  97. package/dist/tools/builtins/_hashline-fs.js +62 -0
  98. package/dist/tools/builtins/_hashline-fs.js.map +1 -0
  99. package/dist/tools/builtins/_image.d.ts +26 -0
  100. package/dist/tools/builtins/_image.d.ts.map +1 -0
  101. package/dist/tools/builtins/_image.js +76 -0
  102. package/dist/tools/builtins/_image.js.map +1 -0
  103. package/dist/tools/builtins/_login-shell.d.ts +17 -0
  104. package/dist/tools/builtins/_login-shell.d.ts.map +1 -0
  105. package/dist/tools/builtins/_login-shell.js +66 -0
  106. package/dist/tools/builtins/_login-shell.js.map +1 -0
  107. package/dist/tools/builtins/_notebook.d.ts +15 -0
  108. package/dist/tools/builtins/_notebook.d.ts.map +1 -0
  109. package/dist/tools/builtins/_notebook.js +81 -0
  110. package/dist/tools/builtins/_notebook.js.map +1 -0
  111. package/dist/tools/builtins/_pdf.d.ts +19 -0
  112. package/dist/tools/builtins/_pdf.d.ts.map +1 -0
  113. package/dist/tools/builtins/_pdf.js +42 -0
  114. package/dist/tools/builtins/_pdf.js.map +1 -0
  115. package/dist/tools/builtins/_shared.d.ts +11 -0
  116. package/dist/tools/builtins/_shared.d.ts.map +1 -1
  117. package/dist/tools/builtins/_shared.js +40 -1
  118. package/dist/tools/builtins/_shared.js.map +1 -1
  119. package/dist/tools/builtins/ast-edit.d.ts +18 -0
  120. package/dist/tools/builtins/ast-edit.d.ts.map +1 -0
  121. package/dist/tools/builtins/ast-edit.js +109 -0
  122. package/dist/tools/builtins/ast-edit.js.map +1 -0
  123. package/dist/tools/builtins/ast-grep.d.ts +6 -0
  124. package/dist/tools/builtins/ast-grep.d.ts.map +1 -0
  125. package/dist/tools/builtins/ast-grep.js +67 -0
  126. package/dist/tools/builtins/ast-grep.js.map +1 -0
  127. package/dist/tools/builtins/bash.d.ts.map +1 -1
  128. package/dist/tools/builtins/bash.js +13 -2
  129. package/dist/tools/builtins/bash.js.map +1 -1
  130. package/dist/tools/builtins/edit.d.ts.map +1 -1
  131. package/dist/tools/builtins/edit.js +112 -31
  132. package/dist/tools/builtins/edit.js.map +1 -1
  133. package/dist/tools/builtins/lsp.js +1 -1
  134. package/dist/tools/builtins/pty.d.ts +1 -1
  135. package/dist/tools/builtins/read.d.ts.map +1 -1
  136. package/dist/tools/builtins/read.js +187 -11
  137. package/dist/tools/builtins/read.js.map +1 -1
  138. package/dist/tools/builtins.d.ts.map +1 -1
  139. package/dist/tools/builtins.js +4 -0
  140. package/dist/tools/builtins.js.map +1 -1
  141. package/dist/tools/file-lock.d.ts +8 -0
  142. package/dist/tools/file-lock.d.ts.map +1 -1
  143. package/dist/tools/file-lock.js +22 -0
  144. package/dist/tools/file-lock.js.map +1 -1
  145. package/dist/tools/index.d.ts +1 -1
  146. package/dist/tools/index.d.ts.map +1 -1
  147. package/dist/tools/index.js.map +1 -1
  148. package/dist/tools/types.d.ts +27 -1
  149. package/dist/tools/types.d.ts.map +1 -1
  150. package/dist/tools/types.js.map +1 -1
  151. package/package.json +8 -3
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Per-session snapshot store used by {@link Recovery} and {@link Patcher} to
3
+ * bind hashline section tags to the exact file content that minted them. Ported
4
+ * from oh-my-pi `packages/hashline/src/snapshots.ts`.
5
+ *
6
+ * **chances-cli changes (7.9):**
7
+ * - `lru-cache` dependency replaced with a ~30-line {@link LruMap} (R1-OQ1,
8
+ * engine keeps a narrow dependency surface).
9
+ * - `record(path, fullText)` is path-aware: the hash trims trailing
10
+ * whitespace except for Markdown (R1-S7, see `format.ts`).
11
+ *
12
+ * A section tag is a content-derived hash of the *whole file* (see
13
+ * {@link computeFileHash}). Any read of byte-identical content mints the same
14
+ * tag, so reads of one file state fuse onto one anchor and a follow-up edit
15
+ * anchored at any line validates whenever the live file still hashes to it.
16
+ *
17
+ * The tag is only a fast INDEX, though: the {@link Patcher} confirms an exact
18
+ * snapshot-text match before applying (R1-M3), so a 16-bit collision can never
19
+ * silently corrupt content — it degrades to a forced re-read.
20
+ *
21
+ * Producers (typically `read` / `search` / `write` tools) call
22
+ * {@link SnapshotStore.record} with the full normalized text they observed.
23
+ * The store hashes it, dedups against the per-path history, and returns the
24
+ * tag. Consumers (the patcher) resolve a stale tag back to the recorded full
25
+ * text via {@link SnapshotStore.byHash} and 3-way-merge the would-be edit onto
26
+ * the live content.
27
+ */
28
+ import { computeFileHash, hashTrimsTrailing } from "./format.js";
29
+ /**
30
+ * Storage seam for full-file version snapshots. The patcher calls {@link head}
31
+ * for the latest version of a path and {@link byHash} when it needs the
32
+ * specific historical version a section's stale tag names.
33
+ */
34
+ export class SnapshotStore {
35
+ }
36
+ const DEFAULT_MAX_PATHS = 30;
37
+ const DEFAULT_MAX_VERSIONS_PER_PATH = 4;
38
+ /**
39
+ * Minimal insertion-order LRU over a `Map`. `get` refreshes recency by
40
+ * re-inserting; `set` evicts the oldest key once `max` is exceeded. Replaces
41
+ * the `lru-cache` dependency for the snapshot store's bounded path tracking.
42
+ */
43
+ class LruMap {
44
+ #map = new Map();
45
+ #max;
46
+ constructor(max) {
47
+ this.#max = Math.max(1, max);
48
+ }
49
+ get(key) {
50
+ const value = this.#map.get(key);
51
+ if (value === undefined)
52
+ return undefined;
53
+ // Refresh recency: delete + re-insert moves the key to the most-recent end.
54
+ this.#map.delete(key);
55
+ this.#map.set(key, value);
56
+ return value;
57
+ }
58
+ set(key, value) {
59
+ if (this.#map.has(key))
60
+ this.#map.delete(key);
61
+ this.#map.set(key, value);
62
+ while (this.#map.size > this.#max) {
63
+ const oldest = this.#map.keys().next().value;
64
+ if (oldest === undefined)
65
+ break;
66
+ this.#map.delete(oldest);
67
+ }
68
+ }
69
+ delete(key) {
70
+ this.#map.delete(key);
71
+ }
72
+ clear() {
73
+ this.#map.clear();
74
+ }
75
+ }
76
+ /**
77
+ * In-memory {@link SnapshotStore} backed by {@link LruMap}. Per-path history is
78
+ * a short ring of full-file versions (oldest dropped first); per-session path
79
+ * tracking is LRU-bounded so cold paths age out automatically.
80
+ *
81
+ * Recording byte-identical content again refreshes recency and reuses the
82
+ * existing tag (read fusion); recording new content unshifts a fresh version
83
+ * onto the front of the path history.
84
+ */
85
+ export class InMemorySnapshotStore extends SnapshotStore {
86
+ #versions;
87
+ #maxVersionsPerPath;
88
+ #now;
89
+ constructor(options = {}) {
90
+ super();
91
+ this.#versions = new LruMap(options.maxPaths ?? DEFAULT_MAX_PATHS);
92
+ this.#maxVersionsPerPath = options.maxVersionsPerPath ?? DEFAULT_MAX_VERSIONS_PER_PATH;
93
+ this.#now = options.now ?? Date.now;
94
+ }
95
+ head(path) {
96
+ return this.#versions.get(path)?.[0] ?? null;
97
+ }
98
+ byHash(path, hash) {
99
+ const history = this.#versions.get(path);
100
+ return history?.find((version) => version.hash === hash) ?? null;
101
+ }
102
+ record(path, fullText) {
103
+ const hash = computeFileHash(fullText, hashTrimsTrailing(path));
104
+ // `get` refreshes LRU recency for `path`.
105
+ const history = this.#versions.get(path) ?? [];
106
+ const existing = history.find((version) => version.hash === hash && version.text === fullText);
107
+ if (existing) {
108
+ // Same content state observed again: refresh recency and promote to
109
+ // head (it is the current file content), then reuse the tag.
110
+ existing.recordedAt = this.#now();
111
+ if (history[0] !== existing) {
112
+ this.#versions.set(path, [existing, ...history.filter((version) => version !== existing)]);
113
+ }
114
+ return hash;
115
+ }
116
+ const snapshot = { path, text: fullText, hash, recordedAt: this.#now() };
117
+ this.#versions.set(path, [snapshot, ...history].slice(0, this.#maxVersionsPerPath));
118
+ return hash;
119
+ }
120
+ invalidate(path) {
121
+ this.#versions.delete(path);
122
+ }
123
+ clear() {
124
+ this.#versions.clear();
125
+ }
126
+ }
127
+ //# sourceMappingURL=snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/hashline/snapshots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { Anchor, Cursor, ParsedRange } from "./types.js";
2
+ export declare function splitHashlineLines(text: string): string[];
3
+ export declare function cloneCursor(cursor: Cursor): Cursor;
4
+ /** Parse a bare line-number anchor. Throws on malformed input. */
5
+ export declare function parseLid(raw: string, lineNum: number): Anchor;
6
+ export type BlockTarget = {
7
+ kind: "replace";
8
+ range: ParsedRange;
9
+ } | {
10
+ kind: "block";
11
+ anchor: Anchor;
12
+ } | {
13
+ kind: "delete";
14
+ range: ParsedRange;
15
+ } | {
16
+ kind: "delete_block";
17
+ anchor: Anchor;
18
+ } | {
19
+ kind: "insert_before";
20
+ anchor: Anchor;
21
+ } | {
22
+ kind: "insert_after";
23
+ anchor: Anchor;
24
+ } | {
25
+ kind: "bof";
26
+ } | {
27
+ kind: "eof";
28
+ };
29
+ interface TokenBase {
30
+ lineNum: number;
31
+ }
32
+ export type Token = (TokenBase & {
33
+ kind: "blank";
34
+ }) | (TokenBase & {
35
+ kind: "envelope-begin";
36
+ }) | (TokenBase & {
37
+ kind: "envelope-end";
38
+ }) | (TokenBase & {
39
+ kind: "abort";
40
+ }) | (TokenBase & {
41
+ kind: "header";
42
+ path: string;
43
+ fileHash?: string;
44
+ }) | (TokenBase & {
45
+ kind: "op-block";
46
+ target: BlockTarget;
47
+ }) | (TokenBase & {
48
+ kind: "payload-literal";
49
+ text: string;
50
+ }) | (TokenBase & {
51
+ kind: "raw";
52
+ text: string;
53
+ });
54
+ export declare class Tokenizer {
55
+ #private;
56
+ feed(chunk: string): Token[];
57
+ end(): Token[];
58
+ reset(): void;
59
+ tokenizeAll(text: string): Token[];
60
+ tokenize(line: string, lineNum?: number): Token;
61
+ isOp(line: string): boolean;
62
+ isHeader(line: string): boolean;
63
+ isEnvelopeMarker(line: string): boolean;
64
+ }
65
+ export type { ParsedRange } from "./types.js";
66
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/hashline/tokenizer.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6D9D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBzD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAoBD,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAW7D;AA2DD,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAwIpB,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,KAAK,GACb,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAC/B,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,GACxC,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,GACtC,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAC/B,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACjE,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,GACvD,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,CAAC,SAAS,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA6BhD,qBAAa,SAAS;;IAKpB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE;IAO5B,GAAG,IAAI,KAAK,EAAE;IAWd,KAAK,IAAI,IAAI;IAMb,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE;IAOlC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,KAAK;IAI1C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAsBxC;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,408 @@
1
+ /**
2
+ * Stateful, line-oriented classifier for hashline diff text. Ported from
3
+ * oh-my-pi `packages/hashline/src/tokenizer.ts` (pure logic; only import
4
+ * extensions changed for chances-cli ESM).
5
+ *
6
+ * Format shape:
7
+ * ```
8
+ * ¶path/to/file.ts#0A3
9
+ * replace 5..7:
10
+ * +literal new line
11
+ * ```
12
+ */
13
+ import { describeAnchorExamples, HL_BLOCK_KEYWORD, HL_DELETE_KEYWORD, HL_FILE_HASH_LENGTH, HL_FILE_HASH_SEP, HL_FILE_PREFIX, HL_HEADER_COLON, HL_INSERT_AFTER, HL_INSERT_BEFORE, HL_INSERT_HEAD, HL_INSERT_KEYWORD, HL_INSERT_TAIL, HL_PAYLOAD_REPLACE, HL_REPLACE_KEYWORD, } from "./format.js";
14
+ import { ABORT_MARKER, BEGIN_PATCH_MARKER, END_PATCH_MARKER } from "./messages.js";
15
+ const CHAR_LINE_FEED = 10;
16
+ const CHAR_CARRIAGE_RETURN = 13;
17
+ const CHAR_ZERO = 48;
18
+ const CHAR_NINE = 57;
19
+ const CHAR_HASH = 35;
20
+ const CHAR_TAB = 9;
21
+ const CHAR_SPACE = 32;
22
+ const CHAR_DOT = 46;
23
+ const CHAR_HYPHEN = 45;
24
+ const CHAR_ELLIPSIS = 0x2026;
25
+ const CHAR_UPPER_A = 65;
26
+ const CHAR_UPPER_F = 70;
27
+ const CHAR_LOWER_A = 97;
28
+ const CHAR_LOWER_F = 102;
29
+ const CHAR_PAYLOAD_REPLACE = HL_PAYLOAD_REPLACE.charCodeAt(0);
30
+ const CHAR_COLON = HL_HEADER_COLON.charCodeAt(0);
31
+ const FILE_PREFIX_LENGTH = HL_FILE_PREFIX.length;
32
+ function isDigitCode(code) {
33
+ return code >= CHAR_ZERO && code <= CHAR_NINE;
34
+ }
35
+ function isNonZeroDigitCode(code) {
36
+ return code > CHAR_ZERO && code <= CHAR_NINE;
37
+ }
38
+ function isHexDigitCode(code) {
39
+ return (isDigitCode(code) ||
40
+ (code >= CHAR_UPPER_A && code <= CHAR_UPPER_F) ||
41
+ (code >= CHAR_LOWER_A && code <= CHAR_LOWER_F));
42
+ }
43
+ function isWhitespaceCode(code) {
44
+ return code === CHAR_SPACE || (code >= CHAR_TAB && code <= CHAR_CARRIAGE_RETURN);
45
+ }
46
+ function skipWhitespace(line, index, end = line.length) {
47
+ while (index < end && isWhitespaceCode(line.charCodeAt(index)))
48
+ index++;
49
+ return index;
50
+ }
51
+ function trimEndIndex(line) {
52
+ let end = line.length;
53
+ while (end > 0 && isWhitespaceCode(line.charCodeAt(end - 1)))
54
+ end--;
55
+ return end;
56
+ }
57
+ function isEmptyLine(line) {
58
+ return line.length === 0;
59
+ }
60
+ function markerLineEquals(line, marker) {
61
+ const end = trimEndIndex(line);
62
+ return end === marker.length && line.startsWith(marker);
63
+ }
64
+ export function splitHashlineLines(text) {
65
+ if (text.length === 0)
66
+ return [""];
67
+ const lines = [];
68
+ let start = 0;
69
+ for (let index = 0; index < text.length; index++) {
70
+ if (text.charCodeAt(index) !== CHAR_LINE_FEED)
71
+ continue;
72
+ let end = index;
73
+ if (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN)
74
+ end--;
75
+ lines.push(text.slice(start, end));
76
+ start = index + 1;
77
+ }
78
+ if (start < text.length) {
79
+ let end = text.length;
80
+ if (end > start && text.charCodeAt(end - 1) === CHAR_CARRIAGE_RETURN)
81
+ end--;
82
+ lines.push(text.slice(start, end));
83
+ }
84
+ return lines;
85
+ }
86
+ export function cloneCursor(cursor) {
87
+ if (cursor.kind === "before_anchor")
88
+ return { kind: "before_anchor", anchor: { ...cursor.anchor } };
89
+ if (cursor.kind === "after_anchor")
90
+ return { kind: "after_anchor", anchor: { ...cursor.anchor } };
91
+ return cursor;
92
+ }
93
+ function scanLineNumber(line, index, end) {
94
+ if (index >= end || !isNonZeroDigitCode(line.charCodeAt(index)))
95
+ return null;
96
+ let lineNumber = 0;
97
+ let nextIndex = index;
98
+ while (nextIndex < end) {
99
+ const code = line.charCodeAt(nextIndex);
100
+ if (!isDigitCode(code))
101
+ break;
102
+ lineNumber = lineNumber * 10 + (code - CHAR_ZERO);
103
+ nextIndex++;
104
+ }
105
+ return { line: lineNumber, nextIndex };
106
+ }
107
+ /** Parse a bare line-number anchor. Throws on malformed input. */
108
+ export function parseLid(raw, lineNum) {
109
+ const end = trimEndIndex(raw);
110
+ const numberStart = skipWhitespace(raw, 0, end);
111
+ const number = scanLineNumber(raw, numberStart, end);
112
+ if (number === null || skipWhitespace(raw, number.nextIndex, end) !== end) {
113
+ throw new Error(`line ${lineNum}: expected a line number such as ${describeAnchorExamples("119")}; ` +
114
+ `got ${JSON.stringify(raw)}. Use ${HL_FILE_PREFIX}PATH${HL_FILE_HASH_SEP}hash from your latest read for file-version binding.`);
115
+ }
116
+ return { line: number.line };
117
+ }
118
+ function scanRangeSeparator(line, index, end) {
119
+ let cursor = index;
120
+ let consumedSeparator = false;
121
+ while (cursor < end) {
122
+ const code = line.charCodeAt(cursor);
123
+ if (isWhitespaceCode(code)) {
124
+ cursor++;
125
+ consumedSeparator = true;
126
+ continue;
127
+ }
128
+ if (code === CHAR_HYPHEN || code === CHAR_ELLIPSIS) {
129
+ cursor++;
130
+ consumedSeparator = true;
131
+ continue;
132
+ }
133
+ if (code === CHAR_DOT && cursor + 1 < end && line.charCodeAt(cursor + 1) === CHAR_DOT) {
134
+ cursor += 2;
135
+ consumedSeparator = true;
136
+ continue;
137
+ }
138
+ break;
139
+ }
140
+ if (!consumedSeparator)
141
+ return null;
142
+ if (cursor >= end || !isNonZeroDigitCode(line.charCodeAt(cursor)))
143
+ return null;
144
+ return cursor;
145
+ }
146
+ function scanHeaderRange(line, index = 0, end = trimEndIndex(line), allowSingle = false) {
147
+ const numberStart = skipWhitespace(line, index, end);
148
+ const start = scanLineNumber(line, numberStart, end);
149
+ if (start === null)
150
+ return null;
151
+ const afterFirst = scanRangeSeparator(line, start.nextIndex, end);
152
+ if (afterFirst === null) {
153
+ if (!allowSingle)
154
+ return null;
155
+ return {
156
+ range: { start: { line: start.line }, end: { line: start.line } },
157
+ nextIndex: skipWhitespace(line, start.nextIndex, end),
158
+ };
159
+ }
160
+ const endNumber = scanLineNumber(line, afterFirst, end);
161
+ if (endNumber === null)
162
+ return null;
163
+ return {
164
+ range: { start: { line: start.line }, end: { line: endNumber.line } },
165
+ nextIndex: skipWhitespace(line, endNumber.nextIndex, end),
166
+ };
167
+ }
168
+ function scanKeyword(line, index, end, keyword) {
169
+ if (!line.startsWith(keyword, index))
170
+ return null;
171
+ const next = index + keyword.length;
172
+ if (next < end) {
173
+ const code = line.charCodeAt(next);
174
+ if (!isWhitespaceCode(code) && code !== CHAR_COLON)
175
+ return null;
176
+ }
177
+ return next;
178
+ }
179
+ function consumeOptionalColon(line, index, end) {
180
+ const cursor = skipWhitespace(line, index, end);
181
+ return cursor < end && line.charCodeAt(cursor) === CHAR_COLON
182
+ ? skipWhitespace(line, cursor + 1, end)
183
+ : cursor;
184
+ }
185
+ function scanInsertTarget(line, index, end) {
186
+ const cursor = skipWhitespace(line, index, end);
187
+ const beforeEnd = scanKeyword(line, cursor, end, HL_INSERT_BEFORE);
188
+ if (beforeEnd !== null) {
189
+ const anchor = scanLineNumber(line, skipWhitespace(line, beforeEnd, end), end);
190
+ if (anchor === null)
191
+ return null;
192
+ const nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);
193
+ return { target: { kind: "insert_before", anchor: { line: anchor.line } }, nextIndex };
194
+ }
195
+ const afterEnd = scanKeyword(line, cursor, end, HL_INSERT_AFTER);
196
+ if (afterEnd !== null) {
197
+ const anchor = scanLineNumber(line, skipWhitespace(line, afterEnd, end), end);
198
+ if (anchor === null)
199
+ return null;
200
+ const nextIndex = consumeOptionalColon(line, anchor.nextIndex, end);
201
+ return { target: { kind: "insert_after", anchor: { line: anchor.line } }, nextIndex };
202
+ }
203
+ const headEnd = scanKeyword(line, cursor, end, HL_INSERT_HEAD);
204
+ if (headEnd !== null)
205
+ return { target: { kind: "bof" }, nextIndex: consumeOptionalColon(line, headEnd, end) };
206
+ const tailEnd = scanKeyword(line, cursor, end, HL_INSERT_TAIL);
207
+ if (tailEnd !== null)
208
+ return { target: { kind: "eof" }, nextIndex: consumeOptionalColon(line, tailEnd, end) };
209
+ return null;
210
+ }
211
+ function scanHunkAnchor(line, start, end) {
212
+ const cursor = skipWhitespace(line, start, end);
213
+ const replaceEnd = scanKeyword(line, cursor, end, HL_REPLACE_KEYWORD);
214
+ if (replaceEnd !== null) {
215
+ // `replace block N:` — resolve N to a tree-sitter block range at apply
216
+ // time. Try the `block` sub-keyword before falling back to a literal
217
+ // `replace N..M:` range.
218
+ const blockEnd = scanKeyword(line, skipWhitespace(line, replaceEnd, end), end, HL_BLOCK_KEYWORD);
219
+ if (blockEnd !== null) {
220
+ const anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);
221
+ if (anchor === null)
222
+ return null;
223
+ return {
224
+ target: { kind: "block", anchor: { line: anchor.line } },
225
+ nextIndex: consumeOptionalColon(line, anchor.nextIndex, end),
226
+ };
227
+ }
228
+ const range = scanHeaderRange(line, replaceEnd, end, true);
229
+ if (range === null)
230
+ return null;
231
+ return {
232
+ target: { kind: "replace", range: range.range },
233
+ nextIndex: consumeOptionalColon(line, range.nextIndex, end),
234
+ };
235
+ }
236
+ const deleteEnd = scanKeyword(line, cursor, end, HL_DELETE_KEYWORD);
237
+ if (deleteEnd !== null) {
238
+ // `delete block N` — resolve N to a tree-sitter block range at apply
239
+ // time and delete its whole span. Like `delete N..M`, it takes no body
240
+ // and no trailing colon.
241
+ const blockEnd = scanKeyword(line, skipWhitespace(line, deleteEnd, end), end, HL_BLOCK_KEYWORD);
242
+ if (blockEnd !== null) {
243
+ const anchor = scanLineNumber(line, skipWhitespace(line, blockEnd, end), end);
244
+ if (anchor === null)
245
+ return null;
246
+ const next = skipWhitespace(line, anchor.nextIndex, end);
247
+ if (next < end && line.charCodeAt(next) === CHAR_COLON)
248
+ return null;
249
+ return { target: { kind: "delete_block", anchor: { line: anchor.line } }, nextIndex: next };
250
+ }
251
+ const range = scanHeaderRange(line, deleteEnd, end, true);
252
+ if (range === null)
253
+ return null;
254
+ const next = skipWhitespace(line, range.nextIndex, end);
255
+ if (next < end && line.charCodeAt(next) === CHAR_COLON)
256
+ return null;
257
+ return { target: { kind: "delete", range: range.range }, nextIndex: next };
258
+ }
259
+ const insertEnd = scanKeyword(line, cursor, end, HL_INSERT_KEYWORD);
260
+ if (insertEnd !== null)
261
+ return scanInsertTarget(line, insertEnd, end);
262
+ return null;
263
+ }
264
+ function tryParseHunkHeader(line) {
265
+ const end = trimEndIndex(line);
266
+ const start = skipWhitespace(line, 0, end);
267
+ if (start >= end)
268
+ return null;
269
+ const scan = scanHunkAnchor(line, start, end);
270
+ if (scan === null)
271
+ return null;
272
+ if (scan.nextIndex !== end)
273
+ return null;
274
+ return { target: scan.target };
275
+ }
276
+ function tryParseHeader(line) {
277
+ if (!line.startsWith(HL_FILE_PREFIX))
278
+ return null;
279
+ const end = trimEndIndex(line);
280
+ let index = FILE_PREFIX_LENGTH;
281
+ if (index >= end)
282
+ return null;
283
+ const pathStart = index;
284
+ while (index < end) {
285
+ const code = line.charCodeAt(index);
286
+ if (code === CHAR_HASH || code === CHAR_SPACE || code === CHAR_TAB)
287
+ break;
288
+ index++;
289
+ }
290
+ if (index === pathStart)
291
+ return null;
292
+ const path = line.slice(pathStart, index);
293
+ let fileHash;
294
+ if (index < end && line.charCodeAt(index) === CHAR_HASH) {
295
+ const hashStart = index + 1;
296
+ const hashEnd = hashStart + HL_FILE_HASH_LENGTH;
297
+ if (hashEnd > end)
298
+ return null;
299
+ for (let probe = hashStart; probe < hashEnd; probe++) {
300
+ if (!isHexDigitCode(line.charCodeAt(probe)))
301
+ return null;
302
+ }
303
+ fileHash = line.slice(hashStart, hashEnd).toUpperCase();
304
+ index = hashEnd;
305
+ }
306
+ if (skipWhitespace(line, index, end) !== end)
307
+ return null;
308
+ return fileHash !== undefined ? { path, fileHash } : { path };
309
+ }
310
+ function classifyLine(line, lineNum) {
311
+ if (isEmptyLine(line))
312
+ return { kind: "blank", lineNum };
313
+ if (markerLineEquals(line, BEGIN_PATCH_MARKER))
314
+ return { kind: "envelope-begin", lineNum };
315
+ if (markerLineEquals(line, END_PATCH_MARKER))
316
+ return { kind: "envelope-end", lineNum };
317
+ if (markerLineEquals(line, ABORT_MARKER))
318
+ return { kind: "abort", lineNum };
319
+ const firstCode = line.charCodeAt(0);
320
+ if (line.startsWith(HL_FILE_PREFIX)) {
321
+ const header = tryParseHeader(line);
322
+ if (header !== null) {
323
+ return header.fileHash !== undefined
324
+ ? { kind: "header", lineNum, path: header.path, fileHash: header.fileHash }
325
+ : { kind: "header", lineNum, path: header.path };
326
+ }
327
+ }
328
+ const lead = skipWhitespace(line, 0);
329
+ const isHunkLead = line.startsWith(HL_REPLACE_KEYWORD, lead) ||
330
+ line.startsWith(HL_DELETE_KEYWORD, lead) ||
331
+ line.startsWith(HL_INSERT_KEYWORD, lead);
332
+ if (isHunkLead) {
333
+ const hunk = tryParseHunkHeader(line);
334
+ if (hunk !== null)
335
+ return { kind: "op-block", lineNum, target: hunk.target };
336
+ }
337
+ if (firstCode === CHAR_PAYLOAD_REPLACE)
338
+ return { kind: "payload-literal", lineNum, text: line.slice(1) };
339
+ return { kind: "raw", lineNum, text: line };
340
+ }
341
+ export class Tokenizer {
342
+ #buffer = "";
343
+ #nextLineNum = 1;
344
+ #closed = false;
345
+ feed(chunk) {
346
+ if (this.#closed)
347
+ throw new Error("Tokenizer is closed; call reset() before reusing.");
348
+ if (chunk.length === 0)
349
+ return [];
350
+ this.#buffer = this.#buffer ? this.#buffer + chunk : chunk;
351
+ return this.#drainCompleteLines();
352
+ }
353
+ end() {
354
+ if (this.#closed)
355
+ return [];
356
+ this.#closed = true;
357
+ const buf = this.#buffer;
358
+ this.#buffer = "";
359
+ if (buf.length === 0)
360
+ return [];
361
+ let stop = buf.length;
362
+ if (buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN)
363
+ stop--;
364
+ return [classifyLine(buf.slice(0, stop), this.#nextLineNum++)];
365
+ }
366
+ reset() {
367
+ this.#buffer = "";
368
+ this.#nextLineNum = 1;
369
+ this.#closed = false;
370
+ }
371
+ tokenizeAll(text) {
372
+ this.reset();
373
+ const first = this.feed(text);
374
+ const last = this.end();
375
+ return last.length === 0 ? first : first.concat(last);
376
+ }
377
+ tokenize(line, lineNum = 0) {
378
+ return classifyLine(line, lineNum);
379
+ }
380
+ isOp(line) {
381
+ return tryParseHunkHeader(line) !== null;
382
+ }
383
+ isHeader(line) {
384
+ return tryParseHeader(line) !== null;
385
+ }
386
+ isEnvelopeMarker(line) {
387
+ return (markerLineEquals(line, BEGIN_PATCH_MARKER) ||
388
+ markerLineEquals(line, END_PATCH_MARKER) ||
389
+ markerLineEquals(line, ABORT_MARKER));
390
+ }
391
+ #drainCompleteLines() {
392
+ const tokens = [];
393
+ const buf = this.#buffer;
394
+ let start = 0;
395
+ for (let index = 0; index < buf.length; index++) {
396
+ if (buf.charCodeAt(index) !== CHAR_LINE_FEED)
397
+ continue;
398
+ let stop = index;
399
+ if (stop > start && buf.charCodeAt(stop - 1) === CHAR_CARRIAGE_RETURN)
400
+ stop--;
401
+ tokens.push(classifyLine(buf.slice(start, stop), this.#nextLineNum++));
402
+ start = index + 1;
403
+ }
404
+ this.#buffer = start < buf.length ? buf.slice(start) : "";
405
+ return tokens;
406
+ }
407
+ }
408
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/hashline/tokenizer.ts"],"names":[],"mappings":"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"}