@animalabs/agent-framework 0.23.3 → 0.24.1
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/README.md +212 -42
- package/dist/src/agent.d.ts +65 -9
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +98 -12
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +14 -12
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/clock-rows.d.ts +115 -0
- package/dist/src/clock-rows.d.ts.map +1 -0
- package/dist/src/clock-rows.js +222 -0
- package/dist/src/clock-rows.js.map +1 -0
- package/dist/src/code-execution/engine.d.ts +177 -0
- package/dist/src/code-execution/engine.d.ts.map +1 -0
- package/dist/src/code-execution/engine.js +494 -0
- package/dist/src/code-execution/engine.js.map +1 -0
- package/dist/src/code-execution/index.d.ts +5 -10
- package/dist/src/code-execution/index.d.ts.map +1 -1
- package/dist/src/code-execution/index.js +5 -9
- package/dist/src/code-execution/index.js.map +1 -1
- package/dist/src/code-execution/isolate/calls.d.ts +114 -0
- package/dist/src/code-execution/isolate/calls.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/calls.js +145 -0
- package/dist/src/code-execution/isolate/calls.js.map +1 -0
- package/dist/src/code-execution/isolate/child-entry.d.ts +2 -0
- package/dist/src/code-execution/isolate/child-entry.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/child-entry.js +5 -0
- package/dist/src/code-execution/isolate/child-entry.js.map +1 -0
- package/dist/src/code-execution/isolate/child-main.d.ts +26 -0
- package/dist/src/code-execution/isolate/child-main.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/child-main.js +132 -0
- package/dist/src/code-execution/isolate/child-main.js.map +1 -0
- package/dist/src/code-execution/isolate/child.d.ts +44 -0
- package/dist/src/code-execution/isolate/child.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/child.js +315 -0
- package/dist/src/code-execution/isolate/child.js.map +1 -0
- package/dist/src/code-execution/isolate/frames.d.ts +80 -0
- package/dist/src/code-execution/isolate/frames.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/frames.js +210 -0
- package/dist/src/code-execution/isolate/frames.js.map +1 -0
- package/dist/src/code-execution/isolate/output.d.ts +68 -0
- package/dist/src/code-execution/isolate/output.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/output.js +143 -0
- package/dist/src/code-execution/isolate/output.js.map +1 -0
- package/dist/src/code-execution/isolate/prelude.d.ts +109 -0
- package/dist/src/code-execution/isolate/prelude.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/prelude.js +401 -0
- package/dist/src/code-execution/isolate/prelude.js.map +1 -0
- package/dist/src/code-execution/isolate/protocol.d.ts +151 -0
- package/dist/src/code-execution/isolate/protocol.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/protocol.js +150 -0
- package/dist/src/code-execution/isolate/protocol.js.map +1 -0
- package/dist/src/code-execution/isolate/render.d.ts +57 -0
- package/dist/src/code-execution/isolate/render.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/render.js +214 -0
- package/dist/src/code-execution/isolate/render.js.map +1 -0
- package/dist/src/code-execution/isolate/runner.d.ts +250 -0
- package/dist/src/code-execution/isolate/runner.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/runner.js +854 -0
- package/dist/src/code-execution/isolate/runner.js.map +1 -0
- package/dist/src/code-execution/isolate/scripts.d.ts +175 -0
- package/dist/src/code-execution/isolate/scripts.d.ts.map +1 -0
- package/dist/src/code-execution/isolate/scripts.js +357 -0
- package/dist/src/code-execution/isolate/scripts.js.map +1 -0
- package/dist/src/code-execution/quickjs.wasm +0 -0
- package/dist/src/code-execution/tool-definition.d.ts +93 -43
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +176 -142
- package/dist/src/code-execution/tool-definition.js.map +1 -1
- package/dist/src/deadline-timer.d.ts +3 -0
- package/dist/src/deadline-timer.d.ts.map +1 -1
- package/dist/src/deadline-timer.js +1 -1
- package/dist/src/deadline-timer.js.map +1 -1
- package/dist/src/framework.d.ts +1120 -457
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +4635 -2505
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +28 -4
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +89 -13
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/held-writes.d.ts +16 -3
- package/dist/src/held-writes.d.ts.map +1 -1
- package/dist/src/held-writes.js +16 -3
- package/dist/src/held-writes.js.map +1 -1
- package/dist/src/index.d.ts +8 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +10 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +483 -115
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +1735 -425
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts +19 -39
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- package/dist/src/mcpl/conversation-router.js +27 -59
- package/dist/src/mcpl/conversation-router.js.map +1 -1
- package/dist/src/mcpl/convert-block.d.ts.map +1 -1
- package/dist/src/mcpl/convert-block.js +9 -5
- package/dist/src/mcpl/convert-block.js.map +1 -1
- package/dist/src/mcpl/inbound-source.d.ts +50 -0
- package/dist/src/mcpl/inbound-source.d.ts.map +1 -1
- package/dist/src/mcpl/inbound-source.js +130 -0
- package/dist/src/mcpl/inbound-source.js.map +1 -1
- package/dist/src/mcpl/index.d.ts +2 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +3 -2
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/log-value.d.ts +6 -0
- package/dist/src/mcpl/log-value.d.ts.map +1 -1
- package/dist/src/mcpl/log-value.js +8 -0
- package/dist/src/mcpl/log-value.js.map +1 -1
- package/dist/src/mcpl/modern-connection.d.ts +15 -6
- package/dist/src/mcpl/modern-connection.d.ts.map +1 -1
- package/dist/src/mcpl/modern-connection.js +168 -53
- package/dist/src/mcpl/modern-connection.js.map +1 -1
- package/dist/src/mcpl/prose-grammar.d.ts +4 -5
- package/dist/src/mcpl/prose-grammar.d.ts.map +1 -1
- package/dist/src/mcpl/prose-grammar.js +4 -5
- package/dist/src/mcpl/prose-grammar.js.map +1 -1
- package/dist/src/mcpl/protocol-family.d.ts +97 -10
- package/dist/src/mcpl/protocol-family.d.ts.map +1 -1
- package/dist/src/mcpl/protocol-family.js +174 -17
- package/dist/src/mcpl/protocol-family.js.map +1 -1
- package/dist/src/mcpl/push-coalescer.d.ts +132 -14
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +227 -50
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +9 -20
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +7 -49
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/reference-fetcher.d.ts +2 -2
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +4 -4
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +50 -21
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +158 -74
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/tags.d.ts +24 -0
- package/dist/src/mcpl/tags.d.ts.map +1 -1
- package/dist/src/mcpl/tags.js +33 -0
- package/dist/src/mcpl/tags.js.map +1 -1
- package/dist/src/mcpl/tool-result-normalize.d.ts +2 -1
- package/dist/src/mcpl/tool-result-normalize.d.ts.map +1 -1
- package/dist/src/mcpl/tool-result-normalize.js.map +1 -1
- package/dist/src/mcpl/transport.d.ts +55 -7
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +163 -34
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +22 -6
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/module-registry.d.ts +4 -2
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +100 -13
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +8 -13
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +27 -4
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts +15 -3
- package/dist/src/modules/history/semantic.d.ts.map +1 -1
- package/dist/src/modules/history/semantic.js +27 -5
- package/dist/src/modules/history/semantic.js.map +1 -1
- package/dist/src/modules/index.d.ts +1 -1
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/modules/unknown-tool.d.ts +4 -1
- package/dist/src/modules/unknown-tool.d.ts.map +1 -1
- package/dist/src/modules/unknown-tool.js +4 -1
- package/dist/src/modules/unknown-tool.js.map +1 -1
- package/dist/src/modules/workspace/branch-intent.d.ts +3 -1
- package/dist/src/modules/workspace/branch-intent.d.ts.map +1 -1
- package/dist/src/modules/workspace/branch-intent.js +3 -1
- package/dist/src/modules/workspace/branch-intent.js.map +1 -1
- package/dist/src/modules/workspace/edit-plan.d.ts +265 -0
- package/dist/src/modules/workspace/edit-plan.d.ts.map +1 -0
- package/dist/src/modules/workspace/edit-plan.js +794 -0
- package/dist/src/modules/workspace/edit-plan.js.map +1 -0
- package/dist/src/modules/workspace/edit-text.d.ts +117 -0
- package/dist/src/modules/workspace/edit-text.d.ts.map +1 -0
- package/dist/src/modules/workspace/edit-text.js +584 -0
- package/dist/src/modules/workspace/edit-text.js.map +1 -0
- package/dist/src/modules/workspace/effects.d.ts +5 -4
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/effects.js +78 -25
- package/dist/src/modules/workspace/effects.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +493 -62
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +2216 -652
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/observe.d.ts +213 -38
- package/dist/src/modules/workspace/observe.d.ts.map +1 -1
- package/dist/src/modules/workspace/observe.js +416 -36
- package/dist/src/modules/workspace/observe.js.map +1 -1
- package/dist/src/modules/workspace/reconcile.d.ts.map +1 -1
- package/dist/src/modules/workspace/reconcile.js +15 -8
- package/dist/src/modules/workspace/reconcile.js.map +1 -1
- package/dist/src/modules/workspace/text.d.ts +32 -0
- package/dist/src/modules/workspace/text.d.ts.map +1 -0
- package/dist/src/modules/workspace/text.js +67 -0
- package/dist/src/modules/workspace/text.js.map +1 -0
- package/dist/src/modules/workspace/types.d.ts +210 -6
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/modules/workspace/watcher.d.ts +3 -2
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js.map +1 -1
- package/dist/src/operator-log.d.ts +52 -24
- package/dist/src/operator-log.d.ts.map +1 -1
- package/dist/src/operator-log.js.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.d.ts +496 -72
- package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.js +1196 -289
- package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
- package/dist/src/recovery/offline-branch.d.ts +26 -1
- package/dist/src/recovery/offline-branch.d.ts.map +1 -1
- package/dist/src/recovery/offline-branch.js +164 -39
- package/dist/src/recovery/offline-branch.js.map +1 -1
- package/dist/src/recovery/recover-cli.js +23 -4
- package/dist/src/recovery/recover-cli.js.map +1 -1
- package/dist/src/send-tools.d.ts +11 -0
- package/dist/src/send-tools.d.ts.map +1 -0
- package/dist/src/send-tools.js +11 -0
- package/dist/src/send-tools.js.map +1 -0
- package/dist/src/timezone.d.ts +4 -2
- package/dist/src/timezone.d.ts.map +1 -1
- package/dist/src/timezone.js +4 -2
- package/dist/src/timezone.js.map +1 -1
- package/dist/src/tool-image-ledger.d.ts +46 -7
- package/dist/src/tool-image-ledger.d.ts.map +1 -1
- package/dist/src/tool-image-ledger.js +60 -7
- package/dist/src/tool-image-ledger.js.map +1 -1
- package/dist/src/tool-result-guard.d.ts +14 -11
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +17 -14
- package/dist/src/tool-result-guard.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +3 -2
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +3 -2
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/tune-out/coordinator.d.ts +21 -0
- package/dist/src/tune-out/coordinator.d.ts.map +1 -1
- package/dist/src/tune-out/coordinator.js +142 -40
- package/dist/src/tune-out/coordinator.js.map +1 -1
- package/dist/src/types/agent.d.ts +31 -6
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +66 -9
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +69 -62
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +40 -8
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +111 -10
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/src/usage/types.d.ts +16 -0
- package/dist/src/usage/types.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.d.ts +14 -1
- package/dist/src/usage/usage-tracker.d.ts.map +1 -1
- package/dist/src/usage/usage-tracker.js +81 -41
- package/dist/src/usage/usage-tracker.js.map +1 -1
- package/package.json +6 -8
- package/src/agent.ts +99 -12
- package/src/api/server.ts +14 -12
- package/src/clock-rows.ts +302 -0
- package/src/code-execution/engine.ts +595 -0
- package/src/code-execution/index.ts +5 -17
- package/src/code-execution/isolate/calls.ts +199 -0
- package/src/code-execution/isolate/child-entry.ts +5 -0
- package/src/code-execution/isolate/child-main.ts +132 -0
- package/src/code-execution/isolate/child.ts +327 -0
- package/src/code-execution/isolate/frames.ts +209 -0
- package/src/code-execution/isolate/output.ts +161 -0
- package/src/code-execution/isolate/prelude.ts +409 -0
- package/src/code-execution/isolate/protocol.ts +240 -0
- package/src/code-execution/isolate/render.ts +230 -0
- package/src/code-execution/isolate/runner.ts +911 -0
- package/src/code-execution/isolate/scripts.ts +479 -0
- package/src/code-execution/quickjs.wasm +0 -0
- package/src/code-execution/quickjs.wasm.LICENSES +149 -0
- package/src/code-execution/tool-definition.ts +236 -167
- package/src/deadline-timer.ts +1 -1
- package/src/framework.ts +4978 -2671
- package/src/gate/event-gate.ts +79 -17
- package/src/held-writes.ts +17 -3
- package/src/index.ts +32 -22
- package/src/mcpl/channel-registry.ts +1892 -471
- package/src/mcpl/conversation-router.ts +26 -72
- package/src/mcpl/convert-block.ts +9 -5
- package/src/mcpl/inbound-source.ts +131 -0
- package/src/mcpl/index.ts +4 -2
- package/src/mcpl/log-value.ts +9 -0
- package/src/mcpl/modern-connection.ts +162 -53
- package/src/mcpl/prose-grammar.ts +4 -5
- package/src/mcpl/protocol-family.ts +200 -22
- package/src/mcpl/push-coalescer.ts +306 -62
- package/src/mcpl/push-handler.ts +12 -54
- package/src/mcpl/reference-fetcher.ts +4 -4
- package/src/mcpl/server-connection.ts +180 -79
- package/src/mcpl/tags.ts +36 -0
- package/src/mcpl/tool-result-normalize.ts +2 -1
- package/src/mcpl/transport.ts +162 -33
- package/src/mcpl/types.ts +23 -6
- package/src/module-registry.ts +92 -13
- package/src/modules/discord/index.ts +8 -13
- package/src/modules/history/index.ts +25 -3
- package/src/modules/history/semantic.ts +29 -6
- package/src/modules/index.ts +1 -0
- package/src/modules/unknown-tool.ts +4 -1
- package/src/modules/workspace/branch-intent.ts +3 -1
- package/src/modules/workspace/edit-plan.ts +954 -0
- package/src/modules/workspace/edit-text.ts +618 -0
- package/src/modules/workspace/effects.ts +70 -19
- package/src/modules/workspace/index.ts +2293 -650
- package/src/modules/workspace/observe.ts +465 -56
- package/src/modules/workspace/reconcile.ts +14 -7
- package/src/modules/workspace/text.ts +68 -0
- package/src/modules/workspace/types.ts +211 -6
- package/src/modules/workspace/watcher.ts +3 -2
- package/src/operator-log.ts +47 -19
- package/src/recovery/discord-awareness-outbox.ts +1500 -356
- package/src/recovery/offline-branch.ts +189 -55
- package/src/recovery/recover-cli.ts +25 -4
- package/src/send-tools.ts +11 -0
- package/src/timezone.ts +4 -2
- package/src/tool-image-ledger.ts +62 -8
- package/src/tool-result-guard.ts +18 -15
- package/src/tool-result-history.ts +3 -2
- package/src/tune-out/coordinator.ts +166 -45
- package/src/types/agent.ts +32 -6
- package/src/types/events.ts +66 -9
- package/src/types/framework.ts +69 -62
- package/src/types/module.ts +40 -8
- package/src/types/trace.ts +121 -15
- package/src/usage/types.ts +16 -0
- package/src/usage/usage-tracker.ts +86 -43
- package/dist/src/code-execution/py-runner.d.ts +0 -191
- package/dist/src/code-execution/py-runner.d.ts.map +0 -1
- package/dist/src/code-execution/py-runner.js +0 -655
- package/dist/src/code-execution/py-runner.js.map +0 -1
- package/dist/src/code-execution/runtime-py.d.ts +0 -50
- package/dist/src/code-execution/runtime-py.d.ts.map +0 -1
- package/dist/src/code-execution/runtime-py.js +0 -677
- package/dist/src/code-execution/runtime-py.js.map +0 -1
- package/dist/src/mcpl/prose-stream-router.d.ts +0 -88
- package/dist/src/mcpl/prose-stream-router.d.ts.map +0 -1
- package/dist/src/mcpl/prose-stream-router.js +0 -291
- package/dist/src/mcpl/prose-stream-router.js.map +0 -1
- package/src/code-execution/py-runner.ts +0 -791
- package/src/code-execution/runtime-py.ts +0 -677
- package/src/mcpl/prose-stream-router.ts +0 -268
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What edit and edit_many say: a refusal that names edit's problem, or each of
|
|
3
|
+
* edit_many's problems in edit order, and a receipt that shows each edit's
|
|
4
|
+
* first changed region. What can grow with a call, problems, notes, files and
|
|
5
|
+
* regions, is held to the length the call's result may have
|
|
6
|
+
* (ToolCall.resultMaxChars). Past it, a problem keeps its first line, a region
|
|
7
|
+
* is named by its lines, and the answer's last line counts what it left out;
|
|
8
|
+
* edit's receipt keeps its path and notes whatever their length.
|
|
9
|
+
*
|
|
10
|
+
* Ported from anima-research/hands-mcp's src/edit.ts, where it words the Edit
|
|
11
|
+
* and EditMany tools' answers.
|
|
12
|
+
*/
|
|
13
|
+
import { SHOWN_MATCHES } from './edit-plan.js';
|
|
14
|
+
import { MAX_LINE_CHARS, jsonLength, numberedLine, safeCut } from './text.js';
|
|
15
|
+
/** How many runs of edits a list names before it counts the rest. */
|
|
16
|
+
const LISTED_RUNS = 10;
|
|
17
|
+
/**
|
|
18
|
+
* "edit 3", or "edits 1–4, 7 and 9", numbered from 1: three or more edits in a
|
|
19
|
+
* row as a range, and past LISTED_RUNS of those and single edits, how many
|
|
20
|
+
* more, so a label stays short whatever the call's size.
|
|
21
|
+
*/
|
|
22
|
+
export function editList(edits) {
|
|
23
|
+
const sorted = [...new Set(edits)].sort((a, b) => a - b).map((edit) => edit + 1);
|
|
24
|
+
if (sorted.length === 1)
|
|
25
|
+
return `edit ${sorted[0]}`;
|
|
26
|
+
const items = [];
|
|
27
|
+
let listed = 0;
|
|
28
|
+
for (let i = 0; i < sorted.length && items.length < LISTED_RUNS;) {
|
|
29
|
+
let j = i;
|
|
30
|
+
while (j + 1 < sorted.length && sorted[j + 1] === sorted[j] + 1)
|
|
31
|
+
j++;
|
|
32
|
+
const run = j - i >= 2;
|
|
33
|
+
items.push(run ? `${sorted[i]}–${sorted[j]}` : `${sorted[i]}`);
|
|
34
|
+
listed += run ? j - i + 1 : 1;
|
|
35
|
+
i = run ? j + 1 : i + 1;
|
|
36
|
+
}
|
|
37
|
+
const more = sorted.length - listed;
|
|
38
|
+
if (more > 0)
|
|
39
|
+
return `edits ${items.join(', ')} and ${more} more`;
|
|
40
|
+
return items.length === 1 ? `edits ${items[0]}` : `edits ${items.slice(0, -1).join(', ')} and ${items.at(-1)}`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* "line 5", "lines 5 and 9", "lines 5, 9 and 12", or "lines 5, 9 and 3
|
|
44
|
+
* more": the lines shown, each once, of `total` lines in all.
|
|
45
|
+
*/
|
|
46
|
+
function lineList(shown, total) {
|
|
47
|
+
const more = total - shown.length;
|
|
48
|
+
const list = more > 0 ? `${shown.join(', ')} and ${more} more`
|
|
49
|
+
: shown.length < 2 ? `${shown[0] ?? ''}` : `${shown.slice(0, -1).join(', ')} and ${shown.at(-1)}`;
|
|
50
|
+
return `${plural(total, 'line')} ${list}`;
|
|
51
|
+
}
|
|
52
|
+
/** Each line once, the first SHOWN_MATCHES of them, and how many more, as lineList words them. */
|
|
53
|
+
function onLines(lines) {
|
|
54
|
+
const distinct = [...new Set(lines)];
|
|
55
|
+
return lineList(distinct.slice(0, SHOWN_MATCHES), distinct.length);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Where a count's occurrences are: the lines of those shown, each line once,
|
|
59
|
+
* and whether more occurrences follow them.
|
|
60
|
+
*/
|
|
61
|
+
function countLines(problem) {
|
|
62
|
+
return problem.atLeast || problem.found > problem.lines.length
|
|
63
|
+
? `the first ${problem.lines.length} on ${onLines(problem.lines)}`
|
|
64
|
+
: `on ${onLines(problem.lines)}`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The edit a problem sorts by: its first. A loop rather than Math.min's
|
|
68
|
+
* spread, since a call's edits can be more than a spread passes as arguments.
|
|
69
|
+
*/
|
|
70
|
+
function firstEdit(problem) {
|
|
71
|
+
if (!('edits' in problem))
|
|
72
|
+
return problem.edit;
|
|
73
|
+
let first = Infinity;
|
|
74
|
+
for (const edit of problem.edits)
|
|
75
|
+
if (edit < first)
|
|
76
|
+
first = edit;
|
|
77
|
+
return first;
|
|
78
|
+
}
|
|
79
|
+
const plural = (count, one, many = `${one}s`) => (count === 1 ? one : many);
|
|
80
|
+
/** How a refusal names a reading of an old text, by what it leaves out (readingsOf). */
|
|
81
|
+
const READS = {
|
|
82
|
+
nothing: 'as given',
|
|
83
|
+
cr: "with its last CR read as its CRLF line end's",
|
|
84
|
+
bom: "with its BOM read as the file's own",
|
|
85
|
+
both: "with its BOM read as the file's own and its last CR as a CRLF line end's",
|
|
86
|
+
};
|
|
87
|
+
/** A problem as an agent reads it, without the label edit_many puts before it. */
|
|
88
|
+
function problemText(problem, tool) {
|
|
89
|
+
switch (problem.kind) {
|
|
90
|
+
case 'input':
|
|
91
|
+
case 'file':
|
|
92
|
+
return problem.text;
|
|
93
|
+
case 'mounts':
|
|
94
|
+
return `the edits name files in more than one mount (${problem.mounts.join(', ')}); one call edits the files of one mount, so send the edits for each mount in a call of its own.`;
|
|
95
|
+
case 'miss':
|
|
96
|
+
return `oldString isn't in ${problem.path}.${problem.hint ? `\n${problem.hint}` : ''}\n`
|
|
97
|
+
+ `Match exactly, including whitespace and indentation${problem.crlf ? "; the file's CRLF line ends are matched as LF" : ''}.`;
|
|
98
|
+
case 'count': {
|
|
99
|
+
const { found, expected, overlapping } = problem;
|
|
100
|
+
const occurs = `oldString occurs ${problem.atLeast ? 'at least ' : ''}${found} ${plural(found, 'time')} in ${problem.path} (${countLines(problem)})`;
|
|
101
|
+
const quotes = problem.quoteNormalized ? ', with straight and curly quotes treated as equal' : '';
|
|
102
|
+
const overlap = overlapping ? ", and they overlap, so they can't each be replaced" : '';
|
|
103
|
+
if (tool === 'edit') {
|
|
104
|
+
const hint = overlapping
|
|
105
|
+
? 'Add the text around it to single out the text you mean.'
|
|
106
|
+
: 'Add the text around it to make it unique, or set replaceAll to replace every one.';
|
|
107
|
+
return `${occurs}${quotes}${overlap}. ${hint}\n${problem.shown}`;
|
|
108
|
+
}
|
|
109
|
+
// A count the scan stopped at is a floor, which differs from the one
|
|
110
|
+
// asked for only where it passes it.
|
|
111
|
+
const differs = typeof expected === 'number' && (problem.atLeast ? found > expected : found !== expected);
|
|
112
|
+
const hint = overlapping
|
|
113
|
+
? 'Include more of the text around it to single out the text you mean.'
|
|
114
|
+
: problem.spent && !differs
|
|
115
|
+
? `Whether it occurs the ${expected} ${plural(expected, 'time')} it asks for can't be told from this call.`
|
|
116
|
+
: problem.spent
|
|
117
|
+
? `Include more of the text around it to single out the ${expected === 1 ? 'one' : 'ones'} you mean.`
|
|
118
|
+
: typeof expected === 'number' && found > expected
|
|
119
|
+
? `Include more of the text around it to single out the ${expected === 1 ? 'one' : 'ones'} you mean, or set occurrences to ${found} if every one should change.`
|
|
120
|
+
: `Set occurrences to ${found} if those are all.`;
|
|
121
|
+
// Why a count is a floor goes on a line of its own, so it doesn't push
|
|
122
|
+
// the hint past the first line's cut (cutLine).
|
|
123
|
+
const floor = problem.spent && !overlapping
|
|
124
|
+
? `This call counted as many occurrences as one call may, so ${found} is a floor: sent in a call of its own, the edit has every one counted, unless they overlap.\n`
|
|
125
|
+
: '';
|
|
126
|
+
return `${occurs}${quotes}${differs ? `, not ${expected}` : ''}${overlap}. ${hint}\n${floor}${problem.shown}`;
|
|
127
|
+
}
|
|
128
|
+
case 'clash': {
|
|
129
|
+
const [a, b] = problem.edits;
|
|
130
|
+
return problem.same
|
|
131
|
+
? `edits ${a + 1} and ${b + 1} replace the same text in ${problem.path} (line ${problem.line}); give each its own stretch of text.`
|
|
132
|
+
: `edits ${a + 1} and ${b + 1} overlap in ${problem.path} (from line ${problem.line}); give each its own stretch of text, or make them one edit.`;
|
|
133
|
+
}
|
|
134
|
+
case 'crowded':
|
|
135
|
+
return `they ask for ${problem.asked.toLocaleString('en-US')} occurrences between them in ${problem.path}, whose text, with its line ends read as LF, is ${problem.length.toLocaleString('en-US')} UTF-16 code units long, `
|
|
136
|
+
+ 'so some of their matches would overlap; give each its own stretch of text.';
|
|
137
|
+
case 'same':
|
|
138
|
+
return `oldString and newString are the same once the BOM or the line end's CR that oldString carries is read as ${problem.path}'s own, which the file keeps, so there's nothing to change.`;
|
|
139
|
+
case 'readings': {
|
|
140
|
+
const carries = problem.bom && problem.cr ? 'starts with a BOM and ends in a CR' : problem.bom ? 'starts with a BOM' : 'ends in a CR';
|
|
141
|
+
const ways = problem.readings.map((reading) => `${READS[reading.leaves]} (${countLines(reading)})`);
|
|
142
|
+
const list = ways.length < 3 ? ways.join(' and ') : `${ways.slice(0, -1).join(', ')} and ${ways.at(-1)}`;
|
|
143
|
+
// A reading that changes nothing means the file's own BOM or line end's
|
|
144
|
+
// CR, which an edit can't change, so the refusal says so.
|
|
145
|
+
const same = problem.readings.filter((reading) => reading.same);
|
|
146
|
+
const kept = [same.some((reading) => reading.leaves !== 'cr') && 'BOM', same.some((reading) => reading.leaves !== 'bom') && 'line ends'].filter(Boolean).join(' and ');
|
|
147
|
+
// The lines of each reading follow on a line of their own, so however
|
|
148
|
+
// long they run, they don't push the hint past the first line's cut
|
|
149
|
+
// (cutLine).
|
|
150
|
+
return `oldString ${carries}, and occurs in ${problem.path} read more than one way, so which you mean can't be told. `
|
|
151
|
+
+ `Include more of the text around it, such as the line before or after it, to say which.\nIt occurs ${list}.`
|
|
152
|
+
+ (same.length ? `\nWhere it occurs ${same.map((reading) => READS[reading.leaves]).join(' or ')}, the edit changes nothing, since the file keeps its ${kept}.` : '');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** The label edit_many puts before a problem: its edits, or none for a clash, which names its own. */
|
|
157
|
+
function label(problem) {
|
|
158
|
+
if (problem.kind === 'clash' || problem.kind === 'mounts')
|
|
159
|
+
return '';
|
|
160
|
+
return `${'edits' in problem ? editList(problem.edits) : editList([problem.edit])}: `;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* A part's first line past this many UTF-16 code units is cut, so one long
|
|
164
|
+
* path or text can't take the room the parts after it need.
|
|
165
|
+
*/
|
|
166
|
+
const FIRST_LINE_MAX = 400;
|
|
167
|
+
/** A line cut to FIRST_LINE_MAX, as a part's first line is, and as a thrown message is in an answer's head. */
|
|
168
|
+
export function cutLine(line) {
|
|
169
|
+
return line.length > FIRST_LINE_MAX ? `${line.slice(0, safeCut(line, FIRST_LINE_MAX - 1))}…` : line;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The answer's last line: what it left out, and what to do. `cut` parts left
|
|
173
|
+
* out their details; `problems` and `notes` weren't shown at all. A refusal
|
|
174
|
+
* that leaves out problems, and shows at least one, says to answer those
|
|
175
|
+
* shown and send the call again to see the rest: once those are answered,
|
|
176
|
+
* their room can show the rest, details included. For edits stored, the
|
|
177
|
+
* problems are the files disk refused, and a last line that leaves some out
|
|
178
|
+
* points to ls.
|
|
179
|
+
*/
|
|
180
|
+
function tailText(kind, maxChars, cut, problems, notes, anyShown) {
|
|
181
|
+
const items = [
|
|
182
|
+
...(cut ? [`the details of ${cut} of these`] : []),
|
|
183
|
+
...(problems ? [kind === 'refusal' ? `${problems} more ${plural(problems, 'problem')}` : `${problems} more ${plural(problems, 'file')} disk refused`] : []),
|
|
184
|
+
...(notes ? [`${notes} ${plural(notes, 'note')} on the files' copies on disk`] : []),
|
|
185
|
+
];
|
|
186
|
+
if (!items.length)
|
|
187
|
+
return '';
|
|
188
|
+
const next = kind === 'stored'
|
|
189
|
+
? problems ? " ls shows each path's state." : ''
|
|
190
|
+
: problems && anyShown ? ' Answer the problems shown and send the call again to see the rest.' : '';
|
|
191
|
+
const list = items.length < 2 ? items[0] : `${items.slice(0, -1).join(', ')} and ${items.at(-1)}`;
|
|
192
|
+
return `[To keep this answer within ${maxChars.toLocaleString('en-US')} characters, it leaves out ${list}.${next}]`;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* An answer's head, then its parts joined with blank lines, within
|
|
196
|
+
* `maxChars`: every part's first line while they fit, each cut at
|
|
197
|
+
* FIRST_LINE_MAX, so a call's problems are each named before any is
|
|
198
|
+
* explained, then, in order, the rest of each part whose rest still fits. The
|
|
199
|
+
* parts are `problems`, for edits stored the files disk refused, then `notes`
|
|
200
|
+
* on what the call's settling with disk found. A part whose first line
|
|
201
|
+
* doesn't fit is left out with every part after it. The last line counts
|
|
202
|
+
* what was left out, and for edits stored it never says to send the call
|
|
203
|
+
* again. Never longer than `maxChars`, unless the
|
|
204
|
+
* head and the last line alone are: with 1,000 characters, the least a
|
|
205
|
+
* residence or an agent can set, a refusal names its first problem at least.
|
|
206
|
+
*/
|
|
207
|
+
export function fitted(head, problems, notes, maxChars, kind) {
|
|
208
|
+
const parts = [...problems, ...notes];
|
|
209
|
+
// The last line as long as it can be: every count at its most.
|
|
210
|
+
const reserve = tailText(kind, maxChars, parts.length, problems.length, notes.length, true).length + 2;
|
|
211
|
+
let left = maxChars - head.length - reserve;
|
|
212
|
+
const shown = [];
|
|
213
|
+
for (const part of parts) {
|
|
214
|
+
const end = part.indexOf('\n');
|
|
215
|
+
const line = end === -1 ? part : part.slice(0, end);
|
|
216
|
+
const first = cutLine(line);
|
|
217
|
+
// Each part costs the blank line before it too.
|
|
218
|
+
if (first.length + 2 > left)
|
|
219
|
+
break;
|
|
220
|
+
left -= first.length + 2;
|
|
221
|
+
shown.push(first);
|
|
222
|
+
}
|
|
223
|
+
let cut = 0;
|
|
224
|
+
for (const [i, first] of shown.entries()) {
|
|
225
|
+
const rest = parts[i].length - first.length;
|
|
226
|
+
if (rest === 0)
|
|
227
|
+
continue;
|
|
228
|
+
if (rest > left) {
|
|
229
|
+
cut++;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
left -= rest;
|
|
233
|
+
shown[i] = parts[i];
|
|
234
|
+
}
|
|
235
|
+
const unshownProblems = Math.max(0, problems.length - shown.length);
|
|
236
|
+
const tail = tailText(kind, maxChars, cut, unshownProblems, parts.length - shown.length - unshownProblems, shown.length > 0);
|
|
237
|
+
return [head, ...shown, tail].filter(Boolean).join('\n\n');
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The refusal, within `maxChars`. edit names its first problem after "The
|
|
241
|
+
* edit did nothing: ", unless it is a whole sentence already. edit_many
|
|
242
|
+
* counts its problems and names each, in edit order, labelled with its edits.
|
|
243
|
+
* `notes` follow the problems: which copy of a file the edits looked in, and
|
|
244
|
+
* a conflict with disk, which the agent needs whether or not the call stored
|
|
245
|
+
* anything.
|
|
246
|
+
*/
|
|
247
|
+
export function refusalText(tool, problems, notes, maxChars) {
|
|
248
|
+
const sorted = [...problems].sort((a, b) => firstEdit(a) - firstEdit(b));
|
|
249
|
+
if (tool === 'edit') {
|
|
250
|
+
const [problem] = sorted;
|
|
251
|
+
const text = problemText(problem, tool);
|
|
252
|
+
const whole = problem.kind === 'file' && problem.whole ? text : `The edit did nothing: ${text}`;
|
|
253
|
+
return fitted('', [whole], notes, maxChars, 'refusal');
|
|
254
|
+
}
|
|
255
|
+
const head = `The edit_many call stored none of its edits: ${sorted.length} ${plural(sorted.length, 'problem')}.`;
|
|
256
|
+
return fitted(head, sorted.map((problem) => `${label(problem)}${problemText(problem, tool)}`), notes, maxChars, 'refusal');
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* The region a receipt shows around a change: two lines before it, its new
|
|
260
|
+
* text's lines, and two after, found by scanning for line ends around it,
|
|
261
|
+
* never past the file's end.
|
|
262
|
+
*/
|
|
263
|
+
function regionOf(updated, change) {
|
|
264
|
+
const lineStart = (at) => (at === 0 ? 0 : updated.lastIndexOf('\n', at - 1) + 1);
|
|
265
|
+
let start = lineStart(change.at);
|
|
266
|
+
let from = change.line;
|
|
267
|
+
for (let k = 0; k < 2 && start > 0; k++) {
|
|
268
|
+
start = lineStart(start - 1);
|
|
269
|
+
from--;
|
|
270
|
+
}
|
|
271
|
+
let end = lineStart(change.at);
|
|
272
|
+
let to = change.line - 1;
|
|
273
|
+
for (let k = 0; k < change.lines + 2 && end < updated.length; k++) {
|
|
274
|
+
const newline = updated.indexOf('\n', end);
|
|
275
|
+
end = newline === -1 ? updated.length : newline + 1;
|
|
276
|
+
to++;
|
|
277
|
+
}
|
|
278
|
+
return { from, to, start, end };
|
|
279
|
+
}
|
|
280
|
+
/** How much of a long line an excerpt shows before the change it's for. */
|
|
281
|
+
const CHANGE_LEAD = 80;
|
|
282
|
+
/**
|
|
283
|
+
* A line too long to show whole, numbered, as a stretch for each change the
|
|
284
|
+
* receipt shows that starts on it (an edit's first change), at the ascending
|
|
285
|
+
* `columns`: from at most CHANGE_LEAD
|
|
286
|
+
* characters before the change, for as much as read shows of a line.
|
|
287
|
+
* Stretches that meet run together, and each stretch of the line left out is
|
|
288
|
+
* marked with how many characters it holds.
|
|
289
|
+
*/
|
|
290
|
+
function excerptLine(line, n, columns) {
|
|
291
|
+
const stretches = [];
|
|
292
|
+
for (const column of columns) {
|
|
293
|
+
// safeCut takes a cut at or before 0 as 0.
|
|
294
|
+
const from = safeCut(line, column - CHANGE_LEAD);
|
|
295
|
+
const to = safeCut(line, from + MAX_LINE_CHARS);
|
|
296
|
+
const last = stretches.at(-1);
|
|
297
|
+
if (last && from <= last.to)
|
|
298
|
+
last.to = Math.max(last.to, to);
|
|
299
|
+
else
|
|
300
|
+
stretches.push({ from, to });
|
|
301
|
+
}
|
|
302
|
+
let text = '';
|
|
303
|
+
let shownTo = 0;
|
|
304
|
+
for (const { from, to } of stretches) {
|
|
305
|
+
if (from > shownTo)
|
|
306
|
+
text += shownTo === 0 ? `[… ${from} chars before] ` : ` [… ${from - shownTo} chars] `;
|
|
307
|
+
text += line.slice(from, to);
|
|
308
|
+
shownTo = to;
|
|
309
|
+
}
|
|
310
|
+
if (shownTo < line.length)
|
|
311
|
+
text += ` [… ${line.length - shownTo} more chars]`;
|
|
312
|
+
return `${String(n).padStart(6)}\t${text}`;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Each edit's first change in a file, as numbered regions merged where they
|
|
316
|
+
* meet, while the budget lasts, counted as the answer's JSON holds them; past
|
|
317
|
+
* it, the regions are named by their lines.
|
|
318
|
+
*/
|
|
319
|
+
export function shownRegions(plan, budget, maxChars) {
|
|
320
|
+
const firsts = plan.edits.map((edit) => edit.first).sort((a, b) => a.at - b.at);
|
|
321
|
+
const regions = [];
|
|
322
|
+
for (const change of firsts) {
|
|
323
|
+
// An emptied file's region holds no line, and shows as nothing.
|
|
324
|
+
const region = regionOf(plan.updated, change);
|
|
325
|
+
const last = regions.at(-1);
|
|
326
|
+
if (last && region.from <= last.to + 1) {
|
|
327
|
+
last.to = Math.max(last.to, region.to);
|
|
328
|
+
last.end = Math.max(last.end, region.end);
|
|
329
|
+
}
|
|
330
|
+
else
|
|
331
|
+
regions.push(region);
|
|
332
|
+
}
|
|
333
|
+
// A line shows as the stored bytes hold it, its CRLF end's CR left out
|
|
334
|
+
// unless the line's own text ends in a CR, as a line of the old text shows
|
|
335
|
+
// (shownLine). A CR before a line feed in the updated text is the line's
|
|
336
|
+
// own, unless the edit put it before a bare LF: on disk the two are then a
|
|
337
|
+
// CRLF end, and the line's own text doesn't end in it. The new bytes tell
|
|
338
|
+
// these apart by the CRs before the line feed, read only for a line whose
|
|
339
|
+
// text ends in a CR, at a place that moves forward with the regions' lines.
|
|
340
|
+
// A file's line n is line n of its bytes, since both hold the same line
|
|
341
|
+
// feeds, and a BOM's bytes are neither a line feed nor a CR.
|
|
342
|
+
let byteAt = 0;
|
|
343
|
+
let byteLine = 1;
|
|
344
|
+
const asStored = (text, n, beforeLf) => {
|
|
345
|
+
if (!beforeLf || !text.endsWith('\r'))
|
|
346
|
+
return text;
|
|
347
|
+
for (; byteLine < n; byteLine++)
|
|
348
|
+
byteAt = plan.bytes.indexOf(10, byteAt) + 1;
|
|
349
|
+
const lf = plan.bytes.indexOf(10, byteAt);
|
|
350
|
+
let own = 0;
|
|
351
|
+
while (own < text.length && text.charCodeAt(text.length - 1 - own) === 13)
|
|
352
|
+
own++;
|
|
353
|
+
let stored = 0;
|
|
354
|
+
while (stored <= own && lf - 1 - stored >= byteAt && plan.bytes[lf - 1 - stored] === 13)
|
|
355
|
+
stored++;
|
|
356
|
+
// A CRLF end after the line's own CRs; or a bare LF, whose last CR read
|
|
357
|
+
// takes as the end's unless another comes before it.
|
|
358
|
+
if (stored > own)
|
|
359
|
+
return `${text}\r`;
|
|
360
|
+
return own > 1 ? text : text.slice(0, -1);
|
|
361
|
+
};
|
|
362
|
+
const out = [];
|
|
363
|
+
const omitted = [];
|
|
364
|
+
for (const region of regions) {
|
|
365
|
+
// The region's lines, numbered, built one at a time while they fit, so a
|
|
366
|
+
// region of millions of lines, which is named by its lines, isn't built
|
|
367
|
+
// whole first. The line before it ("…" between regions, or the line end)
|
|
368
|
+
// counts too, and each line feed between its lines.
|
|
369
|
+
let cost = out.length ? jsonLength('\n…\n') : jsonLength('\n');
|
|
370
|
+
const lines = [];
|
|
371
|
+
let fits = !omitted.length;
|
|
372
|
+
for (let lineStart = region.start, n = region.from; fits && lineStart < region.end; n++) {
|
|
373
|
+
const newline = plan.updated.indexOf('\n', lineStart);
|
|
374
|
+
const lineEnd = newline === -1 || newline >= region.end ? region.end : newline;
|
|
375
|
+
const text = asStored(plan.updated.slice(lineStart, lineEnd), n, lineEnd === newline);
|
|
376
|
+
// A line too long to show whole shows its start, or, where edits' first
|
|
377
|
+
// changes start on it, a stretch from shortly before each.
|
|
378
|
+
const columns = text.length > MAX_LINE_CHARS ? firsts.filter((first) => first.line === n).map((first) => first.at - lineStart) : [];
|
|
379
|
+
const numberedText = columns.length ? excerptLine(text, n, columns) : numberedLine(text, n);
|
|
380
|
+
cost += jsonLength(numberedText) + (lines.length ? jsonLength('\n') : 0);
|
|
381
|
+
if (cost > budget.left)
|
|
382
|
+
fits = false;
|
|
383
|
+
else
|
|
384
|
+
lines.push(numberedText);
|
|
385
|
+
lineStart = lineEnd + 1;
|
|
386
|
+
}
|
|
387
|
+
if (fits) {
|
|
388
|
+
budget.left -= cost;
|
|
389
|
+
if (out.length)
|
|
390
|
+
out.push('…');
|
|
391
|
+
out.push(lines.join('\n'));
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
budget.left = 0;
|
|
395
|
+
omitted.push(region.from === region.to ? `${region.from}` : `${region.from}–${region.to}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (omitted.length) {
|
|
399
|
+
const listed = omitted.slice(0, SHOWN_MATCHES);
|
|
400
|
+
out.push(regionsLeftOut(maxChars, listed, omitted.length - listed.length, omitted.length === 1 && !omitted[0].includes('–')));
|
|
401
|
+
}
|
|
402
|
+
return out;
|
|
403
|
+
}
|
|
404
|
+
/** The note naming the regions of a file a receipt leaves out: the lines of SHOWN_MATCHES at most, and how many more. */
|
|
405
|
+
function regionsLeftOut(maxChars, listed, more, oneLine) {
|
|
406
|
+
return `[not shown, to keep this answer within ${maxChars.toLocaleString('en-US')} characters: ${plural(oneLine ? 1 : 2, 'line')} ${listed.join(', ')}${more ? `, and ${more} more` : ''}]`;
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* edit_many's last line, counting what its receipt leaves out: files it
|
|
410
|
+
* doesn't list, and of those it lists, the regions, notes and edit numbers it
|
|
411
|
+
* doesn't show. Null when it leaves out nothing.
|
|
412
|
+
*/
|
|
413
|
+
function filesLeftOut(maxChars, total, counts) {
|
|
414
|
+
const left = [
|
|
415
|
+
...(counts.notListed ? [`${counts.notListed} of the call's ${total} ${plural(total, 'file')}`] : []),
|
|
416
|
+
...(counts.unshown ? [`the changed regions of ${counts.unshown} more ${plural(counts.unshown, 'file')}`] : []),
|
|
417
|
+
...(counts.notes ? [`the notes of ${counts.notes} ${plural(counts.notes, 'file')}`] : []),
|
|
418
|
+
...(counts.edits ? [`the edit numbers of ${counts.edits} ${plural(counts.edits, 'file')}`] : []),
|
|
419
|
+
];
|
|
420
|
+
if (!left.length)
|
|
421
|
+
return null;
|
|
422
|
+
const list = left.length < 2 ? left[0] : `${left.slice(0, -1).join(', ')} and ${left.at(-1)}`;
|
|
423
|
+
return `[To keep this answer within ${maxChars.toLocaleString('en-US')} characters, it leaves out ${list}.]`;
|
|
424
|
+
}
|
|
425
|
+
/** A receipt's note on a file's line ends, if they need one. */
|
|
426
|
+
export function lineEndNote(plan) {
|
|
427
|
+
if (plan.mixed)
|
|
428
|
+
return "The file's mixed line ends are kept: the new text's line ends take those of the text it replaces, by position.";
|
|
429
|
+
return plan.crlf ? "The file's CRLF line ends are kept." : null;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* The lines of each edit's replacements after its first, for a receipt: the
|
|
433
|
+
* first SHOWN_MATCHES edits that made more than one, and how many more did.
|
|
434
|
+
*/
|
|
435
|
+
export function otherReplacements(plan, labelled) {
|
|
436
|
+
const notes = [];
|
|
437
|
+
let more = 0;
|
|
438
|
+
for (const edit of [...plan.edits].sort((a, b) => a.first.edit - b.first.edit)) {
|
|
439
|
+
if (edit.count < 2)
|
|
440
|
+
continue;
|
|
441
|
+
if (notes.length === SHOWN_MATCHES) {
|
|
442
|
+
more++;
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
const lines = lineList(edit.otherLines, edit.otherLineCount);
|
|
446
|
+
notes.push(labelled ? `Edit ${edit.first.edit + 1}'s other replacements are on ${lines}.` : `The other replacements are on ${lines}.`);
|
|
447
|
+
}
|
|
448
|
+
if (more)
|
|
449
|
+
notes.push(`${more} more ${plural(more, 'edit')} made other replacements too.`);
|
|
450
|
+
return notes;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* What a receipt keeps aside for what it adds after its budget is spent, at
|
|
454
|
+
* its longest for this call, as fitted keeps a refusal's last line: the note
|
|
455
|
+
* naming the regions of the one file whose regions pass the budget, which
|
|
456
|
+
* lists SHOWN_MATCHES of them at most, each as wide as that file's last
|
|
457
|
+
* region line could be, and counts the rest. A file has a region for each
|
|
458
|
+
* edit at most, and a region ends at most two lines past its change's new
|
|
459
|
+
* text (regionOf). Then edit_many's last line, every count at its most. Each
|
|
460
|
+
* with the line feed or blank line before it.
|
|
461
|
+
*/
|
|
462
|
+
function receiptReserve(tool, files, maxChars) {
|
|
463
|
+
let regions = 0;
|
|
464
|
+
for (const { plan } of files) {
|
|
465
|
+
if (!plan.edits.length)
|
|
466
|
+
continue;
|
|
467
|
+
let last = 1;
|
|
468
|
+
for (const { first } of plan.edits)
|
|
469
|
+
last = Math.max(last, first.line + first.lines + 1);
|
|
470
|
+
const listed = Math.min(SHOWN_MATCHES, plan.edits.length);
|
|
471
|
+
const range = `${last}–${last}`;
|
|
472
|
+
const note = regionsLeftOut(maxChars, Array.from({ length: listed }, () => range), plan.edits.length - listed, false);
|
|
473
|
+
regions = Math.max(regions, jsonLength('\n') + jsonLength(note));
|
|
474
|
+
}
|
|
475
|
+
if (tool === 'edit')
|
|
476
|
+
return regions;
|
|
477
|
+
const most = files.length;
|
|
478
|
+
return regions + jsonLength('\n\n') + jsonLength(filesLeftOut(maxChars, most, { notListed: most, unshown: most, notes: most, edits: most }));
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* The receipt of edits stored: each file's size, replacements and notes, and
|
|
482
|
+
* each edit's first changed region, numbered as read numbers lines, held to
|
|
483
|
+
* `maxChars` as the answer's JSON holds it. Its counts and notes come first;
|
|
484
|
+
* the regions take what is left, and past it a file's regions are named by
|
|
485
|
+
* their lines. edit_many lists its files while they fit, a file whose notes
|
|
486
|
+
* don't fit without them, or without its edits' numbers too, and counts the
|
|
487
|
+
* rest. edit's receipt, of one file, keeps its counts and notes and shows no
|
|
488
|
+
* region where those alone pass `maxChars`.
|
|
489
|
+
*/
|
|
490
|
+
export function editReceipt(tool, files, editCount, maxChars) {
|
|
491
|
+
const reserve = receiptReserve(tool, files, maxChars);
|
|
492
|
+
const notesOf = ({ plan, notes }) => {
|
|
493
|
+
const lineEnds = lineEndNote(plan);
|
|
494
|
+
return [
|
|
495
|
+
...notes,
|
|
496
|
+
...(plan.quoteNormalized.length
|
|
497
|
+
? [`${tool === 'edit' ? 'The text' : capitalized(editList(plan.quoteNormalized))} matched with straight and curly quotes treated as equal.`]
|
|
498
|
+
: []),
|
|
499
|
+
...(plan.readForm.length
|
|
500
|
+
? [`${tool === 'edit' ? 'The text' : capitalized(editList(plan.readForm))} matched without the BOM or the line end's CR `
|
|
501
|
+
+ `${tool === 'edit' ? 'it' : plan.readForm.length === 1 ? 'its old text' : 'their old text'} carried, which the file keeps.`]
|
|
502
|
+
: []),
|
|
503
|
+
...(lineEnds !== null ? [lineEnds] : []),
|
|
504
|
+
...otherReplacements(plan, tool === 'edit_many'),
|
|
505
|
+
];
|
|
506
|
+
};
|
|
507
|
+
if (tool === 'edit') {
|
|
508
|
+
const file = files[0];
|
|
509
|
+
const notes = notesOf(file);
|
|
510
|
+
const data = {
|
|
511
|
+
path: file.path,
|
|
512
|
+
size: file.plan.bytes.length,
|
|
513
|
+
replacements: file.plan.replacements,
|
|
514
|
+
...(notes.length ? { note: notes.join(' ') } : {}),
|
|
515
|
+
...(file.modeKept ? { modeKept: file.modeKept } : {}),
|
|
516
|
+
changed: '',
|
|
517
|
+
};
|
|
518
|
+
const budget = { left: maxChars - JSON.stringify(data).length - reserve };
|
|
519
|
+
data.changed = shownRegions(file.plan, budget, maxChars).join('\n');
|
|
520
|
+
return data;
|
|
521
|
+
}
|
|
522
|
+
const listed = [];
|
|
523
|
+
const data = {
|
|
524
|
+
edits: editCount,
|
|
525
|
+
replacements: files.reduce((sum, file) => sum + file.plan.replacements, 0),
|
|
526
|
+
files: listed,
|
|
527
|
+
changed: '',
|
|
528
|
+
};
|
|
529
|
+
const fits = (entry) => {
|
|
530
|
+
listed.push(entry);
|
|
531
|
+
const fit = JSON.stringify(data).length <= maxChars - reserve;
|
|
532
|
+
listed.pop();
|
|
533
|
+
return fit;
|
|
534
|
+
};
|
|
535
|
+
let notesLeftOut = 0;
|
|
536
|
+
let editsLeftOut = 0;
|
|
537
|
+
let notListed = 0;
|
|
538
|
+
for (const [i, file] of files.entries()) {
|
|
539
|
+
const notes = notesOf(file);
|
|
540
|
+
const bare = {
|
|
541
|
+
path: file.path,
|
|
542
|
+
size: file.plan.bytes.length,
|
|
543
|
+
replacements: file.plan.replacements,
|
|
544
|
+
...(file.modeKept ? { modeKept: file.modeKept } : {}),
|
|
545
|
+
};
|
|
546
|
+
const edits = file.plan.edits.map((edit) => edit.first.edit + 1).sort((a, b) => a - b);
|
|
547
|
+
// The fullest entry that fits: with its notes, then without them, then
|
|
548
|
+
// without its edits' numbers too, so a file is named before it's counted.
|
|
549
|
+
const entry = [
|
|
550
|
+
...(notes.length ? [{ ...bare, edits, note: notes.join(' ') }] : []),
|
|
551
|
+
{ ...bare, edits },
|
|
552
|
+
bare,
|
|
553
|
+
].find(fits);
|
|
554
|
+
if (!entry) {
|
|
555
|
+
notListed = files.length - i;
|
|
556
|
+
data.filesNotListed = notListed;
|
|
557
|
+
break;
|
|
558
|
+
}
|
|
559
|
+
listed.push(entry);
|
|
560
|
+
if (notes.length && !('note' in entry))
|
|
561
|
+
notesLeftOut++;
|
|
562
|
+
if (!('edits' in entry))
|
|
563
|
+
editsLeftOut++;
|
|
564
|
+
}
|
|
565
|
+
const budget = { left: maxChars - JSON.stringify(data).length - reserve };
|
|
566
|
+
const sections = [];
|
|
567
|
+
let unshown = 0;
|
|
568
|
+
for (const file of files.slice(0, listed.length)) {
|
|
569
|
+
const heading = jsonLength(`${file.path}\n`) + (sections.length ? jsonLength('\n\n') : 0);
|
|
570
|
+
if (heading >= budget.left) {
|
|
571
|
+
unshown++;
|
|
572
|
+
continue;
|
|
573
|
+
}
|
|
574
|
+
budget.left -= heading;
|
|
575
|
+
sections.push(`${file.path}\n${shownRegions(file.plan, budget, maxChars).join('\n')}`);
|
|
576
|
+
}
|
|
577
|
+
const last = filesLeftOut(maxChars, files.length, { notListed, unshown, notes: notesLeftOut, edits: editsLeftOut });
|
|
578
|
+
if (last !== null)
|
|
579
|
+
sections.push(last);
|
|
580
|
+
data.changed = sections.join('\n\n');
|
|
581
|
+
return data;
|
|
582
|
+
}
|
|
583
|
+
const capitalized = (value) => value.charAt(0).toUpperCase() + value.slice(1);
|
|
584
|
+
//# sourceMappingURL=edit-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-text.js","sourceRoot":"","sources":["../../../../src/modules/workspace/edit-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,10 +31,11 @@
|
|
|
31
31
|
* unlinked. Content writes stay bound to the descriptor verified before
|
|
32
32
|
* modification: inside the mount, with no other hard links (a link another
|
|
33
33
|
* process makes to it after that check shares the write). The hash, which
|
|
34
|
-
* reads the whole file, comes
|
|
35
|
-
*
|
|
36
|
-
* path beneath the root's. A last
|
|
37
|
-
*
|
|
34
|
+
* reads the whole file, comes after a check of where the file is, which is
|
|
35
|
+
* made again with the others after it, and the root is checked again beside
|
|
36
|
+
* the parent, since the parent is found by path beneath the root's. A last
|
|
37
|
+
* look at the file (its descriptor's stat before a write, its entry's lstat
|
|
38
|
+
* before an unlink) refuses one written
|
|
38
39
|
* since it was first seen, so only an edit made in the moment between that
|
|
39
40
|
* look and the effect is overwritten or removed.
|
|
40
41
|
*/
|