@runweave/server-linux-x64 0.1.23 → 0.1.25
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/manifest.json +231 -226
- package/native.tar.gz +0 -0
- package/package.json +1 -1
- package/payload/app-server/build-info.json +4 -4
- package/payload/app-server/index.cjs +46 -25
- package/payload/app-server/index.cjs.map +1 -1
- package/payload/backend/activity-sqlite-worker.cjs +33 -21
- package/payload/backend/build-info.json +4 -4
- package/payload/backend/dev-resources/control.cjs +158 -59
- package/payload/backend/index.cjs +3512 -2764
- package/payload/backend/scheduled-tasks-sqlite-worker.cjs +12 -0
- package/payload/frontend/dist/assets/{_baseUniq-V9OGBCCp.js → _baseUniq-pNlq_DCQ.js} +1 -1
- package/payload/frontend/dist/assets/{access-Bw9yaM2u.js → access-BJmFgyT9.js} +1 -1
- package/payload/frontend/dist/assets/{advanced-BspSUvyf.js → advanced-B1_D3p4w.js} +1 -1
- package/payload/frontend/dist/assets/{appearance-BHYR2QUj.js → appearance-CSQVEVTh.js} +1 -1
- package/payload/frontend/dist/assets/{arc-C4bVuMy6.js → arc-DE1dO7p3.js} +1 -1
- package/payload/frontend/dist/assets/{architectureDiagram-Q4EWVU46-B_EOBe6n.js → architectureDiagram-Q4EWVU46-QKJomhdt.js} +1 -1
- package/payload/frontend/dist/assets/{blockDiagram-DXYQGD6D-aAkbmNO9.js → blockDiagram-DXYQGD6D-CV58X8VO.js} +1 -1
- package/payload/frontend/dist/assets/{c4Diagram-AHTNJAMY-DKeUolGU.js → c4Diagram-AHTNJAMY-DPu-RnDw.js} +1 -1
- package/payload/frontend/dist/assets/channel-DWLRGtq3.js +1 -0
- package/payload/frontend/dist/assets/{chunk-4BX2VUAB-cB5sH0Mw.js → chunk-4BX2VUAB-COwHdW0x.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-4TB4RGXK-CxVRfINM.js → chunk-4TB4RGXK-StHcdOx9.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-55IACEB6-BFRLEEBY.js → chunk-55IACEB6-D7PMYZ35.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-EDXVE4YY-DA5BuoT3.js → chunk-EDXVE4YY-D84apqdf.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-FMBD7UC4-DIvA96Y1.js → chunk-FMBD7UC4-CJmwcVvj.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-OYMX7WX6-8Zl-vtJp.js → chunk-OYMX7WX6-DQhh6xQp.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-QZHKN3VN-DnW4X6Wx.js → chunk-QZHKN3VN-C6X5cUuc.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-YZCP3GAM-CH4YkXv-.js → chunk-YZCP3GAM-CryVThNG.js} +1 -1
- package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-B2WrDPFz.js +1 -0
- package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-B2WrDPFz.js +1 -0
- package/payload/frontend/dist/assets/clone-BJQLpgjC.js +1 -0
- package/payload/frontend/dist/assets/{connection-CINMNAPm.js → connection-425RE3U4.js} +1 -1
- package/payload/frontend/dist/assets/{connections-DsHGQRR2.js → connections-Dx05bPzL.js} +1 -1
- package/payload/frontend/dist/assets/{cose-bilkent-S5V4N54A-Dm1QOjDr.js → cose-bilkent-S5V4N54A-DqICEhiJ.js} +1 -1
- package/payload/frontend/dist/assets/{dagre-KV5264BT-BEbPPDoW.js → dagre-KV5264BT-SyIBcIz3.js} +1 -1
- package/payload/frontend/dist/assets/{desktop-1jdcRQ7b.js → desktop-DBzea7Bt.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-5BDNPKRD-C-DmBIhV.js → diagram-5BDNPKRD-xS_FVHQR.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-G4DWMVQ6-Ddv6Kw2_.js → diagram-G4DWMVQ6-CLuycLkG.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-MMDJMWI5-Xae79J8R.js → diagram-MMDJMWI5-BTNd9OzE.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-TYMM5635-CavrGRG2.js → diagram-TYMM5635-DyxLhyoy.js} +1 -1
- package/payload/frontend/dist/assets/{erDiagram-SMLLAGMA-BRRD8F-e.js → erDiagram-SMLLAGMA-C2a9uz8_.js} +1 -1
- package/payload/frontend/dist/assets/{flowDiagram-DWJPFMVM-C-ewssi0.js → flowDiagram-DWJPFMVM-DndbO3ER.js} +1 -1
- package/payload/frontend/dist/assets/{ganttDiagram-T4ZO3ILL-BcZnXV6L.js → ganttDiagram-T4ZO3ILL-BSV1btDD.js} +1 -1
- package/payload/frontend/dist/assets/{gitGraphDiagram-UUTBAWPF-ZcfWVMGG.js → gitGraphDiagram-UUTBAWPF-DnYc3Xm2.js} +1 -1
- package/payload/frontend/dist/assets/{graph-DRJG1bKF.js → graph-iOswNacw.js} +1 -1
- package/payload/frontend/dist/assets/{image-GQYH_1h4.js → image-BaXi5ATy.js} +1 -1
- package/payload/frontend/dist/assets/index-BRwhFF-d.js +1258 -0
- package/payload/frontend/dist/assets/{infoDiagram-42DDH7IO-BWsoBaYn.js → infoDiagram-42DDH7IO-BoWdmtBx.js} +1 -1
- package/payload/frontend/dist/assets/{ishikawaDiagram-UXIWVN3A-C3ayGr4G.js → ishikawaDiagram-UXIWVN3A-B8KC_SgA.js} +1 -1
- package/payload/frontend/dist/assets/{journeyDiagram-VCZTEJTY-DB1DxZ1v.js → journeyDiagram-VCZTEJTY-CN_MxT78.js} +1 -1
- package/payload/frontend/dist/assets/{kanban-definition-6JOO6SKY-CtZWN0CK.js → kanban-definition-6JOO6SKY-j17QaQ4r.js} +1 -1
- package/payload/frontend/dist/assets/{layout-KX5XwX_6.js → layout-CLR2o63S.js} +1 -1
- package/payload/frontend/dist/assets/{linear-DMZrhooi.js → linear-CL0d3XrR.js} +1 -1
- package/payload/frontend/dist/assets/main-BO-hQK7n.css +33 -0
- package/payload/frontend/dist/assets/{main-LH8ULGFT.js → main-DWkxAGaw.js} +142 -142
- package/payload/frontend/dist/assets/{min-CWc1cxEQ.js → min-2aYi0G6U.js} +1 -1
- package/payload/frontend/dist/assets/{mindmap-definition-QFDTVHPH-tj_8hDDH.js → mindmap-definition-QFDTVHPH-CxVQlE5J.js} +1 -1
- package/payload/frontend/dist/assets/{monitoring-BaUd-PhH.js → monitoring-GwSez8fI.js} +1 -1
- package/payload/frontend/dist/assets/{notifications-CTv1WVBh.js → notifications-Bx24ROH2.js} +1 -1
- package/payload/frontend/dist/assets/{pieDiagram-DEJITSTG-Cwc4Gfp4.js → pieDiagram-DEJITSTG-CpRHmWOC.js} +1 -1
- package/payload/frontend/dist/assets/{quadrantDiagram-34T5L4WZ-Clq2RqDJ.js → quadrantDiagram-34T5L4WZ-CZG_QGX1.js} +1 -1
- package/payload/frontend/dist/assets/{record-content-DQ0F1zbW.js → record-content-Di3pmXSa.js} +1 -1
- package/payload/frontend/dist/assets/{requirementDiagram-MS252O5E-gaTHj3JP.js → requirementDiagram-MS252O5E-C1PCFhMe.js} +1 -1
- package/payload/frontend/dist/assets/{sankeyDiagram-XADWPNL6-CyBolt3D.js → sankeyDiagram-XADWPNL6-RxkobNrx.js} +1 -1
- package/payload/frontend/dist/assets/{sequenceDiagram-FGHM5R23-CO4UgRHw.js → sequenceDiagram-FGHM5R23-Bem61Ef-.js} +1 -1
- package/payload/frontend/dist/assets/{stateDiagram-FHFEXIEX-ygBwN1Az.js → stateDiagram-FHFEXIEX-DaHV-La3.js} +1 -1
- package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-VVMK0Gty.js +1 -0
- package/payload/frontend/dist/assets/{status-BOcUUbE9.js → status-DytAqsKi.js} +1 -1
- package/payload/frontend/dist/assets/suiji-ClmlHdOg.js +1 -0
- package/payload/frontend/dist/assets/{svg-BfkbqvDT.js → svg-BNFCoAlV.js} +1 -1
- package/payload/frontend/dist/assets/{tabs-88TVAJwX.js → tabs-CNVBHmw-.js} +1 -1
- package/payload/frontend/dist/assets/{timeline-definition-GMOUNBTQ-8Iy3eg4l.js → timeline-definition-GMOUNBTQ-xVCcgT05.js} +1 -1
- package/payload/frontend/dist/assets/{vennDiagram-DHZGUBPP-DLcttV2t.js → vennDiagram-DHZGUBPP-D4YvcLlt.js} +1 -1
- package/payload/frontend/dist/assets/{wardley-RL74JXVD-DUvr0OYP.js → wardley-RL74JXVD-WtdSbuj2.js} +1 -1
- package/payload/frontend/dist/assets/{wardleyDiagram-NUSXRM2D-Dm-sdRY6.js → wardleyDiagram-NUSXRM2D-Br4RBb8X.js} +1 -1
- package/payload/frontend/dist/assets/{xychartDiagram-5P7HB3ND-DR_MOYh1.js → xychartDiagram-5P7HB3ND-Dx8RJOfi.js} +1 -1
- package/payload/frontend/dist/build-info.json +4 -4
- package/payload/frontend/dist/companion.html +1 -1
- package/payload/frontend/dist/index.html +3 -3
- package/payload/plugins/toolkit/.codex-plugin/plugin.json +1 -1
- package/payload/plugins/toolkit/README.md +3 -3
- package/payload/plugins/toolkit/skills/acceptance/SKILL.md +4 -2
- package/payload/plugins/toolkit/skills/acceptance/references/delivery.md +11 -1
- package/payload/plugins/toolkit/skills/acceptance/references/gallery-contract.md +62 -39
- package/payload/plugins/toolkit/skills/acceptance/references/gallery-copy.md +8 -0
- package/payload/plugins/toolkit/skills/acceptance/scripts/delivery_check.py +151 -0
- package/payload/plugins/toolkit/skills/acceptance/scripts/gallery.py +67 -11
- package/payload/plugins/toolkit/skills/acceptance/scripts/preview.py +21 -2
- package/payload/plugins/toolkit/skills/acceptance/templates/reader.css +1 -14
- package/payload/plugins/toolkit/skills/acceptance/templates/reader.html +23 -4
- package/payload/plugins/toolkit/skills/acceptance/templates/reader.js +76 -3
- package/payload/plugins/toolkit/skills/acceptance/templates/report.css +80 -0
- package/payload/plugins/toolkit/skills/architecture-flow-prototyping/SKILL.md +2 -2
- package/payload/plugins/toolkit/skills/playwright-cli/SKILL.md +19 -6
- package/payload/plugins/toolkit/skills/review-only/SKILL.md +29 -4
- package/payload/plugins/toolkit/skills/review-only/references/delivery-verification.md +38 -0
- package/payload/plugins/toolkit/skills/using-rw/SKILL.md +37 -1
- package/payload/plugins/toolkit/skills/visual-plan-review/SKILL.md +45 -0
- package/payload/plugins/toolkit/skills/visual-plan-review/agents/openai.yaml +3 -0
- package/payload/plugins/toolkit/skills/visual-plan-review/references/review-checklist.md +13 -0
- package/payload/plugins/toolkit/skills/visual-plan-review/references/visual-plan-template.html +8 -0
- package/payload/plugins/toolkit-release.json +1 -1
- package/payload/pty-host/index.cjs +217 -41
- package/payload/server/index.cjs +40 -20
- package/payload/frontend/dist/assets/channel-CBjt7igT.js +0 -1
- package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-HmoWChAG.js +0 -1
- package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-HmoWChAG.js +0 -1
- package/payload/frontend/dist/assets/clone-CiD5LYOe.js +0 -1
- package/payload/frontend/dist/assets/index-UR7g5PLZ.js +0 -448
- package/payload/frontend/dist/assets/main-D4_uoZQa.css +0 -33
- package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-DTtHtWkN.js +0 -1
- package/payload/frontend/dist/assets/suiji-DPDKlWVi.js +0 -1
- package/payload/plugins/toolkit/skills/prototype-first-development/SKILL.md +0 -134
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/README.md +0 -88
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/app.js +0 -145
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/index.html +0 -229
- package/payload/plugins/toolkit/skills/prototype-first-development/references/html-prototype-template/mock-state.json +0 -60
- package/payload/plugins/toolkit/skills/prototype-first-development/references/implementation-plan-handoff-template.md +0 -61
- package/payload/plugins/toolkit/skills/prototype-first-development/references/prototype-workflow-checklist.md +0 -64
|
@@ -14607,9 +14607,9 @@ var import_node_fs = require("node:fs");
|
|
|
14607
14607
|
|
|
14608
14608
|
// packages/config-node/src/windows-permissions.ts
|
|
14609
14609
|
var import_node_child_process = require("node:child_process");
|
|
14610
|
-
|
|
14611
|
-
|
|
14612
|
-
|
|
14610
|
+
var import_node_util = require("node:util");
|
|
14611
|
+
var executeFile = (0, import_node_util.promisify)(import_node_child_process.execFile);
|
|
14612
|
+
var script = `
|
|
14613
14613
|
$ErrorActionPreference = 'Stop'
|
|
14614
14614
|
try {
|
|
14615
14615
|
# Use .NET directly: a parent pwsh may export a PSModulePath incompatible with Windows PowerShell.
|
|
@@ -14627,6 +14627,27 @@ foreach ($rule in $acl.GetAccessRules($true, $true, [Security.Principal.Security
|
|
|
14627
14627
|
[Console]::Write('check-failed:' + $_.Exception.GetType().FullName + ':' + $_.Exception.HResult)
|
|
14628
14628
|
}
|
|
14629
14629
|
`;
|
|
14630
|
+
function checkFailure(file, startedAt, cause) {
|
|
14631
|
+
const error = cause;
|
|
14632
|
+
const timedOut = error.code === "ETIMEDOUT" || error.killed === true && error.signal === "SIGTERM" && error.code == null;
|
|
14633
|
+
return new ConfigurationError(
|
|
14634
|
+
timedOut ? "CONFIG_WINDOWS_ACL_CHECK_TIMEOUT" : "CONFIG_WINDOWS_ACL_CHECK_FAILED",
|
|
14635
|
+
[
|
|
14636
|
+
file,
|
|
14637
|
+
`exit=${error.status ?? "none"}`,
|
|
14638
|
+
`signal=${error.signal ?? "none"}`,
|
|
14639
|
+
`code=${error.code ?? "none"}`,
|
|
14640
|
+
`elapsedMs=${Math.round(performance.now() - startedAt)}`
|
|
14641
|
+
]
|
|
14642
|
+
);
|
|
14643
|
+
}
|
|
14644
|
+
function assertResult(file, result) {
|
|
14645
|
+
if (result === "owner" || result === "access") throw new ConfigurationError("CONFIG_WINDOWS_ACL_NOT_PRIVATE", [file, result]);
|
|
14646
|
+
if (/^check-failed:[A-Za-z0-9_.]+:-?\d+$/.test(result)) throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, result]);
|
|
14647
|
+
if (result !== "private") throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, "invalid-result"]);
|
|
14648
|
+
}
|
|
14649
|
+
function assertWindowsPrivatePath(file) {
|
|
14650
|
+
if (process.platform !== "win32") return;
|
|
14630
14651
|
const startedAt = performance.now();
|
|
14631
14652
|
let result;
|
|
14632
14653
|
try {
|
|
@@ -14639,34 +14660,31 @@ foreach ($rule in $acl.GetAccessRules($true, $true, [Security.Principal.Security
|
|
|
14639
14660
|
windowsHide: true
|
|
14640
14661
|
}).trim();
|
|
14641
14662
|
} catch (cause) {
|
|
14642
|
-
|
|
14643
|
-
throw new ConfigurationError(
|
|
14644
|
-
error.code === "ETIMEDOUT" ? "CONFIG_WINDOWS_ACL_CHECK_TIMEOUT" : "CONFIG_WINDOWS_ACL_CHECK_FAILED",
|
|
14645
|
-
[
|
|
14646
|
-
file,
|
|
14647
|
-
`exit=${error.status ?? "none"}`,
|
|
14648
|
-
`signal=${error.signal ?? "none"}`,
|
|
14649
|
-
`code=${error.code ?? "none"}`,
|
|
14650
|
-
`elapsedMs=${Math.round(performance.now() - startedAt)}`
|
|
14651
|
-
]
|
|
14652
|
-
);
|
|
14663
|
+
throw checkFailure(file, startedAt, cause);
|
|
14653
14664
|
}
|
|
14654
|
-
|
|
14655
|
-
if (/^check-failed:[A-Za-z0-9_.]+:-?\d+$/.test(result)) throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, result]);
|
|
14656
|
-
if (result !== "private") throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, "invalid-result"]);
|
|
14665
|
+
assertResult(file, result);
|
|
14657
14666
|
}
|
|
14658
14667
|
|
|
14659
14668
|
// packages/config-node/src/private-file.ts
|
|
14660
|
-
function
|
|
14669
|
+
function privateDirectoryStat(directory) {
|
|
14661
14670
|
const stat = (0, import_node_fs.lstatSync)(directory);
|
|
14662
14671
|
if (!stat.isDirectory() || stat.isSymbolicLink() || process.platform !== "win32" && stat.mode & 63 || typeof process.getuid === "function" && stat.uid !== process.getuid()) throw new ConfigurationError("CONFIG_ROOT_PERMISSIONS_INVALID");
|
|
14663
|
-
|
|
14672
|
+
return stat;
|
|
14664
14673
|
}
|
|
14665
|
-
function
|
|
14674
|
+
function privateDescriptorStat(fd, maxBytes) {
|
|
14666
14675
|
const stat = (0, import_node_fs.fstatSync)(fd);
|
|
14667
14676
|
if (!stat.isFile() || stat.nlink !== 1) throw new ConfigurationError("CONFIG_FILE_NOT_PRIVATE_REGULAR");
|
|
14668
14677
|
if (typeof process.getuid === "function" && stat.uid !== process.getuid()) throw new ConfigurationError("CONFIG_FILE_OWNER_MISMATCH");
|
|
14669
14678
|
if (process.platform !== "win32" && stat.mode & 63) throw new ConfigurationError("CONFIG_FILE_PERMISSIONS_INVALID");
|
|
14679
|
+
if (stat.size > maxBytes) throw new ConfigurationError("CONFIG_FILE_TOO_LARGE");
|
|
14680
|
+
return stat;
|
|
14681
|
+
}
|
|
14682
|
+
function assertPrivateDirectory(directory) {
|
|
14683
|
+
privateDirectoryStat(directory);
|
|
14684
|
+
assertWindowsPrivatePath(directory);
|
|
14685
|
+
}
|
|
14686
|
+
function assertPrivateDescriptor(fd, maxBytes = 1024 * 1024, file) {
|
|
14687
|
+
const stat = privateDescriptorStat(fd, Infinity);
|
|
14670
14688
|
if (process.platform === "win32") {
|
|
14671
14689
|
if (!file) throw new ConfigurationError("CONFIG_PRIVATE_PATH_REQUIRED");
|
|
14672
14690
|
assertWindowsPrivatePath(file);
|
|
@@ -14699,6 +14717,8 @@ function canonicalPath(value) {
|
|
|
14699
14717
|
// packages/config-node/src/platform.ts
|
|
14700
14718
|
var import_node_child_process2 = require("node:child_process");
|
|
14701
14719
|
var import_node_fs3 = require("node:fs");
|
|
14720
|
+
var import_node_util2 = require("node:util");
|
|
14721
|
+
var executeFile2 = (0, import_node_util2.promisify)(import_node_child_process2.execFile);
|
|
14702
14722
|
function processStartIdentity(pid) {
|
|
14703
14723
|
if (!Number.isSafeInteger(pid) || pid < 1) return null;
|
|
14704
14724
|
try {
|
|
@@ -19298,6 +19318,33 @@ function isInteractiveShellLaunch(launch2) {
|
|
|
19298
19318
|
|
|
19299
19319
|
// packages/pty-host/src/input-operations.ts
|
|
19300
19320
|
var import_node_crypto4 = require("node:crypto");
|
|
19321
|
+
|
|
19322
|
+
// packages/shared/src/terminal/runtime/responses.ts
|
|
19323
|
+
var ESCAPE = "\\u001b";
|
|
19324
|
+
var BELL = "\\u0007";
|
|
19325
|
+
var OSC_COLOR_RESPONSE_PATTERN = new RegExp(
|
|
19326
|
+
`${ESCAPE}\\]1[01];rgb:[0-9a-f/]+(?:${BELL}|${ESCAPE}\\\\)`,
|
|
19327
|
+
"i"
|
|
19328
|
+
);
|
|
19329
|
+
var DECRPM_RESPONSE_PATTERN = new RegExp(`${ESCAPE}\\[\\?[0-9;]+\\$y`);
|
|
19330
|
+
var DCS_RESPONSE_PATTERN = new RegExp(`${ESCAPE}P[01]\\$r.*${ESCAPE}\\\\`);
|
|
19331
|
+
var CURSOR_POSITION_RESPONSE_PATTERN = new RegExp(`${ESCAPE}\\[[0-9;]+R`);
|
|
19332
|
+
var DEVICE_ATTRIBUTES_RESPONSE_PATTERN = new RegExp(
|
|
19333
|
+
`${ESCAPE}\\[(?:\\?|>)[0-9;]+c`
|
|
19334
|
+
);
|
|
19335
|
+
var FOCUS_REPORTING_RESPONSE_PATTERN = new RegExp(`${ESCAPE}\\[(?:I|O)$`);
|
|
19336
|
+
var QUERY_RESPONSE_PATTERN = new RegExp(
|
|
19337
|
+
`^(?:${OSC_COLOR_RESPONSE_PATTERN.source}|${DECRPM_RESPONSE_PATTERN.source}|${DCS_RESPONSE_PATTERN.source}|${CURSOR_POSITION_RESPONSE_PATTERN.source}|${DEVICE_ATTRIBUTES_RESPONSE_PATTERN.source})+$`,
|
|
19338
|
+
"i"
|
|
19339
|
+
);
|
|
19340
|
+
function isTerminalQueryResponse(data) {
|
|
19341
|
+
return data.startsWith("\x1B") && QUERY_RESPONSE_PATTERN.test(data);
|
|
19342
|
+
}
|
|
19343
|
+
|
|
19344
|
+
// packages/shared/src/terminal/runtime/input.ts
|
|
19345
|
+
var TERMINAL_CLIPBOARD_FILE_MAX_BYTES = 100 * 1024 * 1024;
|
|
19346
|
+
|
|
19347
|
+
// packages/pty-host/src/input-operations.ts
|
|
19301
19348
|
var InputOperations = class {
|
|
19302
19349
|
constructor(write, isRunning, generation = () => 0) {
|
|
19303
19350
|
this.write = write;
|
|
@@ -19363,8 +19410,9 @@ var InputOperations = class {
|
|
|
19363
19410
|
for (const step of input.steps) {
|
|
19364
19411
|
if (acceptedGeneration !== this.generation()) throw new Error("HOST_PROCESS_CHANGED");
|
|
19365
19412
|
if (!this.isRunning()) throw new Error("HOST_SESSION_GONE");
|
|
19366
|
-
if (step.type === "text")
|
|
19367
|
-
|
|
19413
|
+
if (step.type === "text") {
|
|
19414
|
+
if (rawSequence === Infinity || !isTerminalQueryResponse(step.data)) this.write(step.data);
|
|
19415
|
+
} else await new Promise((resolve) => setTimeout(resolve, step.ms));
|
|
19368
19416
|
}
|
|
19369
19417
|
if (acceptedGeneration !== this.generation()) throw new Error("HOST_PROCESS_CHANGED");
|
|
19370
19418
|
operation.result.state = "written";
|
|
@@ -19482,6 +19530,11 @@ var TerminalOutputRecoveryBuffer = class {
|
|
|
19482
19530
|
readInitial() {
|
|
19483
19531
|
return this.read({ streamId: this.streamId, offset: 0 });
|
|
19484
19532
|
}
|
|
19533
|
+
/** Raw retained history for recording, not a complete renderer bootstrap. */
|
|
19534
|
+
retainedFrames() {
|
|
19535
|
+
this.prune(this.now());
|
|
19536
|
+
return Array.from(this.frames.values(), ({ data, range }) => ({ data, range }));
|
|
19537
|
+
}
|
|
19485
19538
|
prune(now) {
|
|
19486
19539
|
for (const [offset, frame] of this.frames) {
|
|
19487
19540
|
const expired = now - frame.createdAt > RESUME_WINDOW_MS;
|
|
@@ -19661,9 +19714,11 @@ function serializeOutputScreen(terminal, addon, scrollback = 0) {
|
|
|
19661
19714
|
}
|
|
19662
19715
|
|
|
19663
19716
|
// packages/pty-host/src/output-screen.ts
|
|
19717
|
+
var MAX_QUEUED_OPERATIONS = 8192;
|
|
19664
19718
|
var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
19665
|
-
constructor(cursor, onFailure, scrollback = 0) {
|
|
19719
|
+
constructor(cursor, onFailure, scrollback = 0, onResponse, onBackpressure) {
|
|
19666
19720
|
this.onFailure = onFailure;
|
|
19721
|
+
this.onBackpressure = onBackpressure;
|
|
19667
19722
|
this.cursor = cursor;
|
|
19668
19723
|
this.terminal = new import_headless.default.Terminal({
|
|
19669
19724
|
cols: 80,
|
|
@@ -19674,6 +19729,7 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19674
19729
|
this.terminal.loadAddon(this.serializer);
|
|
19675
19730
|
this.terminal.loadAddon(new import_addon_unicode11.default.Unicode11Addon());
|
|
19676
19731
|
this.terminal.unicode.activeVersion = "11";
|
|
19732
|
+
if (onResponse) this.terminal.onData(onResponse);
|
|
19677
19733
|
}
|
|
19678
19734
|
static pendingSnapshots = 0;
|
|
19679
19735
|
terminal;
|
|
@@ -19683,6 +19739,7 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19683
19739
|
writing = false;
|
|
19684
19740
|
partialControlBytes = 0;
|
|
19685
19741
|
disposed = false;
|
|
19742
|
+
backpressured = false;
|
|
19686
19743
|
cursor;
|
|
19687
19744
|
snapshotFlight;
|
|
19688
19745
|
completeSnapshot;
|
|
@@ -19690,7 +19747,7 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19690
19747
|
append(frame) {
|
|
19691
19748
|
if (this.disposed) return;
|
|
19692
19749
|
this.pendingBytes += frame.range.toOffset - frame.range.fromOffset;
|
|
19693
|
-
if (this.pendingBytes > RESUME_MAX_BYTES || this.queue.length >=
|
|
19750
|
+
if (this.pendingBytes > RESUME_MAX_BYTES || this.queue.length >= MAX_QUEUED_OPERATIONS) {
|
|
19694
19751
|
const failure = {
|
|
19695
19752
|
code: this.pendingBytes > RESUME_MAX_BYTES ? "HOST_MIRROR_PENDING_LIMIT" : "HOST_MIRROR_QUEUE_LIMIT",
|
|
19696
19753
|
bufferedBytes: this.pendingBytes,
|
|
@@ -19702,6 +19759,7 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19702
19759
|
return;
|
|
19703
19760
|
}
|
|
19704
19761
|
this.queue.push({ frame });
|
|
19762
|
+
this.updateBackpressure();
|
|
19705
19763
|
this.drain();
|
|
19706
19764
|
}
|
|
19707
19765
|
resize(cols, rows) {
|
|
@@ -19711,9 +19769,10 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19711
19769
|
"Terminal size must be within 2..500 columns and 1..200 rows"
|
|
19712
19770
|
);
|
|
19713
19771
|
}
|
|
19714
|
-
if (this.queue.length >=
|
|
19772
|
+
if (this.queue.length >= MAX_QUEUED_OPERATIONS)
|
|
19715
19773
|
throw new Error("Terminal resize queue is full");
|
|
19716
19774
|
this.queue.push({ cols, rows });
|
|
19775
|
+
this.updateBackpressure();
|
|
19717
19776
|
this.drain();
|
|
19718
19777
|
}
|
|
19719
19778
|
snapshot() {
|
|
@@ -19747,6 +19806,7 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19747
19806
|
throw new Error("Terminal snapshot exceeds 512 KiB");
|
|
19748
19807
|
resolve({
|
|
19749
19808
|
data,
|
|
19809
|
+
modes: { bracketedPasteMode: this.terminal.modes.bracketedPasteMode },
|
|
19750
19810
|
cursor: { ...this.cursor },
|
|
19751
19811
|
cols: this.terminal.cols,
|
|
19752
19812
|
rows: this.terminal.rows
|
|
@@ -19781,8 +19841,16 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19781
19841
|
this.rejectSnapshot?.(new Error("Terminal mirror disposed"));
|
|
19782
19842
|
this.queue = [];
|
|
19783
19843
|
this.pendingBytes = 0;
|
|
19844
|
+
this.updateBackpressure();
|
|
19784
19845
|
this.terminal.dispose();
|
|
19785
19846
|
}
|
|
19847
|
+
updateBackpressure() {
|
|
19848
|
+
const divisor = this.backpressured ? 4 : 2;
|
|
19849
|
+
const paused = !this.disposed && (this.pendingBytes >= RESUME_MAX_BYTES / divisor || this.queue.length >= MAX_QUEUED_OPERATIONS / divisor);
|
|
19850
|
+
if (paused === this.backpressured) return;
|
|
19851
|
+
this.backpressured = paused;
|
|
19852
|
+
this.onBackpressure?.(paused);
|
|
19853
|
+
}
|
|
19786
19854
|
drain() {
|
|
19787
19855
|
if (this.writing || this.disposed) return;
|
|
19788
19856
|
while (this.queue.length) {
|
|
@@ -19796,6 +19864,7 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19796
19864
|
this.terminal.write(frame.data, () => {
|
|
19797
19865
|
if (this.disposed) return;
|
|
19798
19866
|
this.pendingBytes -= frame.range.toOffset - frame.range.fromOffset;
|
|
19867
|
+
this.updateBackpressure();
|
|
19799
19868
|
this.cursor = {
|
|
19800
19869
|
streamId: frame.range.streamId,
|
|
19801
19870
|
offset: frame.range.toOffset
|
|
@@ -19818,6 +19887,7 @@ var TerminalOutputScreen = class _TerminalOutputScreen {
|
|
|
19818
19887
|
});
|
|
19819
19888
|
return;
|
|
19820
19889
|
}
|
|
19890
|
+
this.updateBackpressure();
|
|
19821
19891
|
this.completeSnapshot?.();
|
|
19822
19892
|
}
|
|
19823
19893
|
};
|
|
@@ -19892,7 +19962,9 @@ var HostSession = class {
|
|
|
19892
19962
|
terminalSessionId: options.terminalSessionId,
|
|
19893
19963
|
...failure
|
|
19894
19964
|
});
|
|
19895
|
-
}, TERMINAL_CLIENT_SCROLLBACK_LINES)
|
|
19965
|
+
}, TERMINAL_CLIENT_SCROLLBACK_LINES, (data) => {
|
|
19966
|
+
if (!this.nativeClosing && this.info.status === "running") this.terminal?.write(data);
|
|
19967
|
+
}, (paused) => this.setOutputPaused(paused));
|
|
19896
19968
|
this.screen.resize(options.cols, options.rows);
|
|
19897
19969
|
this.inputs = new InputOperations((data) => this.terminal.write(data), () => this.info.status === "running", () => this.processGeneration);
|
|
19898
19970
|
try {
|
|
@@ -19919,6 +19991,8 @@ var HostSession = class {
|
|
|
19919
19991
|
terminal;
|
|
19920
19992
|
fallbackActivated = false;
|
|
19921
19993
|
closing = false;
|
|
19994
|
+
nativeClosing = false;
|
|
19995
|
+
outputPaused = false;
|
|
19922
19996
|
processGeneration = 0;
|
|
19923
19997
|
startupDeadline = 0;
|
|
19924
19998
|
emitOutput(data) {
|
|
@@ -19942,11 +20016,13 @@ var HostSession = class {
|
|
|
19942
20016
|
cols: this.info.cols,
|
|
19943
20017
|
rows: this.info.rows,
|
|
19944
20018
|
cwd: this.options.cwd,
|
|
20019
|
+
useConptyDll: process.platform === "win32",
|
|
19945
20020
|
env: { ...launch2.env, ...this.prepareEnv(this.info.gatewayToken, this.info.terminalSessionId) }
|
|
19946
20021
|
});
|
|
19947
20022
|
this.startupDeadline = this.options.fallback && isInteractiveShellLaunch(this.options) ? Date.now() + 1e3 : 0;
|
|
19948
20023
|
this.processGeneration++;
|
|
19949
20024
|
this.terminal = terminal;
|
|
20025
|
+
if (this.outputPaused) terminal.pause();
|
|
19950
20026
|
this.info.pid = terminal.pid;
|
|
19951
20027
|
this.info.launch = { command: launch2.command, args: [...launch2.args], ...fallbackReason ? { fallbackReason } : {} };
|
|
19952
20028
|
for (const listener of this.launchListeners) listener(this.info.launch);
|
|
@@ -19993,7 +20069,7 @@ var HostSession = class {
|
|
|
19993
20069
|
this.info.cols = cols;
|
|
19994
20070
|
this.info.rows = rows;
|
|
19995
20071
|
for (const listener of this.resizeListeners) listener(cols, rows);
|
|
19996
|
-
this.terminal.resize(cols, rows);
|
|
20072
|
+
if (this.info.status === "running") this.terminal.resize(cols, rows);
|
|
19997
20073
|
}
|
|
19998
20074
|
signal(signal) {
|
|
19999
20075
|
if (!["SIGINT", "SIGTERM", "SIGKILL"].includes(signal)) throw new Error("HOST_SIGNAL_INVALID");
|
|
@@ -20001,13 +20077,26 @@ var HostSession = class {
|
|
|
20001
20077
|
if (process.platform === "win32") {
|
|
20002
20078
|
if (signal === "SIGINT") this.terminal.write("");
|
|
20003
20079
|
else this.close();
|
|
20004
|
-
} else
|
|
20080
|
+
} else {
|
|
20081
|
+
this.nativeClosing = signal !== "SIGINT";
|
|
20082
|
+
if (this.nativeClosing) this.setOutputPaused(false);
|
|
20083
|
+
this.terminal.kill(signal);
|
|
20084
|
+
}
|
|
20005
20085
|
}
|
|
20006
20086
|
close() {
|
|
20007
20087
|
if (this.info.status !== "running") return;
|
|
20008
20088
|
this.closing = true;
|
|
20089
|
+
this.nativeClosing = true;
|
|
20090
|
+
this.setOutputPaused(false);
|
|
20009
20091
|
this.terminal.kill();
|
|
20010
20092
|
}
|
|
20093
|
+
setOutputPaused(paused) {
|
|
20094
|
+
const next = paused && !this.nativeClosing;
|
|
20095
|
+
if (next === this.outputPaused) return;
|
|
20096
|
+
this.outputPaused = next;
|
|
20097
|
+
if (next) this.terminal?.pause();
|
|
20098
|
+
else this.terminal?.resume();
|
|
20099
|
+
}
|
|
20011
20100
|
snapshot() {
|
|
20012
20101
|
if (this.degraded) return Promise.resolve({
|
|
20013
20102
|
data: "\x1B[0m\x1B[2J\x1B[H[Runweave: screen recovery unavailable; the original process is still running.]\r\n",
|
|
@@ -20057,6 +20146,42 @@ function sendJson(socket, message) {
|
|
|
20057
20146
|
return true;
|
|
20058
20147
|
}
|
|
20059
20148
|
|
|
20149
|
+
// packages/pty-host/src/output-batcher.ts
|
|
20150
|
+
function createHostOutputBatcher(send) {
|
|
20151
|
+
let pending;
|
|
20152
|
+
let timer;
|
|
20153
|
+
let disposed = false;
|
|
20154
|
+
const flush = () => {
|
|
20155
|
+
if (timer) clearTimeout(timer);
|
|
20156
|
+
timer = void 0;
|
|
20157
|
+
const frame = pending;
|
|
20158
|
+
pending = void 0;
|
|
20159
|
+
if (frame && !disposed) send(frame);
|
|
20160
|
+
};
|
|
20161
|
+
return {
|
|
20162
|
+
push(frame) {
|
|
20163
|
+
if (disposed) return;
|
|
20164
|
+
if (pending && (pending.range.streamId !== frame.range.streamId || pending.range.toOffset !== frame.range.fromOffset || frame.range.toOffset - pending.range.fromOffset > OUTPUT_FRAME_MAX_BYTES)) flush();
|
|
20165
|
+
pending = pending ? {
|
|
20166
|
+
data: pending.data + frame.data,
|
|
20167
|
+
range: { ...pending.range, toOffset: frame.range.toOffset }
|
|
20168
|
+
} : frame;
|
|
20169
|
+
if (pending.range.toOffset - pending.range.fromOffset >= OUTPUT_FRAME_MAX_BYTES) flush();
|
|
20170
|
+
else if (!timer) {
|
|
20171
|
+
timer = setTimeout(flush, 16);
|
|
20172
|
+
timer.unref();
|
|
20173
|
+
}
|
|
20174
|
+
},
|
|
20175
|
+
flush,
|
|
20176
|
+
dispose() {
|
|
20177
|
+
disposed = true;
|
|
20178
|
+
pending = void 0;
|
|
20179
|
+
if (timer) clearTimeout(timer);
|
|
20180
|
+
timer = void 0;
|
|
20181
|
+
}
|
|
20182
|
+
};
|
|
20183
|
+
}
|
|
20184
|
+
|
|
20060
20185
|
// packages/pty-host/src/server.ts
|
|
20061
20186
|
var scopeSchema = external_exports.object({ kind: external_exports.enum(["stable", "dev"]), instanceId: external_exports.string().min(1), configRoot: external_exports.string().min(1) });
|
|
20062
20187
|
var targetSchema = external_exports.object({ hostInstanceId: external_exports.string().uuid(), sessionInstanceId: external_exports.string().uuid(), terminalSessionId: external_exports.string().min(1), generation: external_exports.number().int().positive() });
|
|
@@ -20064,6 +20189,7 @@ var createSchema = external_exports.object({
|
|
|
20064
20189
|
generation: external_exports.number().int().positive(),
|
|
20065
20190
|
sessionInstanceId: external_exports.string().uuid(),
|
|
20066
20191
|
terminalSessionId: external_exports.string().min(1).max(256),
|
|
20192
|
+
replacesSessionInstanceId: external_exports.string().uuid().optional(),
|
|
20067
20193
|
projectId: external_exports.string().min(1).max(256),
|
|
20068
20194
|
command: external_exports.string().min(1).max(32768),
|
|
20069
20195
|
args: external_exports.array(external_exports.string()).max(256),
|
|
@@ -20094,7 +20220,10 @@ async function startHost(scope, release) {
|
|
|
20094
20220
|
const shutdown = async () => {
|
|
20095
20221
|
if (stopping) return;
|
|
20096
20222
|
stopping = true;
|
|
20097
|
-
for (const session of sessions.values())
|
|
20223
|
+
for (const session of sessions.values()) {
|
|
20224
|
+
session.close();
|
|
20225
|
+
session.screen.dispose();
|
|
20226
|
+
}
|
|
20098
20227
|
for (const socket of sockets) socket.destroy();
|
|
20099
20228
|
await gateway.close();
|
|
20100
20229
|
if (server.listening) await new Promise((resolve) => server.close(() => resolve()));
|
|
@@ -20131,7 +20260,7 @@ async function startHost(scope, release) {
|
|
|
20131
20260
|
...socketError instanceof HostTransportError ? { bufferedBytes: socketError.bufferedBytes, limitBytes: socketError.limitBytes } : {}
|
|
20132
20261
|
});
|
|
20133
20262
|
sockets.delete(socket);
|
|
20134
|
-
for (const
|
|
20263
|
+
for (const subscription of subscriptions.values()) subscription.dispose();
|
|
20135
20264
|
});
|
|
20136
20265
|
receiveJsonLines(socket, (message) => {
|
|
20137
20266
|
const parsed = wireSchema.safeParse(message);
|
|
@@ -20141,7 +20270,10 @@ async function startHost(scope, release) {
|
|
|
20141
20270
|
}
|
|
20142
20271
|
const request = parsed.data;
|
|
20143
20272
|
const startedAt = performance.now();
|
|
20144
|
-
const reply = (result) =>
|
|
20273
|
+
const reply = (result) => {
|
|
20274
|
+
for (const subscription of subscriptions.values()) subscription.flush();
|
|
20275
|
+
return sendJson(socket, { requestId: request.requestId, result });
|
|
20276
|
+
};
|
|
20145
20277
|
const fail = (error) => {
|
|
20146
20278
|
reportHostDiagnostic(writeHostDiagnostic, {
|
|
20147
20279
|
event: "pty-host.request.failed",
|
|
@@ -20172,7 +20304,14 @@ async function startHost(scope, release) {
|
|
|
20172
20304
|
if (request.action === "hello") {
|
|
20173
20305
|
const expected = scopeSchema.parse(request.body);
|
|
20174
20306
|
if (expected.kind !== scope.kind || expected.instanceId !== scope.instanceId || expected.configRoot !== scope.configRoot) throw new Error("HOST_IDENTITY_MISMATCH");
|
|
20175
|
-
return reply({
|
|
20307
|
+
return reply({
|
|
20308
|
+
descriptor,
|
|
20309
|
+
generation,
|
|
20310
|
+
frozen,
|
|
20311
|
+
sessions: sessions.size,
|
|
20312
|
+
outboxIncomplete: gateway.outbox.incomplete,
|
|
20313
|
+
capabilities: { replaceExitedSession: true }
|
|
20314
|
+
});
|
|
20176
20315
|
}
|
|
20177
20316
|
if (request.action === "claimWriter") {
|
|
20178
20317
|
const body2 = external_exports.object({ ownerId: external_exports.string().uuid(), expectedGeneration: external_exports.number().int().nonnegative() }).parse(request.body);
|
|
@@ -20188,8 +20327,13 @@ async function startHost(scope, release) {
|
|
|
20188
20327
|
requireWriter(requested);
|
|
20189
20328
|
const previous = sessions.get(body2.terminalSessionId);
|
|
20190
20329
|
if (previous) {
|
|
20191
|
-
if (previous.createDigest
|
|
20192
|
-
|
|
20330
|
+
if (previous.createDigest === (0, import_node_crypto7.createHash)("sha256").update(JSON.stringify(body2)).digest("hex"))
|
|
20331
|
+
return reply(await previous.ready());
|
|
20332
|
+
if (previous.info.status !== "exited" || body2.replacesSessionInstanceId !== previous.info.sessionInstanceId || body2.sessionInstanceId === previous.info.sessionInstanceId) throw new Error("HOST_INPUT_CONFLICT");
|
|
20333
|
+
previous.screen.dispose();
|
|
20334
|
+
sessions.delete(body2.terminalSessionId);
|
|
20335
|
+
} else if (body2.replacesSessionInstanceId) {
|
|
20336
|
+
throw new Error("HOST_SESSION_GONE");
|
|
20193
20337
|
}
|
|
20194
20338
|
if ([...sessions.values()].filter((session3) => session3.info.status === "running").length >= 64) throw new Error("HOST_BUSY");
|
|
20195
20339
|
if (sessions.size >= 256) {
|
|
@@ -20254,34 +20398,66 @@ async function startHost(scope, release) {
|
|
|
20254
20398
|
return reply({ ok: true });
|
|
20255
20399
|
}
|
|
20256
20400
|
if (request.action === "attachSession") {
|
|
20257
|
-
subscriptions.get(session.info.terminalSessionId)?.();
|
|
20401
|
+
subscriptions.get(session.info.terminalSessionId)?.flush();
|
|
20402
|
+
subscriptions.get(session.info.terminalSessionId)?.dispose();
|
|
20258
20403
|
let ready = false;
|
|
20404
|
+
const batcher = createHostOutputBatcher((frame) => {
|
|
20405
|
+
sendJson(socket, {
|
|
20406
|
+
type: "output",
|
|
20407
|
+
terminalSessionId: session.info.terminalSessionId,
|
|
20408
|
+
data: frame.data,
|
|
20409
|
+
cursor: { streamId: frame.range.streamId, offset: frame.range.toOffset },
|
|
20410
|
+
range: frame.range
|
|
20411
|
+
});
|
|
20412
|
+
});
|
|
20259
20413
|
const output = (frame) => {
|
|
20260
|
-
if (ready)
|
|
20414
|
+
if (ready) batcher.push(frame);
|
|
20261
20415
|
};
|
|
20262
20416
|
const exited = (exitCode) => {
|
|
20417
|
+
batcher.flush();
|
|
20263
20418
|
sendJson(socket, { type: "exit", terminalSessionId: session.info.terminalSessionId, exitCode });
|
|
20264
20419
|
};
|
|
20265
20420
|
const resized = (cols, rows) => {
|
|
20266
|
-
if (ready)
|
|
20421
|
+
if (ready) {
|
|
20422
|
+
batcher.flush();
|
|
20423
|
+
sendJson(socket, { type: "resize", terminalSessionId: session.info.terminalSessionId, cols, rows, cursor: session.buffer.cursor });
|
|
20424
|
+
}
|
|
20267
20425
|
};
|
|
20268
20426
|
const launched = (launch2) => {
|
|
20269
|
-
if (ready)
|
|
20427
|
+
if (ready) {
|
|
20428
|
+
batcher.flush();
|
|
20429
|
+
sendJson(socket, { type: "launch", terminalSessionId: session.info.terminalSessionId, launch: launch2 });
|
|
20430
|
+
}
|
|
20270
20431
|
};
|
|
20271
20432
|
session.launchListeners.add(launched);
|
|
20272
20433
|
session.outputListeners.add(output);
|
|
20273
20434
|
session.exitListeners.add(exited);
|
|
20274
20435
|
session.resizeListeners.add(resized);
|
|
20275
|
-
subscriptions.set(session.info.terminalSessionId, ()
|
|
20436
|
+
subscriptions.set(session.info.terminalSessionId, { flush: batcher.flush, dispose() {
|
|
20437
|
+
batcher.dispose();
|
|
20276
20438
|
session.launchListeners.delete(launched);
|
|
20277
20439
|
session.outputListeners.delete(output);
|
|
20278
20440
|
session.exitListeners.delete(exited);
|
|
20279
20441
|
session.resizeListeners.delete(resized);
|
|
20280
|
-
});
|
|
20442
|
+
} });
|
|
20281
20443
|
const snapshot = await session.snapshot();
|
|
20282
20444
|
const tail = session.buffer.read(snapshot.cursor);
|
|
20283
20445
|
if (!tail.ok) throw new Error("HOST_OUTPUT_GAP");
|
|
20284
|
-
|
|
20446
|
+
const result = { session: session.describe(), snapshot, frames: tail.frames };
|
|
20447
|
+
if (body.includeHistory === true) {
|
|
20448
|
+
const history = [];
|
|
20449
|
+
result.history = history;
|
|
20450
|
+
let budget = 3 * 1024 * 1024 - Buffer.byteLength(JSON.stringify({ requestId: request.requestId, result }));
|
|
20451
|
+
for (const frame of session.buffer.retainedFrames().reverse()) {
|
|
20452
|
+
if (frame.range.toOffset > snapshot.cursor.offset) continue;
|
|
20453
|
+
const size = Buffer.byteLength(JSON.stringify(frame)) + 1;
|
|
20454
|
+
if (size > budget) break;
|
|
20455
|
+
history.push(frame);
|
|
20456
|
+
budget -= size;
|
|
20457
|
+
}
|
|
20458
|
+
history.reverse();
|
|
20459
|
+
}
|
|
20460
|
+
reply(result);
|
|
20285
20461
|
ready = true;
|
|
20286
20462
|
if (session.info.status === "exited") exited(session.info.exitCode ?? 0);
|
|
20287
20463
|
return;
|
package/payload/server/index.cjs
CHANGED
|
@@ -7350,9 +7350,9 @@ var import_node_fs = require("node:fs");
|
|
|
7350
7350
|
|
|
7351
7351
|
// packages/config-node/src/windows-permissions.ts
|
|
7352
7352
|
var import_node_child_process = require("node:child_process");
|
|
7353
|
-
|
|
7354
|
-
|
|
7355
|
-
|
|
7353
|
+
var import_node_util = require("node:util");
|
|
7354
|
+
var executeFile = (0, import_node_util.promisify)(import_node_child_process.execFile);
|
|
7355
|
+
var script = `
|
|
7356
7356
|
$ErrorActionPreference = 'Stop'
|
|
7357
7357
|
try {
|
|
7358
7358
|
# Use .NET directly: a parent pwsh may export a PSModulePath incompatible with Windows PowerShell.
|
|
@@ -7370,6 +7370,27 @@ foreach ($rule in $acl.GetAccessRules($true, $true, [Security.Principal.Security
|
|
|
7370
7370
|
[Console]::Write('check-failed:' + $_.Exception.GetType().FullName + ':' + $_.Exception.HResult)
|
|
7371
7371
|
}
|
|
7372
7372
|
`;
|
|
7373
|
+
function checkFailure(file, startedAt, cause) {
|
|
7374
|
+
const error = cause;
|
|
7375
|
+
const timedOut = error.code === "ETIMEDOUT" || error.killed === true && error.signal === "SIGTERM" && error.code == null;
|
|
7376
|
+
return new ConfigurationError(
|
|
7377
|
+
timedOut ? "CONFIG_WINDOWS_ACL_CHECK_TIMEOUT" : "CONFIG_WINDOWS_ACL_CHECK_FAILED",
|
|
7378
|
+
[
|
|
7379
|
+
file,
|
|
7380
|
+
`exit=${error.status ?? "none"}`,
|
|
7381
|
+
`signal=${error.signal ?? "none"}`,
|
|
7382
|
+
`code=${error.code ?? "none"}`,
|
|
7383
|
+
`elapsedMs=${Math.round(performance.now() - startedAt)}`
|
|
7384
|
+
]
|
|
7385
|
+
);
|
|
7386
|
+
}
|
|
7387
|
+
function assertResult(file, result) {
|
|
7388
|
+
if (result === "owner" || result === "access") throw new ConfigurationError("CONFIG_WINDOWS_ACL_NOT_PRIVATE", [file, result]);
|
|
7389
|
+
if (/^check-failed:[A-Za-z0-9_.]+:-?\d+$/.test(result)) throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, result]);
|
|
7390
|
+
if (result !== "private") throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, "invalid-result"]);
|
|
7391
|
+
}
|
|
7392
|
+
function assertWindowsPrivatePath(file) {
|
|
7393
|
+
if (process.platform !== "win32") return;
|
|
7373
7394
|
const startedAt = performance.now();
|
|
7374
7395
|
let result;
|
|
7375
7396
|
try {
|
|
@@ -7382,34 +7403,31 @@ foreach ($rule in $acl.GetAccessRules($true, $true, [Security.Principal.Security
|
|
|
7382
7403
|
windowsHide: true
|
|
7383
7404
|
}).trim();
|
|
7384
7405
|
} catch (cause) {
|
|
7385
|
-
|
|
7386
|
-
throw new ConfigurationError(
|
|
7387
|
-
error.code === "ETIMEDOUT" ? "CONFIG_WINDOWS_ACL_CHECK_TIMEOUT" : "CONFIG_WINDOWS_ACL_CHECK_FAILED",
|
|
7388
|
-
[
|
|
7389
|
-
file,
|
|
7390
|
-
`exit=${error.status ?? "none"}`,
|
|
7391
|
-
`signal=${error.signal ?? "none"}`,
|
|
7392
|
-
`code=${error.code ?? "none"}`,
|
|
7393
|
-
`elapsedMs=${Math.round(performance.now() - startedAt)}`
|
|
7394
|
-
]
|
|
7395
|
-
);
|
|
7406
|
+
throw checkFailure(file, startedAt, cause);
|
|
7396
7407
|
}
|
|
7397
|
-
|
|
7398
|
-
if (/^check-failed:[A-Za-z0-9_.]+:-?\d+$/.test(result)) throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, result]);
|
|
7399
|
-
if (result !== "private") throw new ConfigurationError("CONFIG_WINDOWS_ACL_CHECK_FAILED", [file, "invalid-result"]);
|
|
7408
|
+
assertResult(file, result);
|
|
7400
7409
|
}
|
|
7401
7410
|
|
|
7402
7411
|
// packages/config-node/src/private-file.ts
|
|
7403
|
-
function
|
|
7412
|
+
function privateDirectoryStat(directory) {
|
|
7404
7413
|
const stat = (0, import_node_fs.lstatSync)(directory);
|
|
7405
7414
|
if (!stat.isDirectory() || stat.isSymbolicLink() || process.platform !== "win32" && stat.mode & 63 || typeof process.getuid === "function" && stat.uid !== process.getuid()) throw new ConfigurationError("CONFIG_ROOT_PERMISSIONS_INVALID");
|
|
7406
|
-
|
|
7415
|
+
return stat;
|
|
7407
7416
|
}
|
|
7408
|
-
function
|
|
7417
|
+
function privateDescriptorStat(fd, maxBytes) {
|
|
7409
7418
|
const stat = (0, import_node_fs.fstatSync)(fd);
|
|
7410
7419
|
if (!stat.isFile() || stat.nlink !== 1) throw new ConfigurationError("CONFIG_FILE_NOT_PRIVATE_REGULAR");
|
|
7411
7420
|
if (typeof process.getuid === "function" && stat.uid !== process.getuid()) throw new ConfigurationError("CONFIG_FILE_OWNER_MISMATCH");
|
|
7412
7421
|
if (process.platform !== "win32" && stat.mode & 63) throw new ConfigurationError("CONFIG_FILE_PERMISSIONS_INVALID");
|
|
7422
|
+
if (stat.size > maxBytes) throw new ConfigurationError("CONFIG_FILE_TOO_LARGE");
|
|
7423
|
+
return stat;
|
|
7424
|
+
}
|
|
7425
|
+
function assertPrivateDirectory(directory) {
|
|
7426
|
+
privateDirectoryStat(directory);
|
|
7427
|
+
assertWindowsPrivatePath(directory);
|
|
7428
|
+
}
|
|
7429
|
+
function assertPrivateDescriptor(fd, maxBytes = 1024 * 1024, file) {
|
|
7430
|
+
const stat = privateDescriptorStat(fd, Infinity);
|
|
7413
7431
|
if (process.platform === "win32") {
|
|
7414
7432
|
if (!file) throw new ConfigurationError("CONFIG_PRIVATE_PATH_REQUIRED");
|
|
7415
7433
|
assertWindowsPrivatePath(file);
|
|
@@ -7500,6 +7518,8 @@ function assertOwnedPath(context, value) {
|
|
|
7500
7518
|
// packages/config-node/src/platform.ts
|
|
7501
7519
|
var import_node_child_process2 = require("node:child_process");
|
|
7502
7520
|
var import_node_fs3 = require("node:fs");
|
|
7521
|
+
var import_node_util2 = require("node:util");
|
|
7522
|
+
var executeFile2 = (0, import_node_util2.promisify)(import_node_child_process2.execFile);
|
|
7503
7523
|
function processStartIdentity(pid) {
|
|
7504
7524
|
if (!Number.isSafeInteger(pid) || pid < 1) return null;
|
|
7505
7525
|
try {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,M as n}from"./index-UR7g5PLZ.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-CxVRfINM.js";import{_ as i}from"./index-UR7g5PLZ.js";import"./chunk-FMBD7UC4-DIvA96Y1.js";import"./chunk-YZCP3GAM-CH4YkXv-.js";import"./chunk-55IACEB6-BFRLEEBY.js";import"./chunk-EDXVE4YY-DA5BuoT3.js";import"./main-LH8ULGFT.js";import"./index-D9-cSGu-.js";import"./record-content-DQ0F1zbW.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-CxVRfINM.js";import{_ as i}from"./index-UR7g5PLZ.js";import"./chunk-FMBD7UC4-DIvA96Y1.js";import"./chunk-YZCP3GAM-CH4YkXv-.js";import"./chunk-55IACEB6-BFRLEEBY.js";import"./chunk-EDXVE4YY-DA5BuoT3.js";import"./main-LH8ULGFT.js";import"./index-D9-cSGu-.js";import"./record-content-DQ0F1zbW.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as r}from"./graph-DRJG1bKF.js";var e=4;function a(o){return r(o,e)}export{a as c};
|