@caupulican/pi-adaptative 0.85.0 → 0.85.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/arithmetic.py +364 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/context.py +2 -1
- package/dist/bundled-resources/runtimes/pi-shell-engine/errors.py +16 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +137 -14
- package/dist/bundled-resources/runtimes/pi-shell-engine/nodes.py +23 -2
- package/dist/bundled-resources/runtimes/pi-shell-engine/parser.py +134 -6
- package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +25 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +6 -5
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +84 -87
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js +3 -0
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +2 -0
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +4 -3
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +4 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +2 -0
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +12 -7
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +55 -19
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/bedrock-scope.d.ts +26 -0
- package/dist/core/bedrock-scope.d.ts.map +1 -0
- package/dist/core/bedrock-scope.js +178 -0
- package/dist/core/bedrock-scope.js.map +1 -0
- package/dist/core/compaction-controller.d.ts +2 -0
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +35 -13
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +6 -0
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +3 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/failure-corpus.d.ts +26 -1
- package/dist/core/failure-corpus.d.ts.map +1 -1
- package/dist/core/failure-corpus.js +17 -0
- package/dist/core/failure-corpus.js.map +1 -1
- package/dist/core/foreground-recovery-controller.d.ts +25 -2
- package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
- package/dist/core/foreground-recovery-controller.js +111 -2
- package/dist/core/foreground-recovery-controller.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +27 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -0
- package/dist/core/foreground-terminal-handoff-controller.js +56 -0
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -0
- package/dist/core/goal-loop-controller.d.ts.map +1 -1
- package/dist/core/goal-loop-controller.js +5 -0
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.d.ts +3 -0
- package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js +28 -7
- package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
- package/dist/core/human-input-controller.d.ts +9 -0
- package/dist/core/human-input-controller.d.ts.map +1 -1
- package/dist/core/human-input-controller.js +60 -5
- package/dist/core/human-input-controller.js.map +1 -1
- package/dist/core/human-input.d.ts +12 -0
- package/dist/core/human-input.d.ts.map +1 -1
- package/dist/core/human-input.js +59 -12
- package/dist/core/human-input.js.map +1 -1
- package/dist/core/local-runtime-controller.d.ts.map +1 -1
- package/dist/core/local-runtime-controller.js +15 -9
- package/dist/core/local-runtime-controller.js.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts +1 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +252 -125
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/model-capability.d.ts +15 -1
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +24 -1
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +18 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +6 -6
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +5 -5
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/model-tool-protocol.d.ts +3 -2
- package/dist/core/model-tool-protocol.d.ts.map +1 -1
- package/dist/core/model-tool-protocol.js +5 -1
- package/dist/core/model-tool-protocol.js.map +1 -1
- package/dist/core/models/context-sizing.d.ts +1 -0
- package/dist/core/models/context-sizing.d.ts.map +1 -1
- package/dist/core/models/context-sizing.js +4 -1
- package/dist/core/models/context-sizing.js.map +1 -1
- package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
- package/dist/core/models/default-model-suggestions.js +20 -10
- package/dist/core/models/default-model-suggestions.js.map +1 -1
- package/dist/core/models/llamacpp-runtime.d.ts +32 -11
- package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
- package/dist/core/models/llamacpp-runtime.js +79 -28
- package/dist/core/models/llamacpp-runtime.js.map +1 -1
- package/dist/core/models/local-execution-planner.d.ts +24 -0
- package/dist/core/models/local-execution-planner.d.ts.map +1 -0
- package/dist/core/models/local-execution-planner.js +119 -0
- package/dist/core/models/local-execution-planner.js.map +1 -0
- package/dist/core/models/local-inference-profile.d.ts +34 -0
- package/dist/core/models/local-inference-profile.d.ts.map +1 -0
- package/dist/core/models/local-inference-profile.js +74 -0
- package/dist/core/models/local-inference-profile.js.map +1 -0
- package/dist/core/models/local-runtime.d.ts +23 -4
- package/dist/core/models/local-runtime.d.ts.map +1 -1
- package/dist/core/models/local-runtime.js +11 -8
- package/dist/core/models/local-runtime.js.map +1 -1
- package/dist/core/models/managed-ollama-model.d.ts +26 -0
- package/dist/core/models/managed-ollama-model.d.ts.map +1 -0
- package/dist/core/models/managed-ollama-model.js +59 -0
- package/dist/core/models/managed-ollama-model.js.map +1 -0
- package/dist/core/models/model-ref.js +11 -11
- package/dist/core/models/model-ref.js.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.d.ts +10 -20
- package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.js +11 -31
- package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -1
- package/dist/core/models/prism-llamacpp-server-probe.d.ts +10 -0
- package/dist/core/models/prism-llamacpp-server-probe.d.ts.map +1 -0
- package/dist/core/models/prism-llamacpp-server-probe.js +36 -0
- package/dist/core/models/prism-llamacpp-server-probe.js.map +1 -0
- package/dist/core/models/runtime-arbiter.d.ts +3 -0
- package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
- package/dist/core/models/runtime-arbiter.js +2 -1
- package/dist/core/models/runtime-arbiter.js.map +1 -1
- package/dist/core/models/runtime-process.d.ts +7 -1
- package/dist/core/models/runtime-process.d.ts.map +1 -1
- package/dist/core/models/runtime-process.js +4 -2
- package/dist/core/models/runtime-process.js.map +1 -1
- package/dist/core/process-matrix/runtime.js +43 -11
- package/dist/core/process-matrix/runtime.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +14 -5
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +18 -6
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +5 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +37 -4
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/scout-controller.d.ts +3 -2
- package/dist/core/scout-controller.d.ts.map +1 -1
- package/dist/core/scout-controller.js +1 -0
- package/dist/core/scout-controller.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +10 -8
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +59 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt-builder.d.ts +5 -2
- package/dist/core/system-prompt-builder.d.ts.map +1 -1
- package/dist/core/system-prompt-builder.js +22 -10
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.d.ts +3 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +181 -55
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-protocol-controller.d.ts.map +1 -1
- package/dist/core/tool-protocol-controller.js +5 -3
- package/dist/core/tool-protocol-controller.js.map +1 -1
- package/dist/core/tool-recovery-log-records.d.ts +33 -1
- package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
- package/dist/core/tool-recovery-log-records.js +59 -12
- package/dist/core/tool-recovery-log-records.js.map +1 -1
- package/dist/core/tool-recovery-logger.d.ts +12 -1
- package/dist/core/tool-recovery-logger.d.ts.map +1 -1
- package/dist/core/tool-recovery-logger.js +24 -1
- package/dist/core/tool-recovery-logger.js.map +1 -1
- package/dist/core/tool-repair-health.d.ts.map +1 -1
- package/dist/core/tool-repair-health.js +6 -0
- package/dist/core/tool-repair-health.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +2 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +9 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +5 -8
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +88 -55
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-intent.d.ts +42 -15
- package/dist/core/tools/file-mutation-intent.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-intent.js +271 -77
- package/dist/core/tools/file-mutation-intent.js.map +1 -1
- package/dist/core/tools/find.d.ts +2 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +2 -6
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +2 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +2 -6
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/managed-search-tool.d.ts +8 -0
- package/dist/core/tools/managed-search-tool.d.ts.map +1 -0
- package/dist/core/tools/managed-search-tool.js +10 -0
- package/dist/core/tools/managed-search-tool.js.map +1 -0
- package/dist/core/tools/shell-command-parser.d.ts +4 -3
- package/dist/core/tools/shell-command-parser.d.ts.map +1 -1
- package/dist/core/tools/shell-command-parser.js +32 -7
- package/dist/core/tools/shell-command-parser.js.map +1 -1
- package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
- package/dist/core/tools/shell-contract-router.js +23 -1
- package/dist/core/tools/shell-contract-router.js.map +1 -1
- package/dist/core/tools/windows-shell-engine.js +1 -1
- package/dist/core/tools/windows-shell-engine.js.map +1 -1
- package/dist/core/tools/write.d.ts +5 -10
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +92 -73
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.d.ts +6 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.js +59 -12
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
- package/dist/modes/interactive/local-model-commands.d.ts +1 -1
- package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
- package/dist/modes/interactive/local-model-commands.js +51 -8
- package/dist/modes/interactive/local-model-commands.js.map +1 -1
- package/dist/utils/paths.js +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +18 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +73 -43
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/models.md +1 -1
- package/docs/providers.md +34 -10
- package/docs/settings.md +1 -1
- package/docs/tool-boundary-performance-roadmap-2026-08-02.md +21 -18
- package/docs/tool-repair.md +3 -3
- package/docs/windows.md +7 -5
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/prompt-customizer.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/ssh.ts +17 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +240 -260
- package/package.json +6 -6
|
@@ -10,17 +10,20 @@ import io
|
|
|
10
10
|
import os
|
|
11
11
|
import subprocess
|
|
12
12
|
import threading
|
|
13
|
+
import time
|
|
13
14
|
from typing import BinaryIO
|
|
14
15
|
|
|
16
|
+
from arithmetic import ArithmeticError, compile_arithmetic, evaluate_arithmetic
|
|
15
17
|
import nodes
|
|
16
18
|
import parser as parser_module
|
|
17
19
|
import proc
|
|
18
20
|
import tokens as tokens_module
|
|
19
21
|
from context import RUNNER_BUILTINS, STATE_BUILTINS, BuiltinContext, ExecContext
|
|
20
|
-
from errors import ShellExit, UnsupportedConstruct
|
|
22
|
+
from errors import LoopBreak, LoopContinue, LoopControl, ShellExit, UnsupportedConstruct
|
|
21
23
|
from state import ShellState
|
|
22
24
|
|
|
23
25
|
DEVNULL = os.devnull
|
|
26
|
+
MAX_LOOP_ITERATIONS = 1_000_000
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
class _Redirected:
|
|
@@ -344,7 +347,7 @@ def _run_pipeline_elements(elements: list, ctx: ExecContext) -> int:
|
|
|
344
347
|
try:
|
|
345
348
|
# Pipeline stages are subshell-like: state mutations belong to the stage,
|
|
346
349
|
# never to the parent command context or a sibling stage.
|
|
347
|
-
stage_ctx = _sub_ctx(ctx, ctx.state.copy(), sin, sout, stderr_base)
|
|
350
|
+
stage_ctx = _sub_ctx(ctx, ctx.state.copy(), sin, sout, stderr_base, loop_depth=0)
|
|
348
351
|
results[idx] = _dispatch_element(elements[idx], stage_ctx, sin, sout, stderr_base, is_pipeline=True)
|
|
349
352
|
except UnsupportedConstruct as exc:
|
|
350
353
|
# A structured refusal from an inline stage means the WHOLE command
|
|
@@ -356,6 +359,10 @@ def _run_pipeline_elements(elements: list, ctx: ExecContext) -> int:
|
|
|
356
359
|
results[idx] = 1
|
|
357
360
|
except ShellExit as exc:
|
|
358
361
|
results[idx] = exc.exit_code
|
|
362
|
+
except LoopControl:
|
|
363
|
+
# A pipeline stage is a subshell boundary. Loop control in that
|
|
364
|
+
# stage cannot alter an enclosing loop in the parent context.
|
|
365
|
+
results[idx] = 0
|
|
359
366
|
except BaseException as exc: # noqa: BLE001 - any other stage failure must not crash the engine
|
|
360
367
|
# Any OTHER exception is a real per-stage failure, not a refusal: it
|
|
361
368
|
# gets a named, actionable one-line message on the merged sink (never
|
|
@@ -487,6 +494,8 @@ def _dispatch_element(
|
|
|
487
494
|
return _execute_subshell(element, ctx, stdin_stream, stdout_stream, stderr_stream)
|
|
488
495
|
if isinstance(element, nodes.BraceGroup):
|
|
489
496
|
return _execute_brace_group(element, ctx, stdin_stream, stdout_stream, stderr_stream)
|
|
497
|
+
if isinstance(element, (nodes.ForCommand, nodes.ArithmeticForCommand)):
|
|
498
|
+
return _execute_for_command(element, ctx, stdin_stream, stdout_stream, stderr_stream)
|
|
490
499
|
if isinstance(element, nodes.SimpleCommand):
|
|
491
500
|
return _dispatch_simple_command(element, ctx, stdin_stream, stdout_stream, stderr_stream)
|
|
492
501
|
raise UnsupportedConstruct("malformed-syntax", f"unrecognized pipeline element {type(element)!r}")
|
|
@@ -498,6 +507,8 @@ def _sub_ctx(
|
|
|
498
507
|
stdin_stream: BinaryIO | int,
|
|
499
508
|
stdout_stream: BinaryIO | int,
|
|
500
509
|
stderr_stream: BinaryIO | int,
|
|
510
|
+
*,
|
|
511
|
+
loop_depth: int | None = None,
|
|
501
512
|
) -> ExecContext:
|
|
502
513
|
return ExecContext(
|
|
503
514
|
state=state,
|
|
@@ -508,11 +519,12 @@ def _sub_ctx(
|
|
|
508
519
|
builtins=ctx.builtins,
|
|
509
520
|
deadline=ctx.deadline,
|
|
510
521
|
stderr=stderr_stream,
|
|
522
|
+
loop_depth=ctx.loop_depth if loop_depth is None else loop_depth,
|
|
511
523
|
)
|
|
512
524
|
|
|
513
525
|
|
|
514
|
-
def
|
|
515
|
-
node: nodes.Subshell | nodes.BraceGroup,
|
|
526
|
+
def _execute_redirected_compound(
|
|
527
|
+
node: nodes.Subshell | nodes.BraceGroup | nodes.ForCommand | nodes.ArithmeticForCommand,
|
|
516
528
|
ctx: ExecContext,
|
|
517
529
|
stdin_stream,
|
|
518
530
|
stdout_stream,
|
|
@@ -526,8 +538,18 @@ def _execute_redirected_group(
|
|
|
526
538
|
node.redirects, ctx, stdin_stream, stdout_stream, stderr_stream, tracker
|
|
527
539
|
)
|
|
528
540
|
state = ctx.state.copy() if isolated else ctx.state
|
|
529
|
-
inner_ctx = _sub_ctx(
|
|
541
|
+
inner_ctx = _sub_ctx(
|
|
542
|
+
ctx,
|
|
543
|
+
state,
|
|
544
|
+
r_in,
|
|
545
|
+
r_out,
|
|
546
|
+
r_err,
|
|
547
|
+
loop_depth=0 if isolated else ctx.loop_depth,
|
|
548
|
+
)
|
|
530
549
|
try:
|
|
550
|
+
if isinstance(node, (nodes.ForCommand, nodes.ArithmeticForCommand)):
|
|
551
|
+
inner_ctx.loop_depth += 1
|
|
552
|
+
return _execute_loop(node, inner_ctx)
|
|
531
553
|
return execute(node.body, inner_ctx)
|
|
532
554
|
except ShellExit as exc:
|
|
533
555
|
if isolated:
|
|
@@ -538,17 +560,89 @@ def _execute_redirected_group(
|
|
|
538
560
|
|
|
539
561
|
|
|
540
562
|
def _execute_subshell(node: nodes.Subshell, ctx: ExecContext, stdin_stream, stdout_stream, stderr_stream) -> int:
|
|
541
|
-
return
|
|
563
|
+
return _execute_redirected_compound(
|
|
542
564
|
node, ctx, stdin_stream, stdout_stream, stderr_stream, isolated=True
|
|
543
565
|
)
|
|
544
566
|
|
|
545
567
|
|
|
546
568
|
def _execute_brace_group(node: nodes.BraceGroup, ctx: ExecContext, stdin_stream, stdout_stream, stderr_stream) -> int:
|
|
547
|
-
return
|
|
569
|
+
return _execute_redirected_compound(
|
|
570
|
+
node, ctx, stdin_stream, stdout_stream, stderr_stream, isolated=False
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
def _execute_for_command(
|
|
575
|
+
node: nodes.ForCommand | nodes.ArithmeticForCommand,
|
|
576
|
+
ctx: ExecContext,
|
|
577
|
+
stdin_stream,
|
|
578
|
+
stdout_stream,
|
|
579
|
+
stderr_stream,
|
|
580
|
+
) -> int:
|
|
581
|
+
return _execute_redirected_compound(
|
|
548
582
|
node, ctx, stdin_stream, stdout_stream, stderr_stream, isolated=False
|
|
549
583
|
)
|
|
550
584
|
|
|
551
585
|
|
|
586
|
+
def _check_loop_budget(ctx: ExecContext, iteration: int) -> None:
|
|
587
|
+
if ctx.deadline is not None and time.monotonic() >= ctx.deadline:
|
|
588
|
+
raise ShellExit(124)
|
|
589
|
+
if iteration >= MAX_LOOP_ITERATIONS:
|
|
590
|
+
_write_merged(
|
|
591
|
+
_merged_sink(ctx),
|
|
592
|
+
f"for: iteration limit ({MAX_LOOP_ITERATIONS}) exceeded\n".encode("utf-8"),
|
|
593
|
+
ctx,
|
|
594
|
+
)
|
|
595
|
+
raise ShellExit(124)
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
def _execute_loop_body(body: nodes.CommandList, ctx: ExecContext) -> tuple[int, str | None]:
|
|
599
|
+
try:
|
|
600
|
+
return execute(body, ctx), None
|
|
601
|
+
except LoopBreak as exc:
|
|
602
|
+
if exc.levels > 1:
|
|
603
|
+
raise LoopBreak(exc.levels - 1) from None
|
|
604
|
+
return 0, "break"
|
|
605
|
+
except LoopContinue as exc:
|
|
606
|
+
if exc.levels > 1:
|
|
607
|
+
raise LoopContinue(exc.levels - 1) from None
|
|
608
|
+
return 0, "continue"
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
def _execute_loop(node: nodes.ForCommand | nodes.ArithmeticForCommand, ctx: ExecContext) -> int:
|
|
612
|
+
if isinstance(node, nodes.ForCommand):
|
|
613
|
+
values: list[str] = []
|
|
614
|
+
for item in node.items:
|
|
615
|
+
values.extend(ctx.expand_word(item, ctx))
|
|
616
|
+
|
|
617
|
+
exit_code = 0
|
|
618
|
+
for iteration, value in enumerate(values):
|
|
619
|
+
_check_loop_budget(ctx, iteration)
|
|
620
|
+
ctx.state.setenv(node.name, value)
|
|
621
|
+
exit_code, action = _execute_loop_body(node.body, ctx)
|
|
622
|
+
if action == "break":
|
|
623
|
+
return exit_code
|
|
624
|
+
return exit_code
|
|
625
|
+
|
|
626
|
+
try:
|
|
627
|
+
initializer = compile_arithmetic(node.initializer)
|
|
628
|
+
condition = compile_arithmetic(node.condition)
|
|
629
|
+
update = compile_arithmetic(node.update)
|
|
630
|
+
evaluate_arithmetic(initializer, ctx.state)
|
|
631
|
+
exit_code = 0
|
|
632
|
+
iteration = 0
|
|
633
|
+
while condition is None or evaluate_arithmetic(condition, ctx.state) != 0:
|
|
634
|
+
_check_loop_budget(ctx, iteration)
|
|
635
|
+
iteration += 1
|
|
636
|
+
exit_code, action = _execute_loop_body(node.body, ctx)
|
|
637
|
+
if action == "break":
|
|
638
|
+
return exit_code
|
|
639
|
+
evaluate_arithmetic(update, ctx.state)
|
|
640
|
+
return exit_code
|
|
641
|
+
except ArithmeticError as exc:
|
|
642
|
+
_write_merged(_merged_sink(ctx), f"bash: arithmetic: {exc}\n".encode("utf-8"), ctx)
|
|
643
|
+
return 1
|
|
644
|
+
|
|
645
|
+
|
|
552
646
|
def _dispatch_simple_command(
|
|
553
647
|
command: nodes.SimpleCommand,
|
|
554
648
|
ctx: ExecContext,
|
|
@@ -577,7 +671,7 @@ def _dispatch_simple_command(
|
|
|
577
671
|
name = argv[0]
|
|
578
672
|
|
|
579
673
|
if name in STATE_BUILTINS:
|
|
580
|
-
return _run_state_builtin(name, argv, ctx, r_out)
|
|
674
|
+
return _run_state_builtin(name, argv, ctx, r_out, r_err)
|
|
581
675
|
|
|
582
676
|
if name in RUNNER_BUILTINS:
|
|
583
677
|
return _run_xargs(argv, ctx, r_in, r_out)
|
|
@@ -621,17 +715,46 @@ def _as_stream(fd_or_stream: BinaryIO | int, mode: str) -> BinaryIO:
|
|
|
621
715
|
return fd_or_stream
|
|
622
716
|
|
|
623
717
|
|
|
624
|
-
def _run_state_builtin(
|
|
718
|
+
def _run_state_builtin(
|
|
719
|
+
name: str,
|
|
720
|
+
argv: list[str],
|
|
721
|
+
ctx: ExecContext,
|
|
722
|
+
out_stream: BinaryIO | int,
|
|
723
|
+
error_stream: BinaryIO | int | None = None,
|
|
724
|
+
) -> int:
|
|
725
|
+
diagnostic_stream = error_stream if error_stream is not None else out_stream
|
|
726
|
+
if name in ("break", "continue"):
|
|
727
|
+
if len(argv) > 2:
|
|
728
|
+
_write_merged(diagnostic_stream, f"{name}: too many arguments\n".encode("utf-8"), ctx)
|
|
729
|
+
return 1
|
|
730
|
+
try:
|
|
731
|
+
levels = int(argv[1], 10) if len(argv) == 2 else 1
|
|
732
|
+
except ValueError:
|
|
733
|
+
_write_merged(diagnostic_stream, f"{name}: {argv[1]}: numeric argument required\n".encode("utf-8"), ctx)
|
|
734
|
+
return 1
|
|
735
|
+
if levels <= 0:
|
|
736
|
+
_write_merged(diagnostic_stream, f"{name}: loop count must be positive\n".encode("utf-8"), ctx)
|
|
737
|
+
return 1
|
|
738
|
+
if ctx.loop_depth == 0:
|
|
739
|
+
_write_merged(
|
|
740
|
+
diagnostic_stream,
|
|
741
|
+
f"bash: {name}: only meaningful in a 'for', 'while', or 'until' loop\n".encode("utf-8"),
|
|
742
|
+
ctx,
|
|
743
|
+
)
|
|
744
|
+
return 0
|
|
745
|
+
control = LoopBreak if name == "break" else LoopContinue
|
|
746
|
+
raise control(min(levels, ctx.loop_depth))
|
|
747
|
+
|
|
625
748
|
if name == "exit":
|
|
626
749
|
if len(argv) > 2:
|
|
627
|
-
_write_merged(
|
|
750
|
+
_write_merged(diagnostic_stream, b"exit: too many arguments\n", ctx)
|
|
628
751
|
raise ShellExit(1)
|
|
629
752
|
if len(argv) == 1:
|
|
630
753
|
raise ShellExit(ctx.state.last_exit_code)
|
|
631
754
|
try:
|
|
632
755
|
exit_code = int(argv[1], 10)
|
|
633
756
|
except ValueError:
|
|
634
|
-
_write_merged(
|
|
757
|
+
_write_merged(diagnostic_stream, f"exit: {argv[1]}: numeric argument required\n".encode("utf-8"), ctx)
|
|
635
758
|
raise ShellExit(2)
|
|
636
759
|
raise ShellExit(exit_code & 0xFF)
|
|
637
760
|
|
|
@@ -641,16 +764,16 @@ def _run_state_builtin(name: str, argv: list[str], ctx: ExecContext, out_stream:
|
|
|
641
764
|
if print_new_cwd:
|
|
642
765
|
oldpwd = ctx.state.env.get("OLDPWD")
|
|
643
766
|
if not oldpwd:
|
|
644
|
-
_write_merged(
|
|
767
|
+
_write_merged(diagnostic_stream, b"cd: OLDPWD not set\n", ctx)
|
|
645
768
|
return 1
|
|
646
769
|
target = oldpwd
|
|
647
770
|
if target is None:
|
|
648
|
-
_write_merged(
|
|
771
|
+
_write_merged(diagnostic_stream, b"cd: HOME not set\n", ctx)
|
|
649
772
|
return 1
|
|
650
773
|
try:
|
|
651
774
|
ctx.state.chdir(target)
|
|
652
775
|
except FileNotFoundError:
|
|
653
|
-
_write_merged(
|
|
776
|
+
_write_merged(diagnostic_stream, f"cd: {target}: No such file or directory\n".encode("utf-8"), ctx)
|
|
654
777
|
return 1
|
|
655
778
|
if print_new_cwd:
|
|
656
779
|
_write_merged(out_stream, f"{ctx.state.cwd}\n".encode("utf-8"), ctx)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""AST dataclasses for the pi shell engine: word segments + command structure.
|
|
2
2
|
|
|
3
3
|
Transcribed verbatim from windows-shell-workpackages-2026-07-19.md §1.4. Type tags for
|
|
4
4
|
tests come from `type(node).__name__`; do NOT add a `kind` field to any node.
|
|
@@ -95,7 +95,28 @@ class BraceGroup:
|
|
|
95
95
|
redirects: list["Redirect"]
|
|
96
96
|
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
@dataclass
|
|
99
|
+
class ForCommand:
|
|
100
|
+
"""POSIX word-list loop, including the omitted-``in`` positional form."""
|
|
101
|
+
|
|
102
|
+
name: str
|
|
103
|
+
items: list["Word"]
|
|
104
|
+
body: "CommandList"
|
|
105
|
+
redirects: list["Redirect"]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@dataclass
|
|
109
|
+
class ArithmeticForCommand:
|
|
110
|
+
"""Bash arithmetic loop: ``for ((init; condition; update)); do ...; done``."""
|
|
111
|
+
|
|
112
|
+
initializer: str
|
|
113
|
+
condition: str
|
|
114
|
+
update: str
|
|
115
|
+
body: "CommandList"
|
|
116
|
+
redirects: list["Redirect"]
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
PipelineElement = SimpleCommand | Subshell | BraceGroup | ForCommand | ArithmeticForCommand
|
|
99
120
|
|
|
100
121
|
|
|
101
122
|
@dataclass
|
|
@@ -13,9 +13,11 @@ import re
|
|
|
13
13
|
from errors import UnsupportedConstruct
|
|
14
14
|
from nodes import (
|
|
15
15
|
AndOr,
|
|
16
|
+
ArithmeticForCommand,
|
|
16
17
|
BraceGroup,
|
|
17
18
|
CommandList,
|
|
18
19
|
DQ,
|
|
20
|
+
ForCommand,
|
|
19
21
|
Lit,
|
|
20
22
|
Pipeline,
|
|
21
23
|
PipelineElement,
|
|
@@ -28,11 +30,12 @@ from nodes import (
|
|
|
28
30
|
from tokens import Token
|
|
29
31
|
|
|
30
32
|
_ASSIGNMENT_RE = re.compile(r"^([A-Za-z_][A-Za-z0-9_]*)=(.*)$", re.DOTALL)
|
|
33
|
+
_IDENTIFIER_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
|
|
31
34
|
_EXTGLOB_RE = re.compile(r"[@!?*+]\(")
|
|
32
35
|
_BRACE_EXPANSION_RE = re.compile(r"\{[^{}]*,[^{}]*\}")
|
|
33
36
|
|
|
34
37
|
_JOB_CONTROL_WORDS = {"fg", "bg", "jobs", "wait", "disown"}
|
|
35
|
-
_CONTROL_FLOW_WORDS = {"if", "
|
|
38
|
+
_CONTROL_FLOW_WORDS = {"if", "while", "until", "case", "select"}
|
|
36
39
|
_ARITHMETIC_WORDS = {"let"}
|
|
37
40
|
_UNSUPPORTED_BUILTIN_WORDS = {"eval", "source", ".", "alias", "trap", "set", "shopt", "read", "declare", "local"}
|
|
38
41
|
_NESTED_SHELL_WORDS = {"bash", "sh", "zsh", "fish", "cmd", "powershell", "pwsh", "wsl"}
|
|
@@ -124,26 +127,47 @@ class _Parser:
|
|
|
124
127
|
tok = self.peek()
|
|
125
128
|
return tok is not None and tok.kind == "OP" and tok.text == text
|
|
126
129
|
|
|
130
|
+
def at_unquoted_word(self, text: str) -> bool:
|
|
131
|
+
tok = self.peek()
|
|
132
|
+
return (
|
|
133
|
+
tok is not None
|
|
134
|
+
and tok.kind == "WORD"
|
|
135
|
+
and tok.segments is not None
|
|
136
|
+
and len(tok.segments) == 1
|
|
137
|
+
and isinstance(tok.segments[0], Raw)
|
|
138
|
+
and tok.segments[0].text == text
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def _at_stop(self, stop_texts: frozenset[str], stop_words: frozenset[str]) -> bool:
|
|
142
|
+
tok = self.peek()
|
|
143
|
+
if tok is None:
|
|
144
|
+
return True
|
|
145
|
+
if tok.kind == "OP":
|
|
146
|
+
return tok.text in stop_texts
|
|
147
|
+
return any(self.at_unquoted_word(word) for word in stop_words)
|
|
148
|
+
|
|
127
149
|
def _skip_seps(self) -> None:
|
|
128
150
|
while self.at_op(";") or self.at_op("\n"):
|
|
129
151
|
self.advance()
|
|
130
152
|
|
|
131
|
-
def parse_command_list(
|
|
153
|
+
def parse_command_list(
|
|
154
|
+
self, stop_texts: frozenset[str], stop_words: frozenset[str] = frozenset()
|
|
155
|
+
) -> CommandList:
|
|
132
156
|
entries = []
|
|
133
157
|
separators: list[str] = []
|
|
134
158
|
self._skip_seps()
|
|
135
159
|
while True:
|
|
136
|
-
|
|
137
|
-
if tok is None or (tok.kind == "OP" and tok.text in stop_texts):
|
|
160
|
+
if self._at_stop(stop_texts, stop_words):
|
|
138
161
|
break
|
|
139
162
|
entries.append(self.parse_and_or())
|
|
140
163
|
if self.at_op("&"):
|
|
141
164
|
raise UnsupportedConstruct(
|
|
142
165
|
"job-control", "Background execution ('&') is not supported; run commands synchronously."
|
|
143
166
|
)
|
|
144
|
-
|
|
145
|
-
if tok is None or (tok.kind == "OP" and tok.text in stop_texts):
|
|
167
|
+
if self._at_stop(stop_texts, stop_words):
|
|
146
168
|
break
|
|
169
|
+
tok = self.peek()
|
|
170
|
+
assert tok is not None
|
|
147
171
|
if tok.kind == "OP" and tok.text in (";", "\n"):
|
|
148
172
|
separators.append(self.advance().text) # type: ignore[arg-type]
|
|
149
173
|
self._skip_seps()
|
|
@@ -194,6 +218,13 @@ class _Parser:
|
|
|
194
218
|
self.advance()
|
|
195
219
|
redirects = self._parse_redirects()
|
|
196
220
|
return BraceGroup(body=body, redirects=redirects)
|
|
221
|
+
if self.at_unquoted_word("for"):
|
|
222
|
+
return self.parse_for_command()
|
|
223
|
+
if self.peek() is not None and self.peek().kind == "ARITH":
|
|
224
|
+
raise UnsupportedConstruct(
|
|
225
|
+
"arithmetic-expansion",
|
|
226
|
+
"Arithmetic commands '((...))' are supported only as a for-loop header.",
|
|
227
|
+
)
|
|
197
228
|
command = self.parse_simple_command()
|
|
198
229
|
if not command.assignments and not command.words and not command.redirects:
|
|
199
230
|
# A fully empty SimpleCommand reached as a pipeline element means a missing
|
|
@@ -204,6 +235,103 @@ class _Parser:
|
|
|
204
235
|
)
|
|
205
236
|
return command
|
|
206
237
|
|
|
238
|
+
def _parse_for_body(self) -> CommandList:
|
|
239
|
+
if not (self.at_op(";") or self.at_op("\n")):
|
|
240
|
+
raise UnsupportedConstruct(
|
|
241
|
+
"malformed-syntax", "A for loop requires ';' or a newline before 'do'."
|
|
242
|
+
)
|
|
243
|
+
self._skip_seps()
|
|
244
|
+
if not self.at_unquoted_word("do"):
|
|
245
|
+
raise UnsupportedConstruct("malformed-syntax", "A for loop is missing its 'do' keyword.")
|
|
246
|
+
self.advance()
|
|
247
|
+
|
|
248
|
+
body = self.parse_command_list(frozenset(), frozenset({"done"}))
|
|
249
|
+
if not self.at_unquoted_word("done"):
|
|
250
|
+
raise UnsupportedConstruct("malformed-syntax", "A for loop is missing its closing 'done' keyword.")
|
|
251
|
+
if not body.entries:
|
|
252
|
+
raise UnsupportedConstruct("malformed-syntax", "A for loop requires at least one command in its body.")
|
|
253
|
+
self.advance()
|
|
254
|
+
return body
|
|
255
|
+
|
|
256
|
+
@staticmethod
|
|
257
|
+
def _split_arithmetic_header(header: str) -> tuple[str, str, str]:
|
|
258
|
+
parts: list[str] = []
|
|
259
|
+
start = 0
|
|
260
|
+
depth = 0
|
|
261
|
+
for index, char in enumerate(header):
|
|
262
|
+
if char == "(":
|
|
263
|
+
depth += 1
|
|
264
|
+
elif char == ")":
|
|
265
|
+
depth -= 1
|
|
266
|
+
if depth < 0:
|
|
267
|
+
raise UnsupportedConstruct(
|
|
268
|
+
"malformed-syntax", "Arithmetic for header contains an unmatched ')'."
|
|
269
|
+
)
|
|
270
|
+
elif char == ";" and depth == 0:
|
|
271
|
+
parts.append(header[start:index].strip())
|
|
272
|
+
start = index + 1
|
|
273
|
+
if depth != 0:
|
|
274
|
+
raise UnsupportedConstruct(
|
|
275
|
+
"malformed-syntax", "Arithmetic for header contains unbalanced parentheses."
|
|
276
|
+
)
|
|
277
|
+
parts.append(header[start:].strip())
|
|
278
|
+
if len(parts) != 3:
|
|
279
|
+
raise UnsupportedConstruct(
|
|
280
|
+
"malformed-syntax",
|
|
281
|
+
"An arithmetic for loop requires exactly 'initializer; condition; update'.",
|
|
282
|
+
)
|
|
283
|
+
return parts[0], parts[1], parts[2]
|
|
284
|
+
|
|
285
|
+
def parse_for_command(self) -> ForCommand | ArithmeticForCommand:
|
|
286
|
+
self.advance() # `for`
|
|
287
|
+
arithmetic = self.peek()
|
|
288
|
+
if arithmetic is not None and arithmetic.kind == "ARITH":
|
|
289
|
+
self.advance()
|
|
290
|
+
initializer, condition, update = self._split_arithmetic_header(arithmetic.text or "")
|
|
291
|
+
body = self._parse_for_body()
|
|
292
|
+
return ArithmeticForCommand(
|
|
293
|
+
initializer=initializer,
|
|
294
|
+
condition=condition,
|
|
295
|
+
update=update,
|
|
296
|
+
body=body,
|
|
297
|
+
redirects=self._parse_redirects(),
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
variable = self.peek()
|
|
301
|
+
variable_name = (
|
|
302
|
+
variable.segments[0].text
|
|
303
|
+
if variable is not None
|
|
304
|
+
and variable.kind == "WORD"
|
|
305
|
+
and variable.segments is not None
|
|
306
|
+
and len(variable.segments) == 1
|
|
307
|
+
and isinstance(variable.segments[0], Raw)
|
|
308
|
+
else ""
|
|
309
|
+
)
|
|
310
|
+
if not _IDENTIFIER_RE.fullmatch(variable_name):
|
|
311
|
+
raise UnsupportedConstruct(
|
|
312
|
+
"malformed-syntax", "A for loop requires an unquoted shell variable name after 'for'."
|
|
313
|
+
)
|
|
314
|
+
self.advance()
|
|
315
|
+
items: list[Word] = []
|
|
316
|
+
if self.at_unquoted_word("in"):
|
|
317
|
+
self.advance()
|
|
318
|
+
while True:
|
|
319
|
+
tok = self.peek()
|
|
320
|
+
if tok is None or tok.kind == "OP":
|
|
321
|
+
break
|
|
322
|
+
if tok.kind != "WORD":
|
|
323
|
+
raise UnsupportedConstruct(
|
|
324
|
+
"malformed-syntax", "Unexpected token in a for loop word list."
|
|
325
|
+
)
|
|
326
|
+
items.append(Word(segments=tok.segments or []))
|
|
327
|
+
self.advance()
|
|
328
|
+
elif not (self.at_op(";") or self.at_op("\n")):
|
|
329
|
+
raise UnsupportedConstruct(
|
|
330
|
+
"malformed-syntax", "A for loop requires 'in values' or ';' after its variable name."
|
|
331
|
+
)
|
|
332
|
+
body = self._parse_for_body()
|
|
333
|
+
return ForCommand(name=variable_name, items=items, body=body, redirects=self._parse_redirects())
|
|
334
|
+
|
|
207
335
|
def _parse_redirects(self) -> list[Redirect]:
|
|
208
336
|
redirects: list[Redirect] = []
|
|
209
337
|
while True:
|
|
@@ -20,7 +20,7 @@ _IDENT_START_RE = re.compile(r"[A-Za-z_]")
|
|
|
20
20
|
_IDENT_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]*")
|
|
21
21
|
@dataclass
|
|
22
22
|
class Token:
|
|
23
|
-
kind: str # "WORD" | "OP"
|
|
23
|
+
kind: str # "WORD" | "OP" | "ARITH"
|
|
24
24
|
text: str | None = None # OP: exact operator text (e.g. ">>", "2>&1", "\n")
|
|
25
25
|
segments: list[Segment] | None = None # WORD: ordered segments
|
|
26
26
|
|
|
@@ -402,6 +402,26 @@ def _scan_operator(src: str, pos: int) -> tuple[str, int]:
|
|
|
402
402
|
raise AssertionError(f"unreachable operator dispatch at {pos!r}")
|
|
403
403
|
|
|
404
404
|
|
|
405
|
+
def _scan_arithmetic_group(src: str, pos: int) -> tuple[str, int]:
|
|
406
|
+
"""Scan ``((...))`` as one token while allowing balanced inner parentheses."""
|
|
407
|
+
depth = 0
|
|
408
|
+
cursor = pos + 2
|
|
409
|
+
while cursor < len(src):
|
|
410
|
+
if src[cursor : cursor + 2] == "))" and depth == 0:
|
|
411
|
+
return src[pos + 2 : cursor], cursor + 2
|
|
412
|
+
char = src[cursor]
|
|
413
|
+
if char == "(":
|
|
414
|
+
depth += 1
|
|
415
|
+
elif char == ")":
|
|
416
|
+
if depth == 0:
|
|
417
|
+
raise UnsupportedConstruct(
|
|
418
|
+
"malformed-syntax", "Arithmetic loop header contains an unmatched ')'."
|
|
419
|
+
)
|
|
420
|
+
depth -= 1
|
|
421
|
+
cursor += 1
|
|
422
|
+
raise _unterminated("arithmetic loop header")
|
|
423
|
+
|
|
424
|
+
|
|
405
425
|
def tokenize(src: str) -> list[Token]:
|
|
406
426
|
n = len(src)
|
|
407
427
|
tokens: list[Token] = []
|
|
@@ -425,7 +445,10 @@ def tokenize(src: str) -> list[Token]:
|
|
|
425
445
|
pos = n if newline == -1 else newline
|
|
426
446
|
continue
|
|
427
447
|
if src[pos : pos + 2] == "((":
|
|
428
|
-
|
|
448
|
+
arithmetic, newpos = _scan_arithmetic_group(src, pos)
|
|
449
|
+
tokens.append(Token(kind="ARITH", text=arithmetic))
|
|
450
|
+
pos = newpos
|
|
451
|
+
continue
|
|
429
452
|
if c.isdigit():
|
|
430
453
|
j = pos
|
|
431
454
|
while j < n and src[j].isdigit():
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-services.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session-services.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { getAgentDir } from "../config.js";
|
|
|
2
2
|
import { resolvePath } from "../utils/paths.js";
|
|
3
3
|
import { configFile } from "./agent-paths.js";
|
|
4
4
|
import { AuthStorage } from "./auth-storage.js";
|
|
5
|
+
import { bindSavedBedrockScope } from "./bedrock-scope.js";
|
|
5
6
|
import { ModelRegistry } from "./model-registry.js";
|
|
6
7
|
import { DefaultResourceLoader } from "./resource-loader.js";
|
|
7
8
|
import { parseResourceProfileInput } from "./resource-profile-blocks.js";
|
|
@@ -58,6 +59,7 @@ export async function createAgentSessionServices(options) {
|
|
|
58
59
|
const authStorage = options.authStorage ?? AuthStorage.create(configFile(agentDir, "auth.json"));
|
|
59
60
|
const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);
|
|
60
61
|
const modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, configFile(agentDir, "models.json"));
|
|
62
|
+
bindSavedBedrockScope(settingsManager, modelRegistry);
|
|
61
63
|
const resourceLoader = new DefaultResourceLoader({
|
|
62
64
|
...(options.resourceLoaderOptions ?? {}),
|
|
63
65
|
cwd,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-services.js","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Model } from \"@caupulican/pi-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { configFile } from \"./agent-paths.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { parseResourceProfileInput } from \"./resource-profile-blocks.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\t/** Preserve whether the foreground model came from an explicit launch flag. */\n\tisExplicitModel?: boolean;\n\t/** Preserve whether the thinking level came from an explicit launch flag. */\n\tisExplicitThinking?: boolean;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\ttoolProfileFilter?: CreateAgentSessionOptions[\"toolProfileFilter\"];\n\tresourceProfileDefinitions?: CreateAgentSessionOptions[\"resourceProfileDefinitions\"];\n\tresourceProfileJson?: CreateAgentSessionOptions[\"resourceProfileJson\"];\n\tresourceProfiles?: CreateAgentSessionOptions[\"resourceProfiles\"];\n\torchestrationProfile?: CreateAgentSessionOptions[\"orchestrationProfile\"];\n\tcustomTools?: ToolDefinition[];\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst authStorage = options.authStorage ?? AuthStorage.create(configFile(agentDir, \"auth.json\"));\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst modelRegistry =\n\t\toptions.modelRegistry ?? ModelRegistry.create(authStorage, configFile(agentDir, \"models.json\"));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload();\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst activeProfileNames = settingsManager.getActiveResourceProfileNames();\n\tconst runtimeExtensionPaths = new Set(\n\t\t(activeProfileNames.length === 0\n\t\t\t? extensionsResult.extensions.filter((extension) => extension.sourceInfo.source === \"inline\")\n\t\t\t: extensionsResult.extensions.filter((extension) =>\n\t\t\t\t\tsettingsManager.isResourceAllowedByProfile(\"extensions\", extension.path, extension.sourceInfo.baseDir),\n\t\t\t\t)\n\t\t).map((extension) => extension.path),\n\t);\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t// Initial model resolution needs providers before AgentSession binds its runner, but it must\n\t\t// observe the same UAC-filtered extension generation as RuntimeBuilder. Registrations from\n\t\t// withheld extensions remain inert and are discarded with the pending queue below.\n\t\tif (!runtimeExtensionPaths.has(extensionPath)) continue;\n\t\ttry {\n\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\tlet ownedProviders = extensionsResult.runtime.providersByExtension.get(extensionPath);\n\t\t\tif (!ownedProviders) {\n\t\t\t\townedProviders = new Set();\n\t\t\t\textensionsResult.runtime.providersByExtension.set(extensionPath, ownedProviders);\n\t\t\t}\n\t\t\townedProviders.add(name);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tauthStorage,\n\t\tsettingsManager,\n\t\tmodelRegistry,\n\t\tresourceLoader,\n\t\tdiagnostics,\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\tconst needsProfileReload =\n\t\toptions.resourceProfileDefinitions !== undefined ||\n\t\toptions.resourceProfileJson !== undefined ||\n\t\toptions.resourceProfiles !== undefined;\n\tif (options.resourceProfileDefinitions) {\n\t\toptions.services.settingsManager.addInlineResourceProfileDefinitions(options.resourceProfileDefinitions);\n\t}\n\tif (options.resourceProfileJson) {\n\t\tconst inputs = Array.isArray(options.resourceProfileJson)\n\t\t\t? options.resourceProfileJson\n\t\t\t: [options.resourceProfileJson];\n\t\tfor (const input of inputs) {\n\t\t\toptions.services.settingsManager.addInlineResourceProfileDefinitions(\n\t\t\t\tparseResourceProfileInput(input).profiles,\n\t\t\t);\n\t\t}\n\t}\n\tif (options.resourceProfiles !== undefined) {\n\t\toptions.services.settingsManager.setRuntimeResourceProfiles(options.resourceProfiles);\n\t}\n\tif (needsProfileReload) {\n\t\tawait options.services.resourceLoader.reload();\n\t}\n\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tauthStorage: options.services.authStorage,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tmodelRegistry: options.services.modelRegistry,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tisExplicitModel: options.isExplicitModel,\n\t\tisExplicitThinking: options.isExplicitThinking,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\ttoolProfileFilter:\n\t\t\toptions.toolProfileFilter ?? options.services.settingsManager.getResourceProfileFilter(\"tools\"),\n\t\tcustomTools: options.customTools,\n\t\torchestrationProfile: options.orchestrationProfile,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-services.js","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Model } from \"@caupulican/pi-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { configFile } from \"./agent-paths.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport { bindSavedBedrockScope } from \"./bedrock-scope.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { parseResourceProfileInput } from \"./resource-profile-blocks.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\t/** Preserve whether the foreground model came from an explicit launch flag. */\n\tisExplicitModel?: boolean;\n\t/** Preserve whether the thinking level came from an explicit launch flag. */\n\tisExplicitThinking?: boolean;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\ttoolProfileFilter?: CreateAgentSessionOptions[\"toolProfileFilter\"];\n\tresourceProfileDefinitions?: CreateAgentSessionOptions[\"resourceProfileDefinitions\"];\n\tresourceProfileJson?: CreateAgentSessionOptions[\"resourceProfileJson\"];\n\tresourceProfiles?: CreateAgentSessionOptions[\"resourceProfiles\"];\n\torchestrationProfile?: CreateAgentSessionOptions[\"orchestrationProfile\"];\n\tcustomTools?: ToolDefinition[];\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst authStorage = options.authStorage ?? AuthStorage.create(configFile(agentDir, \"auth.json\"));\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst modelRegistry =\n\t\toptions.modelRegistry ?? ModelRegistry.create(authStorage, configFile(agentDir, \"models.json\"));\n\tbindSavedBedrockScope(settingsManager, modelRegistry);\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload();\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst activeProfileNames = settingsManager.getActiveResourceProfileNames();\n\tconst runtimeExtensionPaths = new Set(\n\t\t(activeProfileNames.length === 0\n\t\t\t? extensionsResult.extensions.filter((extension) => extension.sourceInfo.source === \"inline\")\n\t\t\t: extensionsResult.extensions.filter((extension) =>\n\t\t\t\t\tsettingsManager.isResourceAllowedByProfile(\"extensions\", extension.path, extension.sourceInfo.baseDir),\n\t\t\t\t)\n\t\t).map((extension) => extension.path),\n\t);\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t// Initial model resolution needs providers before AgentSession binds its runner, but it must\n\t\t// observe the same UAC-filtered extension generation as RuntimeBuilder. Registrations from\n\t\t// withheld extensions remain inert and are discarded with the pending queue below.\n\t\tif (!runtimeExtensionPaths.has(extensionPath)) continue;\n\t\ttry {\n\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\tlet ownedProviders = extensionsResult.runtime.providersByExtension.get(extensionPath);\n\t\t\tif (!ownedProviders) {\n\t\t\t\townedProviders = new Set();\n\t\t\t\textensionsResult.runtime.providersByExtension.set(extensionPath, ownedProviders);\n\t\t\t}\n\t\t\townedProviders.add(name);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tauthStorage,\n\t\tsettingsManager,\n\t\tmodelRegistry,\n\t\tresourceLoader,\n\t\tdiagnostics,\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\tconst needsProfileReload =\n\t\toptions.resourceProfileDefinitions !== undefined ||\n\t\toptions.resourceProfileJson !== undefined ||\n\t\toptions.resourceProfiles !== undefined;\n\tif (options.resourceProfileDefinitions) {\n\t\toptions.services.settingsManager.addInlineResourceProfileDefinitions(options.resourceProfileDefinitions);\n\t}\n\tif (options.resourceProfileJson) {\n\t\tconst inputs = Array.isArray(options.resourceProfileJson)\n\t\t\t? options.resourceProfileJson\n\t\t\t: [options.resourceProfileJson];\n\t\tfor (const input of inputs) {\n\t\t\toptions.services.settingsManager.addInlineResourceProfileDefinitions(\n\t\t\t\tparseResourceProfileInput(input).profiles,\n\t\t\t);\n\t\t}\n\t}\n\tif (options.resourceProfiles !== undefined) {\n\t\toptions.services.settingsManager.setRuntimeResourceProfiles(options.resourceProfiles);\n\t}\n\tif (needsProfileReload) {\n\t\tawait options.services.resourceLoader.reload();\n\t}\n\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tauthStorage: options.services.authStorage,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tmodelRegistry: options.services.modelRegistry,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tisExplicitModel: options.isExplicitModel,\n\t\tisExplicitThinking: options.isExplicitThinking,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\ttoolProfileFilter:\n\t\t\toptions.toolProfileFilter ?? options.services.settingsManager.getResourceProfileFilter(\"tools\"),\n\t\tcustomTools: options.customTools,\n\t\torchestrationProfile: options.orchestrationProfile,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t});\n}\n"]}
|