@openclaw/lobster 2026.9.4 → 2026.9.6
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/assets/activity.svg +4 -0
- package/assets/icon.png +0 -0
- package/dist/index.js +39 -10
- package/node_modules/@clawdbot/lobster/README.md +129 -131
- package/node_modules/@clawdbot/lobster/VISION.md +15 -238
- package/node_modules/@clawdbot/lobster/bin/clawd.invoke.js +2 -15
- package/node_modules/@clawdbot/lobster/bin/invoke.js +19 -0
- package/node_modules/@clawdbot/lobster/bin/lobster.js +2 -21
- package/node_modules/@clawdbot/lobster/bin/openclaw.invoke.js +2 -18
- package/node_modules/@clawdbot/lobster/dist/src/abortable_process.js +297 -0
- package/node_modules/@clawdbot/lobster/dist/src/abortable_process.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/cli.js +128 -296
- package/node_modules/@clawdbot/lobster/dist/src/cli.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/command_tokens.js +81 -0
- package/node_modules/@clawdbot/lobster/dist/src/command_tokens.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/commands/commands_list.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/registry.js +2 -0
- package/node_modules/@clawdbot/lobster/dist/src/commands/registry.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/approve.js +2 -0
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/approve.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/ask.js +3 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/ask.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/dedupe.js +1 -12
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/dedupe.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/diff_last.js +6 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/diff_last.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/email_triage.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/exec.js +30 -34
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/exec.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/gog_gmail_search.js +12 -25
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/gog_gmail_search.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/gog_gmail_send.js +19 -25
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/gog_gmail_send.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/group_by.js +2 -14
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/group_by.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/head.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/json.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js +260 -42
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js +2 -13
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/openclaw_agent.js +139 -0
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/openclaw_agent.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/openclaw_invoke.js +20 -2
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/openclaw_invoke.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/pick.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/sort.js +4 -21
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/sort.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/state.js +48 -20
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/state.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/table.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/template.js +2 -13
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/template.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/where.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/workflows/workflows_list.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/commands/workflows/workflows_run.js +0 -18
- package/node_modules/@clawdbot/lobster/dist/src/commands/workflows/workflows_run.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/core/cost_tracker.js +45 -3
- package/node_modules/@clawdbot/lobster/dist/src/core/cost_tracker.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/core/filters.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/core/llm_accounting.js +304 -0
- package/node_modules/@clawdbot/lobster/dist/src/core/llm_accounting.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/core/retry.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/core/tool_runtime.js +147 -21
- package/node_modules/@clawdbot/lobster/dist/src/core/tool_runtime.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/core/value_path.js +11 -0
- package/node_modules/@clawdbot/lobster/dist/src/core/value_path.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/input_request.js +4 -2
- package/node_modules/@clawdbot/lobster/dist/src/input_request.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/parser.js +5 -69
- package/node_modules/@clawdbot/lobster/dist/src/parser.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/pipeline_resume_state.js +241 -74
- package/node_modules/@clawdbot/lobster/dist/src/pipeline_resume_state.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/read_line.js +52 -7
- package/node_modules/@clawdbot/lobster/dist/src/read_line.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/read_response_text.js +86 -0
- package/node_modules/@clawdbot/lobster/dist/src/read_response_text.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/index.js +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/pr-monitor.js +9 -66
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/pr-monitor.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/read_pr.js +45 -0
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/read_pr.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/snapshot.js +45 -0
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/snapshot.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/stages/pr-view.js +13 -65
- package/node_modules/@clawdbot/lobster/dist/src/recipes/github/stages/pr-view.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/recipes/registry.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/renderers/json.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/resume.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/runtime.js +187 -17
- package/node_modules/@clawdbot/lobster/dist/src/runtime.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/Lobster.js +25 -134
- package/node_modules/@clawdbot/lobster/dist/src/sdk/Lobster.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/index.js +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/approve.js +1 -2
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/approve.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/diff.js +11 -86
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/diff.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/exec.js +20 -96
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/exec.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/state.js +8 -106
- package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/state.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/runtime.js +2 -13
- package/node_modules/@clawdbot/lobster/dist/src/sdk/runtime.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/sdk/state_env.js +6 -0
- package/node_modules/@clawdbot/lobster/dist/src/sdk/state_env.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/shell.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/state/atomic_file.js +192 -0
- package/node_modules/@clawdbot/lobster/dist/src/state/atomic_file.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/state/store.js +550 -136
- package/node_modules/@clawdbot/lobster/dist/src/state/store.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/token.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/validation.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/workflows/dry_run.js +262 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/dry_run.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/expressions.js +345 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/expressions.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/file.js +950 -1285
- package/node_modules/@clawdbot/lobster/dist/src/workflows/file.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/workflows/github_pr_monitor.js +20 -90
- package/node_modules/@clawdbot/lobster/dist/src/workflows/github_pr_monitor.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/workflows/graph.js +9 -8
- package/node_modules/@clawdbot/lobster/dist/src/workflows/graph.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/workflows/load.js +347 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/load.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/registry.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/src/workflows/types.js +2 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/types.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/values.js +93 -0
- package/node_modules/@clawdbot/lobster/dist/src/workflows/values.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/approval_id.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/approve_preview.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/bin_smoke.test.js +25 -0
- package/node_modules/@clawdbot/lobster/dist/test/bin_smoke.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js +5171 -0
- package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke.test.js +22 -0
- package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/clawd_invoke_legacy.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js +53 -0
- package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/cli_run_file_args_json.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js +82 -0
- package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/commands_list.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/condition_comparison.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/core_tool_runtime.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js +1774 -12
- package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/dedupe.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/diff_last.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/doctor.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/dry_run.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/email_triage.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/exec_stdin.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/for_each.test.js +254 -0
- package/node_modules/@clawdbot/lobster/dist/test/for_each.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_notify_format.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_summary.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_view.test.js +176 -0
- package/node_modules/@clawdbot/lobster/dist/test/github_pr_view.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/gog_gmail_send.test.js +100 -0
- package/node_modules/@clawdbot/lobster/dist/test/gog_gmail_send.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/group_by.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js +17 -0
- package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/helpers/wait_for_pid.js +19 -0
- package/node_modules/@clawdbot/lobster/dist/test/helpers/wait_for_pid.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/http_response_body_cap.test.js +318 -0
- package/node_modules/@clawdbot/lobster/dist/test/http_response_body_cap.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js +948 -1
- package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/llm_task_invoke.test.js +103 -0
- package/node_modules/@clawdbot/lobster/dist/test/llm_task_invoke.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/map.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/multi_approval_resume.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/on_error.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_agent.test.js +169 -0
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_agent.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_dispatch_retry.test.js +96 -0
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_dispatch_retry.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/openclaw_invoke_alias.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/parallel.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/parser.test.js +57 -0
- package/node_modules/@clawdbot/lobster/dist/test/parser.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js +65 -0
- package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js +175 -0
- package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/read_line.test.js +54 -0
- package/node_modules/@clawdbot/lobster/dist/test/read_line.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/release_changelog.test.js +39 -0
- package/node_modules/@clawdbot/lobster/dist/test/release_changelog.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/request_input.test.js +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/request_input.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/resume.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js +248 -0
- package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/sdk_lobster.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/shell.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/sort.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/state.test.js +584 -1
- package/node_modules/@clawdbot/lobster/dist/test/state.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/step_retry.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/step_stdin_epipe.test.js +44 -0
- package/node_modules/@clawdbot/lobster/dist/test/step_stdin_epipe.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/step_timeout.test.js +67 -1
- package/node_modules/@clawdbot/lobster/dist/test/step_timeout.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/template.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/template_filters.test.js +37 -0
- package/node_modules/@clawdbot/lobster/dist/test/template_filters.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/tool_envelope_version.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/tool_mode.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/validation.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/where.test.js +94 -0
- package/node_modules/@clawdbot/lobster/dist/test/where.test.js.map +1 -0
- package/node_modules/@clawdbot/lobster/dist/test/workflow_args_env.test.js +5 -3
- package/node_modules/@clawdbot/lobster/dist/test/workflow_args_env.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_composition.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_file.test.js +647 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_file.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js +13 -3
- package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/dist/test/workflows.test.js.map +1 -1
- package/node_modules/@clawdbot/lobster/package.json +72 -73
- package/node_modules/typebox/build/compile/validator.d.mts +1 -1
- package/node_modules/typebox/build/compile/validator.mjs +1 -1
- package/node_modules/typebox/build/format/idna/idn-hostname.mjs +7 -5
- package/node_modules/typebox/build/format/iri.mjs +5 -1
- package/node_modules/typebox/build/guard/emit.mjs +2 -4
- package/node_modules/typebox/build/guard/guard.mjs +6 -18
- package/node_modules/typebox/build/guard/string.mjs +16 -24
- package/node_modules/typebox/build/schema/build.mjs +2 -2
- package/node_modules/typebox/build/schema/check.mjs +1 -1
- package/node_modules/typebox/build/schema/compile.d.mts +3 -2
- package/node_modules/typebox/build/schema/compile.mjs +8 -8
- package/node_modules/typebox/build/schema/engine/_context.d.mts +6 -7
- package/node_modules/typebox/build/schema/engine/_context.mjs +23 -15
- package/node_modules/typebox/build/schema/engine/_functions.d.mts +2 -2
- package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -1
- package/node_modules/typebox/build/schema/engine/_reducer.d.mts +3 -3
- package/node_modules/typebox/build/schema/engine/_refine.d.mts +5 -5
- package/node_modules/typebox/build/schema/engine/_refine.mjs +4 -7
- package/node_modules/typebox/build/schema/engine/_stack.d.mts +34 -16
- package/node_modules/typebox/build/schema/engine/_stack.mjs +148 -104
- package/node_modules/typebox/build/schema/engine/additionalItems.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/additionalProperties.d.mts +8 -8
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +26 -18
- package/node_modules/typebox/build/schema/engine/allOf.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/allOf.mjs +3 -3
- package/node_modules/typebox/build/schema/engine/anyOf.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/anyOf.mjs +5 -10
- package/node_modules/typebox/build/schema/engine/boolean.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/boolean.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/const.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/const.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/contains.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/contains.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/dependencies.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/dependencies.mjs +3 -6
- package/node_modules/typebox/build/schema/engine/dependentRequired.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/dependentRequired.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/dependentSchemas.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +11 -7
- package/node_modules/typebox/build/schema/engine/enum.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/enum.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/exclusiveMaximum.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/exclusiveMaximum.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/exclusiveMinimum.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/exclusiveMinimum.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/format.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/format.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/if.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/if.mjs +7 -15
- package/node_modules/typebox/build/schema/engine/items.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/items.mjs +1 -1
- package/node_modules/typebox/build/schema/engine/maxContains.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/maxContains.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/maxItems.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/maxItems.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/maxLength.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/maxLength.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/maxProperties.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/maxProperties.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/maximum.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/maximum.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/minContains.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/minContains.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/minItems.d.mts +5 -5
- package/node_modules/typebox/build/schema/engine/minItems.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/minLength.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/minLength.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/minProperties.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/minProperties.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/minimum.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/minimum.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/multipleOf.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/multipleOf.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/not.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/not.mjs +4 -8
- package/node_modules/typebox/build/schema/engine/oneOf.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/oneOf.mjs +6 -11
- package/node_modules/typebox/build/schema/engine/pattern.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -7
- package/node_modules/typebox/build/schema/engine/patternProperties.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +1 -1
- package/node_modules/typebox/build/schema/engine/prefixItems.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/prefixItems.mjs +1 -1
- package/node_modules/typebox/build/schema/engine/properties.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/properties.mjs +1 -1
- package/node_modules/typebox/build/schema/engine/propertyNames.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/propertyNames.mjs +4 -10
- package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +11 -7
- package/node_modules/typebox/build/schema/engine/ref.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/ref.mjs +19 -15
- package/node_modules/typebox/build/schema/engine/required.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/required.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/schema.d.mts +7 -7
- package/node_modules/typebox/build/schema/engine/schema.mjs +137 -133
- package/node_modules/typebox/build/schema/engine/type.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/type.mjs +2 -6
- package/node_modules/typebox/build/schema/engine/unevaluatedItems.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/unevaluatedItems.mjs +5 -9
- package/node_modules/typebox/build/schema/engine/unevaluatedProperties.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/unevaluatedProperties.mjs +5 -9
- package/node_modules/typebox/build/schema/engine/uniqueItems.d.mts +4 -4
- package/node_modules/typebox/build/schema/engine/uniqueItems.mjs +2 -6
- package/node_modules/typebox/build/schema/errors.d.mts +2 -2
- package/node_modules/typebox/build/schema/errors.mjs +8 -14
- package/node_modules/typebox/build/schema/intern/index.d.mts +1 -0
- package/node_modules/typebox/build/schema/intern/index.mjs +1 -0
- package/node_modules/typebox/build/schema/intern/intern.d.mts +11 -0
- package/node_modules/typebox/build/schema/intern/intern.mjs +293 -0
- package/node_modules/typebox/build/schema/meta/draft_2019_09.d.mts +2 -0
- package/node_modules/typebox/build/schema/meta/draft_2019_09.mjs +288 -0
- package/node_modules/typebox/build/schema/meta/draft_2020_12.d.mts +2 -0
- package/node_modules/typebox/build/schema/meta/draft_2020_12.mjs +300 -0
- package/node_modules/typebox/build/schema/meta/draft_3.d.mts +2 -0
- package/node_modules/typebox/build/schema/meta/draft_3.mjs +143 -0
- package/node_modules/typebox/build/schema/meta/draft_4.d.mts +2 -0
- package/node_modules/typebox/build/schema/meta/draft_4.mjs +149 -0
- package/node_modules/typebox/build/schema/meta/draft_6.d.mts +2 -0
- package/node_modules/typebox/build/schema/meta/draft_6.mjs +155 -0
- package/node_modules/typebox/build/schema/meta/draft_7.d.mts +2 -0
- package/node_modules/typebox/build/schema/meta/draft_7.mjs +172 -0
- package/node_modules/typebox/build/schema/meta/index.d.mts +2 -0
- package/node_modules/typebox/build/schema/meta/index.mjs +2 -0
- package/node_modules/typebox/build/schema/meta/meta.d.mts +9 -0
- package/node_modules/typebox/build/schema/meta/meta.mjs +15 -0
- package/node_modules/typebox/build/schema/meta/schema.d.mts +6 -0
- package/node_modules/typebox/build/schema/meta/schema.mjs +1 -0
- package/node_modules/typebox/build/schema/parse.d.mts +1 -0
- package/node_modules/typebox/build/schema/parse.mjs +10 -5
- package/node_modules/typebox/build/schema/resolve/resolve.d.mts +8 -3
- package/node_modules/typebox/build/schema/resolve/resolve.mjs +268 -139
- package/node_modules/typebox/build/schema/schema.d.mts +2 -0
- package/node_modules/typebox/build/schema/schema.mjs +2 -0
- package/node_modules/typebox/build/value/errors/errors.d.mts +2 -12
- package/node_modules/typebox/build/value/errors/errors.mjs +2 -7
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +59 -89
- package/openclaw.plugin.json +1 -1
- package/package.json +10 -7
- package/node_modules/@clawdbot/lobster/dist/src/sdk/token.js +0 -9
- package/node_modules/@clawdbot/lobster/dist/src/sdk/token.js.map +0 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { promises as fsp } from "node:fs";
|
|
5
|
+
import http from "node:http";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
const cli = path.resolve("bin/lobster.js");
|
|
11
|
+
async function runWorkflow(dir, pipeline, env = {}) {
|
|
12
|
+
const file = path.join(dir, "workflow.lobster");
|
|
13
|
+
await fsp.writeFile(file, JSON.stringify({
|
|
14
|
+
cwd: dir,
|
|
15
|
+
steps: [{ id: "dispatch", pipeline, timeout_ms: 1000, retry: { max: 2, delay_ms: 10 } }],
|
|
16
|
+
}));
|
|
17
|
+
try {
|
|
18
|
+
await execFileAsync(process.execPath, [cli, "run", "--mode", "tool", "--file", file], {
|
|
19
|
+
env: { ...process.env, LOBSTER_STATE_DIR: path.join(dir, "state"), ...env },
|
|
20
|
+
timeout: 15_000,
|
|
21
|
+
});
|
|
22
|
+
assert.fail("workflow should fail after dispatch");
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
assert.equal(error.killed, false, "CLI must settle without the test timeout");
|
|
26
|
+
const envelope = JSON.parse(error.stdout);
|
|
27
|
+
assert.equal(envelope.ok, false);
|
|
28
|
+
assert.doesNotMatch(error.stderr, /\[RETRY\]/);
|
|
29
|
+
return envelope.error.message;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (const command of [
|
|
33
|
+
"openclaw.invoke",
|
|
34
|
+
"clawd.invoke",
|
|
35
|
+
"openclaw.invoke --dry-run",
|
|
36
|
+
"openclaw.invoke --dryRun",
|
|
37
|
+
]) {
|
|
38
|
+
for (const failure of ["timeout", "http-error", "downstream-error"]) {
|
|
39
|
+
test(`${command} does not repeat a dispatched tool after ${failure}`, async () => {
|
|
40
|
+
const dir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dispatch-retry-"));
|
|
41
|
+
let hits = 0;
|
|
42
|
+
const server = http.createServer((req, res) => {
|
|
43
|
+
assert.equal(req.method, "POST");
|
|
44
|
+
assert.equal(req.url, "/tools/invoke");
|
|
45
|
+
hits++;
|
|
46
|
+
req.resume();
|
|
47
|
+
if (failure === "http-error")
|
|
48
|
+
res.writeHead(503).end("unavailable after dispatch");
|
|
49
|
+
if (failure === "downstream-error")
|
|
50
|
+
res.end(JSON.stringify({ ok: true, result: "done" }));
|
|
51
|
+
});
|
|
52
|
+
try {
|
|
53
|
+
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
54
|
+
const port = server.address().port;
|
|
55
|
+
const pipeline = `${command} --url http://127.0.0.1:${port} --token= --tool demo --action write` +
|
|
56
|
+
(failure === "downstream-error" ? " | missing.command" : "");
|
|
57
|
+
const message = await runWorkflow(dir, pipeline);
|
|
58
|
+
assert.match(message, failure === "timeout"
|
|
59
|
+
? /timed out/
|
|
60
|
+
: failure === "http-error"
|
|
61
|
+
? /503/
|
|
62
|
+
: /Unknown command/);
|
|
63
|
+
assert.equal(hits, 1, "a failed step must not repeat a potentially completed tool call");
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
server.closeAllConnections();
|
|
67
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
68
|
+
await fsp.rm(dir, { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
for (const failure of ["timeout", "process-error"]) {
|
|
74
|
+
test(`openclaw.agent default process runner dispatches once after ${failure}`, async () => {
|
|
75
|
+
const dir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-agent-retry-"));
|
|
76
|
+
try {
|
|
77
|
+
// Node receives "agent" as its script, exercising the default argv/process runner.
|
|
78
|
+
await fsp.writeFile(path.join(dir, "agent"), `
|
|
79
|
+
const fs = require("node:fs");
|
|
80
|
+
fs.appendFileSync("calls", String(process.pid) + "\\n");
|
|
81
|
+
${failure === "timeout" ? "setInterval(() => {}, 1000);" : 'process.stderr.write("failed after dispatch"); process.exitCode = 1;'}
|
|
82
|
+
`);
|
|
83
|
+
const message = await runWorkflow(dir, 'openclaw.agent --agent test --prompt "synthetic proof"', {
|
|
84
|
+
LOBSTER_OPENCLAW_BIN: process.execPath,
|
|
85
|
+
});
|
|
86
|
+
assert.match(message, failure === "timeout" ? /timed out/ : /failed after dispatch/);
|
|
87
|
+
const pids = (await fsp.readFile(path.join(dir, "calls"), "utf8")).trim().split("\n");
|
|
88
|
+
assert.equal(pids.length, 1, "the default runner must launch only one child");
|
|
89
|
+
assert.throws(() => process.kill(Number(pids[0]), 0), { code: "ESRCH" });
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
await fsp.rm(dir, { recursive: true, force: true });
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=openclaw_dispatch_retry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw_dispatch_retry.test.js","sourceRoot":"","sources":["../../test/openclaw_dispatch_retry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openclaw_invoke_alias.test.js","sourceRoot":"","sources":["../../test/openclaw_invoke_alias.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"openclaw_invoke_alias.test.js","sourceRoot":"","sources":["../../test/openclaw_invoke_alias.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;IAC7D,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,mCAAmC,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel.test.js","sourceRoot":"","sources":["../../test/parallel.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE7E,KAAK,UAAU,WAAW,CAAC,QAAiB;
|
|
1
|
+
{"version":3,"file":"parallel.test.js","sourceRoot":"","sources":["../../test/parallel.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,4 +36,61 @@ test("parsePipeline preserves escaped apostrophes in single-quoted args", () =>
|
|
|
36
36
|
const parsed = JSON.parse(raw);
|
|
37
37
|
assert.equal(parsed.prompt, "don't");
|
|
38
38
|
});
|
|
39
|
+
test("parsePipeline parses inline --key=value arguments", () => {
|
|
40
|
+
const p = parsePipeline("where --field=name --limit=10");
|
|
41
|
+
assert.equal(p.length, 1);
|
|
42
|
+
assert.equal(p[0].args["field"], "name");
|
|
43
|
+
assert.equal(p[0].args["limit"], "10");
|
|
44
|
+
});
|
|
45
|
+
test("parsePipeline keeps an empty inline --key= value as an empty string", () => {
|
|
46
|
+
const p = parsePipeline("cmd --note=");
|
|
47
|
+
assert.equal(p[0].args["note"], "");
|
|
48
|
+
});
|
|
49
|
+
test("parsePipeline treats a trailing --flag as a boolean true", () => {
|
|
50
|
+
const p = parsePipeline("cmd --verbose");
|
|
51
|
+
assert.equal(p[0].args["verbose"], true);
|
|
52
|
+
});
|
|
53
|
+
test("parsePipeline treats --flag followed by another --flag as boolean", () => {
|
|
54
|
+
const p = parsePipeline("cmd --dry-run --out file");
|
|
55
|
+
assert.equal(p[0].args["dry-run"], true);
|
|
56
|
+
assert.equal(p[0].args["out"], "file");
|
|
57
|
+
});
|
|
58
|
+
test("parsePipeline keeps the command after exec --json", () => {
|
|
59
|
+
for (const command of ["cat rows.json", "'echo [1,2,3]'"]) {
|
|
60
|
+
const stage = parsePipeline(`exec --json ${command}`)[0];
|
|
61
|
+
assert.equal(stage.args["json"], true);
|
|
62
|
+
assert.deepEqual(stage.args._, command.startsWith("'") ? ["echo [1,2,3]"] : ["cat", "rows.json"]);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
test("parsePipeline preserves value-taking options beside exec --json", () => {
|
|
66
|
+
const stage = parsePipeline("exec --stdin json --json cat")[0];
|
|
67
|
+
assert.equal(stage.args["stdin"], "json");
|
|
68
|
+
assert.equal(stage.args["json"], true);
|
|
69
|
+
assert.deepEqual(stage.args._, ["cat"]);
|
|
70
|
+
assert.equal(parsePipeline("custom --json payload")[0].args["json"], "payload");
|
|
71
|
+
});
|
|
72
|
+
test("parsePipeline unescapes \\$ and \\` inside double quotes", () => {
|
|
73
|
+
const p = parsePipeline('echo "\\$HOME \\`id\\`"');
|
|
74
|
+
assert.deepEqual(p[0].args._, ["$HOME `id`"]);
|
|
75
|
+
});
|
|
76
|
+
test("parsePipeline joins a backslash-newline line continuation in double quotes", () => {
|
|
77
|
+
const p = parsePipeline('echo "line1\\\nline2"');
|
|
78
|
+
assert.deepEqual(p[0].args._, ["line1line2"]);
|
|
79
|
+
});
|
|
80
|
+
test("parsePipeline tolerates a trailing pipe (no empty final stage)", () => {
|
|
81
|
+
const p = parsePipeline("exec x |");
|
|
82
|
+
assert.equal(p.length, 1);
|
|
83
|
+
assert.equal(p[0].name, "exec");
|
|
84
|
+
});
|
|
85
|
+
test("parsePipeline throws on an empty or whitespace-only pipeline", () => {
|
|
86
|
+
assert.throws(() => parsePipeline(""), /Empty pipeline/);
|
|
87
|
+
assert.throws(() => parsePipeline(" "), /Empty pipeline/);
|
|
88
|
+
});
|
|
89
|
+
test("parsePipeline throws on an empty stage between pipes", () => {
|
|
90
|
+
assert.throws(() => parsePipeline("exec x | | json"), /Empty command stage/);
|
|
91
|
+
});
|
|
92
|
+
test("parsePipeline throws on an unclosed single or double quote", () => {
|
|
93
|
+
assert.throws(() => parsePipeline("exec 'unclosed"), /Unclosed quote/);
|
|
94
|
+
assert.throws(() => parsePipeline('exec "unclosed'), /Unclosed quote/);
|
|
95
|
+
});
|
|
39
96
|
//# sourceMappingURL=parser.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../test/parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../test/parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
6
|
+
import { writeStateJson } from "../src/state/store.js";
|
|
7
|
+
import { loadPipelineResumeState } from "../src/pipeline_resume_state.js";
|
|
8
|
+
function validApprovalState() {
|
|
9
|
+
return {
|
|
10
|
+
pipeline: [{ name: "map", args: {}, raw: "map" }],
|
|
11
|
+
resumeAtIndex: 1,
|
|
12
|
+
items: [{ n: 1 }],
|
|
13
|
+
haltType: "approval_request",
|
|
14
|
+
prompt: "approve?",
|
|
15
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async function loadStored(value) {
|
|
19
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "lobster-pipeline-resume-"));
|
|
20
|
+
const env = { LOBSTER_STATE_DIR: dir };
|
|
21
|
+
try {
|
|
22
|
+
await writeStateJson({ env, key: "resume", value });
|
|
23
|
+
return await loadPipelineResumeState(env, "resume");
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await rm(dir, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
test("loadPipelineResumeState rejects a pipeline stage without a name", async () => {
|
|
30
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), pipeline: [{ args: {}, raw: "map" }] }), /Invalid pipeline resume state/);
|
|
31
|
+
});
|
|
32
|
+
test("loadPipelineResumeState rejects a pipeline stage whose args is an array", async () => {
|
|
33
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), pipeline: [{ name: "map", args: [], raw: "map" }] }), /Invalid pipeline resume state/);
|
|
34
|
+
});
|
|
35
|
+
test("loadPipelineResumeState rejects a resume index past the pipeline length", async () => {
|
|
36
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), resumeAtIndex: 2 }), /Invalid pipeline resume state/);
|
|
37
|
+
});
|
|
38
|
+
test("loadPipelineResumeState rejects a negative resume index", async () => {
|
|
39
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), resumeAtIndex: -1 }), /Invalid pipeline resume state/);
|
|
40
|
+
});
|
|
41
|
+
test("loadPipelineResumeState rejects non-array items", async () => {
|
|
42
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), items: "nope" }), /Invalid pipeline resume state/);
|
|
43
|
+
});
|
|
44
|
+
test("loadPipelineResumeState rejects superseded keys that are not strings", async () => {
|
|
45
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), supersededResumeStateKeys: [1] }), /Invalid pipeline resume state/);
|
|
46
|
+
});
|
|
47
|
+
test("loadPipelineResumeState rejects an unrecognized halt type", async () => {
|
|
48
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), haltType: "other" }), /Invalid pipeline resume state/);
|
|
49
|
+
});
|
|
50
|
+
test("loadPipelineResumeState rejects an unrecognized resume mode", async () => {
|
|
51
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), resumeMode: "sideways" }), /Invalid pipeline resume state/);
|
|
52
|
+
});
|
|
53
|
+
test("loadPipelineResumeState rejects an input request without a schema", async () => {
|
|
54
|
+
await assert.rejects(() => loadStored({
|
|
55
|
+
...validApprovalState(),
|
|
56
|
+
items: [],
|
|
57
|
+
haltType: "input_request",
|
|
58
|
+
resumeMode: "next_stage",
|
|
59
|
+
prompt: "enter",
|
|
60
|
+
}), /Invalid pipeline resume state/);
|
|
61
|
+
});
|
|
62
|
+
test("loadPipelineResumeState rejects command input outside a same-stage input resume", async () => {
|
|
63
|
+
await assert.rejects(() => loadStored({ ...validApprovalState(), commandInput: { history: [] } }), /Invalid pipeline resume state/);
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=pipeline_resume_state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline_resume_state.test.js","sourceRoot":"","sources":["../../test/pipeline_resume_state.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { execFile, spawn, spawnSync } from "node:child_process";
|
|
4
|
+
import { mkdtemp, writeFile, readFile, rm } from "node:fs/promises";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { promisify } from "node:util";
|
|
8
|
+
import { Lobster, exec } from "../src/sdk/index.js";
|
|
9
|
+
import { runAbortableProcess } from "../src/abortable_process.js";
|
|
10
|
+
import { waitForPid } from "./helpers/wait_for_pid.js";
|
|
11
|
+
import { nodeShellFixture } from "./helpers/node_shell_fixture.js";
|
|
12
|
+
const run = promisify(execFile);
|
|
13
|
+
const large = 10 * 1024 * 1024 + 1;
|
|
14
|
+
const cli = path.resolve("bin/lobster.js");
|
|
15
|
+
const quote = (s) => JSON.stringify(s);
|
|
16
|
+
for (const stream of ["stdout", "stderr"]) {
|
|
17
|
+
test(`SDK ${stream} is unlimited by default and honors the opt-in byte limit`, async () => {
|
|
18
|
+
const dir = await mkdtemp(path.join(tmpdir(), "lobster-output-"));
|
|
19
|
+
try {
|
|
20
|
+
const file = path.join(dir, "emit.cjs");
|
|
21
|
+
await writeFile(file, `process.${stream}.write('x'.repeat(${large}));`);
|
|
22
|
+
for (const limit of ["", "1024"]) {
|
|
23
|
+
const result = await new Lobster({
|
|
24
|
+
env: { ...process.env, LOBSTER_MAX_OUTPUT_BYTES: limit },
|
|
25
|
+
})
|
|
26
|
+
.pipe(exec(`${quote(process.execPath)} ${quote(file)}`, { json: false }))
|
|
27
|
+
.run();
|
|
28
|
+
assert.equal(result.ok, limit === "");
|
|
29
|
+
if (limit)
|
|
30
|
+
assert.match(result.error.message, /Process output exceeded 1024 bytes/);
|
|
31
|
+
else
|
|
32
|
+
assert.equal(result.output[0].length, stream === "stdout" ? large : 0);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await rm(dir, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
test("process caps count actual bytes and accept the exact boundary", async () => {
|
|
41
|
+
for (const bytes of [Buffer.from("😀"), Buffer.from([0xff, 0xff, 0xff, 0xff])]) {
|
|
42
|
+
const result = await runAbortableProcess({
|
|
43
|
+
command: process.execPath,
|
|
44
|
+
argv: ["-e", `process.stdout.write(Buffer.from('${bytes.toString("hex")}', 'hex'))`],
|
|
45
|
+
env: { ...process.env, LOBSTER_MAX_OUTPUT_BYTES: "4" },
|
|
46
|
+
notFoundMessage: "node missing",
|
|
47
|
+
});
|
|
48
|
+
assert.equal(result.stdout, bytes.toString("utf8"));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
test("invalid process limits fail before spawning", async () => {
|
|
52
|
+
const dir = await mkdtemp(path.join(tmpdir(), "lobster-invalid-limit-"));
|
|
53
|
+
try {
|
|
54
|
+
const marker = path.join(dir, "started");
|
|
55
|
+
for (const value of ["0", "-1", "1.5", "Infinity", "true", "9007199254740992"]) {
|
|
56
|
+
await assert.rejects(runAbortableProcess({
|
|
57
|
+
command: process.execPath,
|
|
58
|
+
argv: ["-e", `require('node:fs').writeFileSync(${quote(marker)}, 'started')`],
|
|
59
|
+
env: { ...process.env, LOBSTER_MAX_OUTPUT_BYTES: value },
|
|
60
|
+
notFoundMessage: "node missing",
|
|
61
|
+
}), /LOBSTER_MAX_OUTPUT_BYTES must be a positive safe integer/);
|
|
62
|
+
}
|
|
63
|
+
await assert.rejects(readFile(marker), { code: "ENOENT" });
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
await rm(dir, { recursive: true, force: true });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
test("built CLI exec and workflow env preserve unlimited output and enable finite limits", async () => {
|
|
70
|
+
const dir = await mkdtemp(path.join(tmpdir(), "lobster-cli-limit-"));
|
|
71
|
+
try {
|
|
72
|
+
const file = path.join(dir, "emit.cjs");
|
|
73
|
+
await writeFile(file, `process.stdout.write('x'.repeat(${large}));`);
|
|
74
|
+
const command = `${quote(process.execPath)} ${quote(file)}`;
|
|
75
|
+
for (const workflow of [false, true]) {
|
|
76
|
+
for (const limit of ["", "1024"]) {
|
|
77
|
+
const filePath = path.join(dir, "workflow.json");
|
|
78
|
+
await writeFile(filePath, JSON.stringify({
|
|
79
|
+
steps: [{ id: "emit", run: command, env: { LOBSTER_MAX_OUTPUT_BYTES: limit } }],
|
|
80
|
+
}));
|
|
81
|
+
const args = workflow ? ["--file", filePath] : [`exec ${command}`];
|
|
82
|
+
const result = await run(process.execPath, [cli, "run", "--mode", "tool", ...args], {
|
|
83
|
+
env: {
|
|
84
|
+
...process.env,
|
|
85
|
+
LOBSTER_MAX_OUTPUT_BYTES: workflow ? "" : limit,
|
|
86
|
+
LOBSTER_STATE_DIR: path.join(dir, "state"),
|
|
87
|
+
},
|
|
88
|
+
maxBuffer: 20 * 1024 * 1024,
|
|
89
|
+
}).then((r) => ({ code: 0, stdout: r.stdout }), (e) => ({ code: e.code, stdout: e.stdout }));
|
|
90
|
+
const envelope = JSON.parse(result.stdout);
|
|
91
|
+
assert.equal(envelope.ok, limit === "");
|
|
92
|
+
if (limit)
|
|
93
|
+
assert.match(envelope.error.message, /Process output exceeded 1024 bytes/);
|
|
94
|
+
else
|
|
95
|
+
assert.equal(envelope.output[0].length, large);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
await rm(dir, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
function isAlive(pid) {
|
|
104
|
+
const stat = spawnSync("ps", ["-o", "stat=", "-p", String(pid)], {
|
|
105
|
+
encoding: "utf8",
|
|
106
|
+
}).stdout.trim();
|
|
107
|
+
return stat !== "" && !stat.startsWith("Z");
|
|
108
|
+
}
|
|
109
|
+
for (const mode of ["overflow", "interrupt", "host-handler", "once-handler", "host-exit"]) {
|
|
110
|
+
test(`capped no-signal SDK shell cleans its background producer on ${mode}`, { skip: process.platform === "win32", timeout: 15_000 }, async () => {
|
|
111
|
+
const dir = await mkdtemp(path.join(tmpdir(), "lobster-output-tree-"));
|
|
112
|
+
let wrapper;
|
|
113
|
+
let pid;
|
|
114
|
+
try {
|
|
115
|
+
const runner = path.join(dir, "runner.mjs");
|
|
116
|
+
const marker = path.join(dir, "pid"), received = path.join(dir, "signal");
|
|
117
|
+
const fixture = await nodeShellFixture(dir, `const fs=require('node:fs');
|
|
118
|
+
process.on('SIGTERM',()=>{});
|
|
119
|
+
process.on('SIGINT',()=>fs.writeFileSync(${quote(received)}, 'SIGINT'));
|
|
120
|
+
fs.writeFileSync(${quote(marker)},String(process.pid));
|
|
121
|
+
setInterval(()=>{${mode === "overflow" ? "process.stdout.write('x'.repeat(2048));" : ""}},30);`);
|
|
122
|
+
await writeFile(runner, `import {Lobster,exec} from ${quote(new URL("../src/sdk/index.js", import.meta.url).href)};
|
|
123
|
+
${mode === "host-handler" || mode === "once-handler" ? `process.${mode === "once-handler" ? "once" : "on"}('SIGINT',()=>console.log('host handled SIGINT'));` : ""}
|
|
124
|
+
${mode === "host-exit" ? "process.on('SIGUSR2',()=>process.exit(0));" : ""}
|
|
125
|
+
const result=await new Lobster({env:{...process.env,LOBSTER_MAX_OUTPUT_BYTES:'1024'}})
|
|
126
|
+
.pipe(exec(${quote(`${fixture.command} & wait`)},{shell:true,json:false})).run();
|
|
127
|
+
console.log(JSON.stringify(result));`);
|
|
128
|
+
wrapper = spawn(process.execPath, [runner], {
|
|
129
|
+
env: { ...process.env, ...fixture.env },
|
|
130
|
+
detached: true,
|
|
131
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
132
|
+
});
|
|
133
|
+
let stdout = "", stderr = "";
|
|
134
|
+
wrapper.stdout.on("data", (x) => (stdout += x));
|
|
135
|
+
wrapper.stderr.on("data", (x) => (stderr += x));
|
|
136
|
+
const closed = new Promise((resolve) => wrapper.once("close", resolve));
|
|
137
|
+
pid = await waitForPid(marker);
|
|
138
|
+
if (mode === "interrupt" || mode === "host-handler" || mode === "once-handler")
|
|
139
|
+
wrapper.kill("SIGINT");
|
|
140
|
+
if (mode === "host-exit")
|
|
141
|
+
wrapper.kill("SIGUSR2");
|
|
142
|
+
let timer;
|
|
143
|
+
const code = await Promise.race([
|
|
144
|
+
closed,
|
|
145
|
+
new Promise((_, reject) => {
|
|
146
|
+
timer = setTimeout(() => reject(new Error(`wrapper hung: ${stderr}`)), 5000);
|
|
147
|
+
}),
|
|
148
|
+
]).finally(() => clearTimeout(timer));
|
|
149
|
+
assert.equal(code, mode === "interrupt" ? 130 : 0, stderr);
|
|
150
|
+
assert.equal(isAlive(pid), false, "producer must not survive its owner");
|
|
151
|
+
if (mode === "overflow")
|
|
152
|
+
assert.match(stdout, /Process output exceeded 1024 bytes/);
|
|
153
|
+
if (mode === "host-handler" || mode === "once-handler")
|
|
154
|
+
assert.match(stdout, /host handled SIGINT/);
|
|
155
|
+
if (mode === "interrupt" || mode === "host-handler" || mode === "once-handler")
|
|
156
|
+
assert.equal(await readFile(received, "utf8"), "SIGINT");
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
if (pid) {
|
|
160
|
+
try {
|
|
161
|
+
process.kill(pid, "SIGKILL");
|
|
162
|
+
}
|
|
163
|
+
catch { }
|
|
164
|
+
}
|
|
165
|
+
if (wrapper?.pid) {
|
|
166
|
+
try {
|
|
167
|
+
process.kill(-wrapper.pid, "SIGKILL");
|
|
168
|
+
}
|
|
169
|
+
catch { }
|
|
170
|
+
}
|
|
171
|
+
await rm(dir, { recursive: true, force: true });
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=process_output_limit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process_output_limit.test.js","sourceRoot":"","sources":["../../test/process_output_limit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { once } from "node:events";
|
|
5
|
+
import { EventEmitter } from "node:events";
|
|
3
6
|
import { PassThrough } from "node:stream";
|
|
4
7
|
import { readLineFromStream } from "../src/read_line.js";
|
|
5
8
|
test("readLineFromStream resolves on newline", async () => {
|
|
@@ -10,6 +13,48 @@ test("readLineFromStream resolves on newline", async () => {
|
|
|
10
13
|
const value = await promise;
|
|
11
14
|
assert.equal(value, "yes");
|
|
12
15
|
});
|
|
16
|
+
test("readLineFromStream accepts sequential reads from one stream", async () => {
|
|
17
|
+
const input = new PassThrough();
|
|
18
|
+
const first = readLineFromStream(input);
|
|
19
|
+
input.write("yes\n");
|
|
20
|
+
assert.equal(await first, "yes");
|
|
21
|
+
const second = readLineFromStream(input, { timeoutMs: 50 });
|
|
22
|
+
input.write("no\n");
|
|
23
|
+
assert.equal(await second, "no");
|
|
24
|
+
input.end();
|
|
25
|
+
});
|
|
26
|
+
test("readLineFromStream preserves the next line from a combined input chunk", async () => {
|
|
27
|
+
const input = new PassThrough();
|
|
28
|
+
const first = readLineFromStream(input);
|
|
29
|
+
input.end("yes\nno\n");
|
|
30
|
+
assert.equal(await first, "yes");
|
|
31
|
+
assert.equal(await readLineFromStream(input), "no");
|
|
32
|
+
});
|
|
33
|
+
test("readLineFromStream returns buffered input after a child pipe reaches EOF", async () => {
|
|
34
|
+
const child = spawn(process.execPath, ["-e", "process.stdout.write('yes\\npartial')"], {
|
|
35
|
+
stdio: ["ignore", "pipe", "inherit"],
|
|
36
|
+
});
|
|
37
|
+
assert.ok(child.stdout);
|
|
38
|
+
const first = readLineFromStream(child.stdout);
|
|
39
|
+
assert.equal(await first, "yes");
|
|
40
|
+
await once(child, "close");
|
|
41
|
+
assert.equal(await readLineFromStream(child.stdout, { timeoutMs: 50 }), "partial");
|
|
42
|
+
});
|
|
43
|
+
test("readLineFromStream drains a buffer that remains readable after EOF", async () => {
|
|
44
|
+
let buffered = Buffer.from("partial");
|
|
45
|
+
const input = Object.assign(new EventEmitter(), {
|
|
46
|
+
readableEnded: true,
|
|
47
|
+
closed: true,
|
|
48
|
+
read() {
|
|
49
|
+
const value = buffered;
|
|
50
|
+
buffered = null;
|
|
51
|
+
return value;
|
|
52
|
+
},
|
|
53
|
+
pause() { },
|
|
54
|
+
resume() { },
|
|
55
|
+
});
|
|
56
|
+
assert.equal(await readLineFromStream(input), "partial");
|
|
57
|
+
});
|
|
13
58
|
test("readLineFromStream resolves on end without newline", async () => {
|
|
14
59
|
const input = new PassThrough();
|
|
15
60
|
const promise = readLineFromStream(input);
|
|
@@ -22,4 +67,13 @@ test("readLineFromStream times out when no input arrives", async () => {
|
|
|
22
67
|
const input = new PassThrough();
|
|
23
68
|
await assert.rejects(() => readLineFromStream(input, { timeoutMs: 5 }), /Timed out waiting for input/);
|
|
24
69
|
});
|
|
70
|
+
test("readLineFromStream rejects when its signal is aborted", async () => {
|
|
71
|
+
const input = new PassThrough();
|
|
72
|
+
const controller = new AbortController();
|
|
73
|
+
const promise = readLineFromStream(input, { signal: controller.signal });
|
|
74
|
+
controller.abort(new Error("input cancelled"));
|
|
75
|
+
await assert.rejects(() => promise, /input cancelled/);
|
|
76
|
+
assert.equal(input.readableFlowing, false);
|
|
77
|
+
input.end();
|
|
78
|
+
});
|
|
25
79
|
//# sourceMappingURL=read_line.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read_line.test.js","sourceRoot":"","sources":["../../test/read_line.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"read_line.test.js","sourceRoot":"","sources":["../../test/read_line.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { parse } from "yaml";
|
|
8
|
+
test("release workflow validates dated and undated changelog sections", () => {
|
|
9
|
+
const workflow = parse(readFileSync(".github/workflows/lobster-npm-release.yml", "utf8"));
|
|
10
|
+
const directory = mkdtempSync(path.join(tmpdir(), "lobster-release-changelog-"));
|
|
11
|
+
try {
|
|
12
|
+
for (const jobName of ["preflight_lobster_npm", "publish_lobster_npm"]) {
|
|
13
|
+
const step = workflow.jobs[jobName].steps.find((entry) => entry.name === "Validate changelog entry for release version");
|
|
14
|
+
assert.ok(step, jobName);
|
|
15
|
+
const script = step.run.match(/node - <<'NODE'\n([\s\S]*?)\nNODE/);
|
|
16
|
+
assert.ok(script, `${jobName} Node validator`);
|
|
17
|
+
for (const [changelog, expected] of [
|
|
18
|
+
["## 2026.9.7 - 2026-09-07\n\n- A fix.\n", 0],
|
|
19
|
+
["## 2026.9.7\n\n- A fix.\n", 0],
|
|
20
|
+
["## 2026.9.70 - 2026-09-07\n\n- Another version.\n", 1],
|
|
21
|
+
["## 2026.9.7 - 2026-09-07\n\n## 2026.9.5\n\n- An older fix.\n", 1],
|
|
22
|
+
]) {
|
|
23
|
+
writeFileSync(path.join(directory, "CHANGELOG.md"), changelog);
|
|
24
|
+
const result = spawnSync(process.execPath, ["-"], {
|
|
25
|
+
input: script[1],
|
|
26
|
+
cwd: directory,
|
|
27
|
+
env: { PATH: process.env.PATH, TMPDIR: process.env.TMPDIR, RELEASE_TAG: "v2026.9.7" },
|
|
28
|
+
encoding: "utf8",
|
|
29
|
+
timeout: 10_000,
|
|
30
|
+
});
|
|
31
|
+
assert.equal(result.status, expected, `${jobName}: ${result.stderr}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
rmSync(directory, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=release_changelog.test.js.map
|