charness 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +274 -0
- package/DEVELOPMENT.md +31 -5
- package/MIGRATION_RENAME_TO_CHARNESS.md +3 -2
- package/README.md +84 -782
- package/SETUP.md +37 -10
- package/agent-plugin/.claude-plugin/plugin.json +7 -0
- package/agent-plugin/README.md +35 -0
- package/agent-plugin/skills/charness-delegate-claude/SKILL.md +85 -0
- package/agent-plugin/skills/charness-delegate-claude/summarize-events.py +90 -0
- package/agent-plugin/skills/charness-delegate-opencode/SKILL.md +68 -0
- package/agent-plugin/skills/charness-manager/SKILL.md +152 -0
- package/dist/adapters/adapterNames.d.ts +6 -0
- package/dist/adapters/adapterNames.d.ts.map +1 -1
- package/dist/adapters/adapterNames.js +8 -2
- package/dist/adapters/adapterNames.js.map +1 -1
- package/dist/adapters/claudeCliAdapter.d.ts +8 -0
- package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeCliAdapter.js +42 -5
- package/dist/adapters/claudeCliAdapter.js.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.d.ts +10 -9
- package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
- package/dist/adapters/claudeJsonStreamAdapter.js +53 -55
- package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
- package/dist/adapters/createAdapter.d.ts +8 -0
- package/dist/adapters/createAdapter.d.ts.map +1 -1
- package/dist/adapters/createAdapter.js +14 -2
- package/dist/adapters/createAdapter.js.map +1 -1
- package/dist/adapters/openCodeAdapter.d.ts +43 -6
- package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/openCodeAdapter.js +95 -6
- package/dist/adapters/openCodeAdapter.js.map +1 -1
- package/dist/agentLogin/agentLogin.d.ts +1 -1
- package/dist/agentLogin/agentLogin.d.ts.map +1 -1
- package/dist/apiRetryKick.d.ts +4 -3
- package/dist/apiRetryKick.d.ts.map +1 -1
- package/dist/apiRetryKick.js +16 -9
- package/dist/apiRetryKick.js.map +1 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +1313 -381
- package/dist/bot.js.map +1 -1
- package/dist/cli/claudeProfiles.d.ts +11 -6
- package/dist/cli/claudeProfiles.d.ts.map +1 -1
- package/dist/cli/claudeProfiles.js +50 -22
- package/dist/cli/claudeProfiles.js.map +1 -1
- package/dist/cli/hot.d.ts +5 -0
- package/dist/cli/hot.d.ts.map +1 -1
- package/dist/cli/hot.js +71 -25
- package/dist/cli/hot.js.map +1 -1
- package/dist/cli/tscWatchGuard.d.ts +95 -0
- package/dist/cli/tscWatchGuard.d.ts.map +1 -0
- package/dist/cli/tscWatchGuard.js +295 -0
- package/dist/cli/tscWatchGuard.js.map +1 -0
- package/dist/cli.js +12 -1
- package/dist/cli.js.map +1 -1
- package/dist/connectors/jira/answerSink.d.ts +10 -0
- package/dist/connectors/jira/answerSink.d.ts.map +1 -1
- package/dist/connectors/jira/answerSink.js +13 -0
- package/dist/connectors/jira/answerSink.js.map +1 -1
- package/dist/connectors/jira/config.d.ts +2 -0
- package/dist/connectors/jira/config.d.ts.map +1 -1
- package/dist/connectors/jira/config.js +9 -1
- package/dist/connectors/jira/config.js.map +1 -1
- package/dist/connectors/jira/connector.d.ts +11 -1
- package/dist/connectors/jira/connector.d.ts.map +1 -1
- package/dist/connectors/jira/connector.js +13 -1
- package/dist/connectors/jira/connector.js.map +1 -1
- package/dist/connectors/jira/inbound.d.ts +29 -4
- package/dist/connectors/jira/inbound.d.ts.map +1 -1
- package/dist/connectors/jira/inbound.js +71 -8
- package/dist/connectors/jira/inbound.js.map +1 -1
- package/dist/connectors/jira/issueBlocks.d.ts +5 -0
- package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
- package/dist/connectors/jira/issueBlocks.js +11 -0
- package/dist/connectors/jira/issueBlocks.js.map +1 -1
- package/dist/connectors/jira/prompt.d.ts +4 -0
- package/dist/connectors/jira/prompt.d.ts.map +1 -1
- package/dist/connectors/jira/prompt.js +11 -2
- package/dist/connectors/jira/prompt.js.map +1 -1
- package/dist/connectors/telegram/bindPicker.d.ts +5 -0
- package/dist/connectors/telegram/bindPicker.d.ts.map +1 -1
- package/dist/connectors/telegram/bindPicker.js +18 -1
- package/dist/connectors/telegram/bindPicker.js.map +1 -1
- package/dist/connectors/telegram/bindPickerClaims.d.ts +46 -0
- package/dist/connectors/telegram/bindPickerClaims.d.ts.map +1 -0
- package/dist/connectors/telegram/bindPickerClaims.js +83 -0
- package/dist/connectors/telegram/bindPickerClaims.js.map +1 -0
- package/dist/connectors/telegram/bindSweep.d.ts +32 -0
- package/dist/connectors/telegram/bindSweep.d.ts.map +1 -0
- package/dist/connectors/telegram/bindSweep.js +47 -0
- package/dist/connectors/telegram/bindSweep.js.map +1 -0
- package/dist/connectors/telegram/bindingWelcome.d.ts +23 -0
- package/dist/connectors/telegram/bindingWelcome.d.ts.map +1 -0
- package/dist/connectors/telegram/bindingWelcome.js +26 -0
- package/dist/connectors/telegram/bindingWelcome.js.map +1 -0
- package/dist/connectors/telegram/botApiConnection.d.ts +74 -0
- package/dist/connectors/telegram/botApiConnection.d.ts.map +1 -0
- package/dist/connectors/telegram/botApiConnection.js +201 -0
- package/dist/connectors/telegram/botApiConnection.js.map +1 -0
- package/dist/connectors/telegram/commands/botCore.d.ts +8 -2
- package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/botSkills.d.ts +21 -0
- package/dist/connectors/telegram/commands/botSkills.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/botSkills.js +133 -0
- package/dist/connectors/telegram/commands/botSkills.js.map +1 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts +5 -0
- package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/callbackMessage.js +9 -0
- package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -1
- package/dist/connectors/telegram/commands/compaction.d.ts +65 -3
- package/dist/connectors/telegram/commands/compaction.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/compaction.js +512 -94
- package/dist/connectors/telegram/commands/compaction.js.map +1 -1
- package/dist/connectors/telegram/commands/displayModes.d.ts +1 -1
- package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/displayModes.js +6 -18
- package/dist/connectors/telegram/commands/displayModes.js.map +1 -1
- package/dist/connectors/telegram/commands/fallbackChain.js +5 -5
- package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
- package/dist/connectors/telegram/commands/reminders.d.ts +1 -1
- package/dist/connectors/telegram/commands/reminders.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/reminders.js +4 -15
- package/dist/connectors/telegram/commands/reminders.js.map +1 -1
- package/dist/connectors/telegram/commands/selfUpdate.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/selfUpdate.js +1 -11
- package/dist/connectors/telegram/commands/selfUpdate.js.map +1 -1
- package/dist/connectors/telegram/commands/taskAgents.d.ts +22 -0
- package/dist/connectors/telegram/commands/taskAgents.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/taskAgents.js +104 -0
- package/dist/connectors/telegram/commands/taskAgents.js.map +1 -0
- package/dist/connectors/telegram/commands/todo.d.ts +82 -0
- package/dist/connectors/telegram/commands/todo.d.ts.map +1 -0
- package/dist/connectors/telegram/commands/todo.js +384 -0
- package/dist/connectors/telegram/commands/todo.js.map +1 -0
- package/dist/connectors/telegram/commands/topicCommand.d.ts +6 -2
- package/dist/connectors/telegram/commands/topicCommand.d.ts.map +1 -1
- package/dist/connectors/telegram/commands/topicCommand.js +6 -9
- package/dist/connectors/telegram/commands/topicCommand.js.map +1 -1
- package/dist/connectors/telegram/openBindMessages.d.ts +45 -0
- package/dist/connectors/telegram/openBindMessages.d.ts.map +1 -0
- package/dist/connectors/telegram/openBindMessages.js +67 -0
- package/dist/connectors/telegram/openBindMessages.js.map +1 -0
- package/dist/connectors/telegram/outputFlushPlan.d.ts +49 -0
- package/dist/connectors/telegram/outputFlushPlan.d.ts.map +1 -1
- package/dist/connectors/telegram/outputFlushPlan.js +46 -0
- package/dist/connectors/telegram/outputFlushPlan.js.map +1 -1
- package/dist/connectors/telegram/pendingTopicName.d.ts +26 -0
- package/dist/connectors/telegram/pendingTopicName.d.ts.map +1 -0
- package/dist/connectors/telegram/pendingTopicName.js +27 -0
- package/dist/connectors/telegram/pendingTopicName.js.map +1 -0
- package/dist/connectors/test/connector.d.ts.map +1 -1
- package/dist/connectors/test/connector.js +6 -1
- package/dist/connectors/test/connector.js.map +1 -1
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +90 -7
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +90 -7
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +90 -7
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +90 -7
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/hi.d.ts.map +1 -1
- package/dist/i18n/hi.js +90 -7
- package/dist/i18n/hi.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +90 -7
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ka.d.ts.map +1 -1
- package/dist/i18n/ka.js +90 -7
- package/dist/i18n/ka.js.map +1 -1
- package/dist/i18n/pt.d.ts.map +1 -1
- package/dist/i18n/pt.js +90 -7
- package/dist/i18n/pt.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +90 -7
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/uk.d.ts.map +1 -1
- package/dist/i18n/uk.js +90 -7
- package/dist/i18n/uk.js.map +1 -1
- package/dist/i18n/uz.d.ts.map +1 -1
- package/dist/i18n/uz.js +90 -7
- package/dist/i18n/uz.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +90 -7
- package/dist/i18n/zh.js.map +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.js +1 -1
- package/dist/installManager.d.ts +13 -0
- package/dist/installManager.d.ts.map +1 -1
- package/dist/installManager.js +38 -4
- package/dist/installManager.js.map +1 -1
- package/dist/instanceSettings.d.ts +40 -1
- package/dist/instanceSettings.d.ts.map +1 -1
- package/dist/instanceSettings.js +105 -26
- package/dist/instanceSettings.js.map +1 -1
- package/dist/openCodeQuestionFlow.d.ts +30 -0
- package/dist/openCodeQuestionFlow.d.ts.map +1 -1
- package/dist/openCodeQuestionFlow.js +43 -0
- package/dist/openCodeQuestionFlow.js.map +1 -1
- package/dist/postToSession.d.ts +20 -5
- package/dist/postToSession.d.ts.map +1 -1
- package/dist/postToSession.js +38 -7
- package/dist/postToSession.js.map +1 -1
- package/dist/remoteRun/cliArgs.d.ts +73 -0
- package/dist/remoteRun/cliArgs.d.ts.map +1 -0
- package/dist/remoteRun/cliArgs.js +197 -0
- package/dist/remoteRun/cliArgs.js.map +1 -0
- package/dist/remoteRun/commands.d.ts +56 -0
- package/dist/remoteRun/commands.d.ts.map +1 -0
- package/dist/remoteRun/commands.js +306 -0
- package/dist/remoteRun/commands.js.map +1 -0
- package/dist/remoteRun/depsPlan.d.ts +16 -0
- package/dist/remoteRun/depsPlan.d.ts.map +1 -0
- package/dist/remoteRun/depsPlan.js +82 -0
- package/dist/remoteRun/depsPlan.js.map +1 -0
- package/dist/remoteRun/exitCodes.d.ts +34 -0
- package/dist/remoteRun/exitCodes.d.ts.map +1 -0
- package/dist/remoteRun/exitCodes.js +38 -0
- package/dist/remoteRun/exitCodes.js.map +1 -0
- package/dist/remoteRun/foreground.d.ts +29 -0
- package/dist/remoteRun/foreground.d.ts.map +1 -0
- package/dist/remoteRun/foreground.js +159 -0
- package/dist/remoteRun/foreground.js.map +1 -0
- package/dist/remoteRun/interrupts.d.ts +17 -0
- package/dist/remoteRun/interrupts.d.ts.map +1 -0
- package/dist/remoteRun/interrupts.js +41 -0
- package/dist/remoteRun/interrupts.js.map +1 -0
- package/dist/remoteRun/jobFiles.d.ts +31 -0
- package/dist/remoteRun/jobFiles.d.ts.map +1 -0
- package/dist/remoteRun/jobFiles.js +84 -0
- package/dist/remoteRun/jobFiles.js.map +1 -0
- package/dist/remoteRun/jobFormat.d.ts +16 -0
- package/dist/remoteRun/jobFormat.d.ts.map +1 -0
- package/dist/remoteRun/jobFormat.js +130 -0
- package/dist/remoteRun/jobFormat.js.map +1 -0
- package/dist/remoteRun/jobId.d.ts +15 -0
- package/dist/remoteRun/jobId.d.ts.map +1 -0
- package/dist/remoteRun/jobId.js +85 -0
- package/dist/remoteRun/jobId.js.map +1 -0
- package/dist/remoteRun/jobMeta.d.ts +18 -0
- package/dist/remoteRun/jobMeta.d.ts.map +1 -0
- package/dist/remoteRun/jobMeta.js +33 -0
- package/dist/remoteRun/jobMeta.js.map +1 -0
- package/dist/remoteRun/jobQuery.d.ts +12 -0
- package/dist/remoteRun/jobQuery.d.ts.map +1 -0
- package/dist/remoteRun/jobQuery.js +22 -0
- package/dist/remoteRun/jobQuery.js.map +1 -0
- package/dist/remoteRun/jobRecords.d.ts +22 -0
- package/dist/remoteRun/jobRecords.d.ts.map +1 -0
- package/dist/remoteRun/jobRecords.js +145 -0
- package/dist/remoteRun/jobRecords.js.map +1 -0
- package/dist/remoteRun/jobState.d.ts +62 -0
- package/dist/remoteRun/jobState.d.ts.map +1 -0
- package/dist/remoteRun/jobState.js +132 -0
- package/dist/remoteRun/jobState.js.map +1 -0
- package/dist/remoteRun/leaseTiming.d.ts +18 -0
- package/dist/remoteRun/leaseTiming.d.ts.map +1 -0
- package/dist/remoteRun/leaseTiming.js +43 -0
- package/dist/remoteRun/leaseTiming.js.map +1 -0
- package/dist/remoteRun/output.d.ts +35 -0
- package/dist/remoteRun/output.d.ts.map +1 -0
- package/dist/remoteRun/output.js +82 -0
- package/dist/remoteRun/output.js.map +1 -0
- package/dist/remoteRun/pathPatterns.d.ts +33 -0
- package/dist/remoteRun/pathPatterns.d.ts.map +1 -0
- package/dist/remoteRun/pathPatterns.js +115 -0
- package/dist/remoteRun/pathPatterns.js.map +1 -0
- package/dist/remoteRun/probe.d.ts +56 -0
- package/dist/remoteRun/probe.d.ts.map +1 -0
- package/dist/remoteRun/probe.js +123 -0
- package/dist/remoteRun/probe.js.map +1 -0
- package/dist/remoteRun/project.d.ts +26 -0
- package/dist/remoteRun/project.d.ts.map +1 -0
- package/dist/remoteRun/project.js +159 -0
- package/dist/remoteRun/project.js.map +1 -0
- package/dist/remoteRun/projectConfig.d.ts +38 -0
- package/dist/remoteRun/projectConfig.d.ts.map +1 -0
- package/dist/remoteRun/projectConfig.js +87 -0
- package/dist/remoteRun/projectConfig.js.map +1 -0
- package/dist/remoteRun/remoteRunCli.d.ts +15 -0
- package/dist/remoteRun/remoteRunCli.d.ts.map +1 -0
- package/dist/remoteRun/remoteRunCli.js +144 -0
- package/dist/remoteRun/remoteRunCli.js.map +1 -0
- package/dist/remoteRun/remoteRunError.d.ts +14 -0
- package/dist/remoteRun/remoteRunError.d.ts.map +1 -0
- package/dist/remoteRun/remoteRunError.js +28 -0
- package/dist/remoteRun/remoteRunError.js.map +1 -0
- package/dist/remoteRun/rsync.d.ts +17 -0
- package/dist/remoteRun/rsync.d.ts.map +1 -0
- package/dist/remoteRun/rsync.js +39 -0
- package/dist/remoteRun/rsync.js.map +1 -0
- package/dist/remoteRun/runnerClient.d.ts +50 -0
- package/dist/remoteRun/runnerClient.d.ts.map +1 -0
- package/dist/remoteRun/runnerClient.js +139 -0
- package/dist/remoteRun/runnerClient.js.map +1 -0
- package/dist/remoteRun/runners.d.ts +57 -0
- package/dist/remoteRun/runners.d.ts.map +1 -0
- package/dist/remoteRun/runners.js +181 -0
- package/dist/remoteRun/runners.js.map +1 -0
- package/dist/remoteRun/runnersConfig.d.ts +44 -0
- package/dist/remoteRun/runnersConfig.d.ts.map +1 -0
- package/dist/remoteRun/runnersConfig.js +107 -0
- package/dist/remoteRun/runnersConfig.js.map +1 -0
- package/dist/remoteRun/safeCopy.d.ts +31 -0
- package/dist/remoteRun/safeCopy.d.ts.map +1 -0
- package/dist/remoteRun/safeCopy.js +137 -0
- package/dist/remoteRun/safeCopy.js.map +1 -0
- package/dist/remoteRun/sendPlan.d.ts +67 -0
- package/dist/remoteRun/sendPlan.d.ts.map +1 -0
- package/dist/remoteRun/sendPlan.js +139 -0
- package/dist/remoteRun/sendPlan.js.map +1 -0
- package/dist/remoteRun/ssh.d.ts +62 -0
- package/dist/remoteRun/ssh.d.ts.map +1 -0
- package/dist/remoteRun/ssh.js +202 -0
- package/dist/remoteRun/ssh.js.map +1 -0
- package/dist/remoteRun/submit.d.ts +29 -0
- package/dist/remoteRun/submit.d.ts.map +1 -0
- package/dist/remoteRun/submit.js +142 -0
- package/dist/remoteRun/submit.js.map +1 -0
- package/dist/requests/answerRequest.d.ts +5 -0
- package/dist/requests/answerRequest.d.ts.map +1 -1
- package/dist/requests/answerRequest.js +16 -1
- package/dist/requests/answerRequest.js.map +1 -1
- package/dist/requests/requestLedger.d.ts +13 -0
- package/dist/requests/requestLedger.d.ts.map +1 -1
- package/dist/requests/requestLedger.js +9 -0
- package/dist/requests/requestLedger.js.map +1 -1
- package/dist/requests/topicRequestSettle.d.ts +30 -0
- package/dist/requests/topicRequestSettle.d.ts.map +1 -0
- package/dist/requests/topicRequestSettle.js +23 -0
- package/dist/requests/topicRequestSettle.js.map +1 -0
- package/dist/requests/wakeUpEngine.d.ts +4 -0
- package/dist/requests/wakeUpEngine.d.ts.map +1 -1
- package/dist/requests/wakeUpEngine.js +5 -1
- package/dist/requests/wakeUpEngine.js.map +1 -1
- package/dist/scheduler/delivery.d.ts +2 -0
- package/dist/scheduler/delivery.d.ts.map +1 -1
- package/dist/scheduler/delivery.js +8 -4
- package/dist/scheduler/delivery.js.map +1 -1
- package/dist/scheduler/mcpSurface.d.ts +59 -10
- package/dist/scheduler/mcpSurface.d.ts.map +1 -1
- package/dist/scheduler/mcpSurface.js +276 -79
- package/dist/scheduler/mcpSurface.js.map +1 -1
- package/dist/scheduler/recurrence.d.ts +5 -0
- package/dist/scheduler/recurrence.d.ts.map +1 -1
- package/dist/scheduler/recurrence.js +12 -2
- package/dist/scheduler/recurrence.js.map +1 -1
- package/dist/scheduler/strictToolInput.d.ts +45 -0
- package/dist/scheduler/strictToolInput.d.ts.map +1 -0
- package/dist/scheduler/strictToolInput.js +155 -0
- package/dist/scheduler/strictToolInput.js.map +1 -0
- package/dist/scheduler/types.d.ts +5 -0
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/scheduler/workerWatch.d.ts +23 -0
- package/dist/scheduler/workerWatch.d.ts.map +1 -0
- package/dist/scheduler/workerWatch.js +26 -0
- package/dist/scheduler/workerWatch.js.map +1 -0
- package/dist/selfUpdate/emittedSource.d.ts +11 -0
- package/dist/selfUpdate/emittedSource.d.ts.map +1 -0
- package/dist/selfUpdate/emittedSource.js +24 -0
- package/dist/selfUpdate/emittedSource.js.map +1 -0
- package/dist/selfUpdate/gitSource.d.ts +0 -6
- package/dist/selfUpdate/gitSource.d.ts.map +1 -1
- package/dist/selfUpdate/gitSource.js +2 -18
- package/dist/selfUpdate/gitSource.js.map +1 -1
- package/dist/selfUpdate/updatePending.d.ts +1 -1
- package/dist/sendErrorClassifier.d.ts +10 -0
- package/dist/sendErrorClassifier.d.ts.map +1 -1
- package/dist/sendErrorClassifier.js +22 -0
- package/dist/sendErrorClassifier.js.map +1 -1
- package/dist/state.d.ts +78 -7
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +125 -8
- package/dist/state.js.map +1 -1
- package/dist/stateFile.d.ts +9 -0
- package/dist/stateFile.d.ts.map +1 -0
- package/dist/stateFile.js +57 -0
- package/dist/stateFile.js.map +1 -0
- package/dist/stt/sttInstall.d.ts +7 -3
- package/dist/stt/sttInstall.d.ts.map +1 -1
- package/dist/stt/sttInstall.js +8 -4
- package/dist/stt/sttInstall.js.map +1 -1
- package/dist/stt/sttSettings.d.ts +2 -1
- package/dist/stt/sttSettings.d.ts.map +1 -1
- package/dist/stt/sttSettings.js +3 -2
- package/dist/stt/sttSettings.js.map +1 -1
- package/dist/stt/transcribeChain.js +2 -0
- package/dist/stt/transcribeChain.js.map +1 -1
- package/dist/testTimings.d.ts +13 -3
- package/dist/testTimings.d.ts.map +1 -1
- package/dist/testTimings.js +26 -2
- package/dist/testTimings.js.map +1 -1
- package/dist/todos/board.d.ts +83 -0
- package/dist/todos/board.d.ts.map +1 -0
- package/dist/todos/board.js +227 -0
- package/dist/todos/board.js.map +1 -0
- package/dist/todos/format.d.ts +33 -0
- package/dist/todos/format.d.ts.map +1 -0
- package/dist/todos/format.js +90 -0
- package/dist/todos/format.js.map +1 -0
- package/dist/todos/merge.d.ts +46 -0
- package/dist/todos/merge.d.ts.map +1 -0
- package/dist/todos/merge.js +137 -0
- package/dist/todos/merge.js.map +1 -0
- package/dist/todos/midTurn.d.ts +75 -0
- package/dist/todos/midTurn.d.ts.map +1 -0
- package/dist/todos/midTurn.js +214 -0
- package/dist/todos/midTurn.js.map +1 -0
- package/dist/todos/nag.d.ts +85 -0
- package/dist/todos/nag.d.ts.map +1 -0
- package/dist/todos/nag.js +103 -0
- package/dist/todos/nag.js.map +1 -0
- package/dist/todos/order.d.ts +25 -0
- package/dist/todos/order.d.ts.map +1 -0
- package/dist/todos/order.js +61 -0
- package/dist/todos/order.js.map +1 -0
- package/dist/todos/projects.d.ts +102 -0
- package/dist/todos/projects.d.ts.map +1 -0
- package/dist/todos/projects.js +342 -0
- package/dist/todos/projects.js.map +1 -0
- package/dist/todos/registry.d.ts +64 -0
- package/dist/todos/registry.d.ts.map +1 -0
- package/dist/todos/registry.js +116 -0
- package/dist/todos/registry.js.map +1 -0
- package/dist/todos/reminderEngine.d.ts +78 -0
- package/dist/todos/reminderEngine.d.ts.map +1 -0
- package/dist/todos/reminderEngine.js +162 -0
- package/dist/todos/reminderEngine.js.map +1 -0
- package/dist/todos/store.d.ts +34 -0
- package/dist/todos/store.d.ts.map +1 -0
- package/dist/todos/store.js +208 -0
- package/dist/todos/store.js.map +1 -0
- package/dist/todos/tools.d.ts +26 -0
- package/dist/todos/tools.d.ts.map +1 -0
- package/dist/todos/tools.js +25 -0
- package/dist/todos/tools.js.map +1 -0
- package/dist/todos/types.d.ts +85 -0
- package/dist/todos/types.d.ts.map +1 -0
- package/dist/todos/types.js +30 -0
- package/dist/todos/types.js.map +1 -0
- package/dist/trackers/taskAgentLimit.d.ts +58 -0
- package/dist/trackers/taskAgentLimit.d.ts.map +1 -0
- package/dist/trackers/taskAgentLimit.js +62 -0
- package/dist/trackers/taskAgentLimit.js.map +1 -0
- package/dist/trackers/taskAgentSlots.d.ts +109 -0
- package/dist/trackers/taskAgentSlots.d.ts.map +1 -0
- package/dist/trackers/taskAgentSlots.js +227 -0
- package/dist/trackers/taskAgentSlots.js.map +1 -0
- package/dist/trackers/types.d.ts +14 -0
- package/dist/trackers/types.d.ts.map +1 -0
- package/dist/trackers/types.js +3 -0
- package/dist/trackers/types.js.map +1 -0
- package/dist/types.d.ts +80 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/adoptReplayGate.d.ts +16 -0
- package/dist/utils/adoptReplayGate.d.ts.map +1 -0
- package/dist/utils/adoptReplayGate.js +35 -0
- package/dist/utils/adoptReplayGate.js.map +1 -0
- package/dist/utils/agentPlugin.d.ts +113 -0
- package/dist/utils/agentPlugin.d.ts.map +1 -0
- package/dist/utils/agentPlugin.js +192 -0
- package/dist/utils/agentPlugin.js.map +1 -0
- package/dist/utils/autoContinueOnLimit.d.ts +7 -4
- package/dist/utils/autoContinueOnLimit.d.ts.map +1 -1
- package/dist/utils/autoContinueOnLimit.js +8 -5
- package/dist/utils/autoContinueOnLimit.js.map +1 -1
- package/dist/utils/botSkills.d.ts +62 -0
- package/dist/utils/botSkills.d.ts.map +1 -0
- package/dist/utils/botSkills.js +53 -0
- package/dist/utils/botSkills.js.map +1 -0
- package/dist/utils/botSkillsSetting.d.ts +7 -0
- package/dist/utils/botSkillsSetting.d.ts.map +1 -0
- package/dist/utils/botSkillsSetting.js +9 -0
- package/dist/utils/botSkillsSetting.js.map +1 -0
- package/dist/utils/claudeCodeVersion.d.ts +7 -0
- package/dist/utils/claudeCodeVersion.d.ts.map +1 -1
- package/dist/utils/claudeCodeVersion.js +14 -1
- package/dist/utils/claudeCodeVersion.js.map +1 -1
- package/dist/utils/claudeCompactHook.d.ts +33 -15
- package/dist/utils/claudeCompactHook.d.ts.map +1 -1
- package/dist/utils/claudeCompactHook.js +36 -17
- package/dist/utils/claudeCompactHook.js.map +1 -1
- package/dist/utils/claudeCompactSummary.d.ts +15 -0
- package/dist/utils/claudeCompactSummary.d.ts.map +1 -0
- package/dist/utils/claudeCompactSummary.js +96 -0
- package/dist/utils/claudeCompactSummary.js.map +1 -0
- package/dist/utils/claudeLimitSwitch.d.ts +11 -9
- package/dist/utils/claudeLimitSwitch.d.ts.map +1 -1
- package/dist/utils/claudeLimitSwitch.js +18 -16
- package/dist/utils/claudeLimitSwitch.js.map +1 -1
- package/dist/utils/claudeProfiles.d.ts +5 -0
- package/dist/utils/claudeProfiles.d.ts.map +1 -1
- package/dist/utils/claudeProfiles.js +14 -0
- package/dist/utils/claudeProfiles.js.map +1 -1
- package/dist/utils/claudeSessionTitle.d.ts +2 -1
- package/dist/utils/claudeSessionTitle.d.ts.map +1 -1
- package/dist/utils/claudeSessionTitle.js +14 -14
- package/dist/utils/claudeSessionTitle.js.map +1 -1
- package/dist/utils/claudeUsage.d.ts +95 -15
- package/dist/utils/claudeUsage.d.ts.map +1 -1
- package/dist/utils/claudeUsage.js +241 -41
- package/dist/utils/claudeUsage.js.map +1 -1
- package/dist/utils/claudeUsageRefresher.d.ts +10 -0
- package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
- package/dist/utils/claudeUsageRefresher.js +11 -0
- package/dist/utils/claudeUsageRefresher.js.map +1 -1
- package/dist/utils/claudeUserEntry.d.ts +50 -0
- package/dist/utils/claudeUserEntry.d.ts.map +1 -0
- package/dist/utils/claudeUserEntry.js +120 -0
- package/dist/utils/claudeUserEntry.js.map +1 -0
- package/dist/utils/clearThreadOutputQueues.d.ts +4 -3
- package/dist/utils/clearThreadOutputQueues.d.ts.map +1 -1
- package/dist/utils/clearThreadOutputQueues.js +1 -1
- package/dist/utils/clearThreadOutputQueues.js.map +1 -1
- package/dist/utils/compactOnIdle.d.ts +33 -13
- package/dist/utils/compactOnIdle.d.ts.map +1 -1
- package/dist/utils/compactOnIdle.js +35 -15
- package/dist/utils/compactOnIdle.js.map +1 -1
- package/dist/utils/fallbackBridge.d.ts +5 -0
- package/dist/utils/fallbackBridge.d.ts.map +1 -1
- package/dist/utils/fallbackBridge.js +19 -3
- package/dist/utils/fallbackBridge.js.map +1 -1
- package/dist/utils/fallbackChain.d.ts +9 -3
- package/dist/utils/fallbackChain.d.ts.map +1 -1
- package/dist/utils/fallbackChain.js +21 -3
- package/dist/utils/fallbackChain.js.map +1 -1
- package/dist/utils/fileSendPlan.d.ts +6 -0
- package/dist/utils/fileSendPlan.d.ts.map +1 -1
- package/dist/utils/fileSendPlan.js +11 -0
- package/dist/utils/fileSendPlan.js.map +1 -1
- package/dist/utils/fileSendService.d.ts +7 -1
- package/dist/utils/fileSendService.d.ts.map +1 -1
- package/dist/utils/fileSendService.js +6 -2
- package/dist/utils/fileSendService.js.map +1 -1
- package/dist/utils/groupFinalizePlan.d.ts +8 -10
- package/dist/utils/groupFinalizePlan.d.ts.map +1 -1
- package/dist/utils/groupFinalizePlan.js +8 -12
- package/dist/utils/groupFinalizePlan.js.map +1 -1
- package/dist/utils/jsonStreamHost.d.ts +13 -0
- package/dist/utils/jsonStreamHost.d.ts.map +1 -1
- package/dist/utils/jsonStreamHost.js +13 -0
- package/dist/utils/jsonStreamHost.js.map +1 -1
- package/dist/utils/messageSendService.d.ts +5 -3
- package/dist/utils/messageSendService.d.ts.map +1 -1
- package/dist/utils/messageSendService.js +12 -5
- package/dist/utils/messageSendService.js.map +1 -1
- package/dist/utils/openCodeCompactPlugin.d.ts +39 -14
- package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -1
- package/dist/utils/openCodeCompactPlugin.js +106 -38
- package/dist/utils/openCodeCompactPlugin.js.map +1 -1
- package/dist/utils/promptDelivery.d.ts +29 -12
- package/dist/utils/promptDelivery.d.ts.map +1 -1
- package/dist/utils/promptDelivery.js +13 -5
- package/dist/utils/promptDelivery.js.map +1 -1
- package/dist/utils/sentKindsSummary.d.ts +10 -0
- package/dist/utils/sentKindsSummary.d.ts.map +1 -0
- package/dist/utils/sentKindsSummary.js +18 -0
- package/dist/utils/sentKindsSummary.js.map +1 -0
- package/dist/utils/telegramError.d.ts +6 -0
- package/dist/utils/telegramError.d.ts.map +1 -1
- package/dist/utils/telegramError.js +12 -0
- package/dist/utils/telegramError.js.map +1 -1
- package/dist/utils/topicView.d.ts +1 -1
- package/dist/utils/topicView.js +1 -1
- package/dist/utils/transcribeAudio.d.ts +10 -0
- package/dist/utils/transcribeAudio.d.ts.map +1 -1
- package/dist/utils/transcribeAudio.js +22 -3
- package/dist/utils/transcribeAudio.js.map +1 -1
- package/dist/utils/transcriptErrorTime.d.ts +8 -0
- package/dist/utils/transcriptErrorTime.d.ts.map +1 -0
- package/dist/utils/transcriptErrorTime.js +56 -0
- package/dist/utils/transcriptErrorTime.js.map +1 -0
- package/dist/utils/wedgeRecovery.d.ts +2 -0
- package/dist/utils/wedgeRecovery.d.ts.map +1 -1
- package/dist/utils/wedgeRecovery.js +1 -1
- package/dist/utils/wedgeRecovery.js.map +1 -1
- package/package.json +11 -3
- package/remoteRun/runner.sh +1242 -0
- package/stt/gigaam_sidecar.py +555 -50
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.describeEnd = describeEnd;
|
|
4
|
+
exports.followForeground = followForeground;
|
|
5
|
+
exports.runExec = runExec;
|
|
6
|
+
const exitCodes_1 = require("./exitCodes");
|
|
7
|
+
const interrupts_1 = require("./interrupts");
|
|
8
|
+
const jobFiles_1 = require("./jobFiles");
|
|
9
|
+
const jobQuery_1 = require("./jobQuery");
|
|
10
|
+
const leaseTiming_1 = require("./leaseTiming");
|
|
11
|
+
const output_1 = require("./output");
|
|
12
|
+
const remoteRunError_1 = require("./remoteRunError");
|
|
13
|
+
const runnerClient_1 = require("./runnerClient");
|
|
14
|
+
const ssh_1 = require("./ssh");
|
|
15
|
+
/**
|
|
16
|
+
* @description A foreground run and `exec`: the live ssh session that owns a job. The session runs the runner script's `lease`, which
|
|
17
|
+
* itself adds the job to Pueue (so no job ever exists without its lease), streams the job's log, and kills the job when the heartbeat
|
|
18
|
+
* byte this side writes stops (a SIGKILLed remote-run, a dead connection — a stock sshd never notices a half-open one). SIGINT, SIGTERM
|
|
19
|
+
* and SIGHUP kill the whole remote job over the shared connection first (TERM, SIGKILL after 10 s on the runner), then exit with the
|
|
20
|
+
* shell's code for the signal; the local `--timeout` does the same and exits 124.
|
|
21
|
+
*/
|
|
22
|
+
/** The reason `runner.sh kill` takes for a kill that is the caller's time limit running out. */
|
|
23
|
+
const killReasonTimeout = 'timeout';
|
|
24
|
+
/** After a kill or an interrupt the lease session ends by itself (the runner's grace time, and as long again); this long before the ssh process is cut. */
|
|
25
|
+
const streamEndGraceMs = 2 * exitCodes_1.killGraceSeconds * 1000;
|
|
26
|
+
/**
|
|
27
|
+
* @description Say why a job ended the way it did (when it is not simply its command's own code) and return remote-run's exit code for it.
|
|
28
|
+
* `runnerStderr` is what the runner script wrote on the session that ran the job: a job it refused at once (`pueue add` failed) has no
|
|
29
|
+
* state to show, and that last line is the only thing that says why.
|
|
30
|
+
*/
|
|
31
|
+
function describeEnd(outcome, jobId, io, runnerStderr = '') {
|
|
32
|
+
if (outcome.state !== 'done') {
|
|
33
|
+
const runnerSaid = (0, runnerClient_1.describeRunnerRefusal)(runnerStderr, '');
|
|
34
|
+
if (runnerSaid !== '')
|
|
35
|
+
(0, output_1.sayOwn)(io, `the runner said: ${runnerSaid}`);
|
|
36
|
+
(0, output_1.sayOwn)(io, `the state of job ${jobId} is unknown (${outcome.state}) — see \`charness remote-run status ${jobId}\``);
|
|
37
|
+
return exitCodes_1.remoteRunExitCodes.failed;
|
|
38
|
+
}
|
|
39
|
+
if (outcome.reason === 'deps-failed')
|
|
40
|
+
(0, output_1.sayOwn)(io, 'the dependencies step failed — its output is above');
|
|
41
|
+
else if (outcome.reason === 'timeout')
|
|
42
|
+
(0, output_1.sayOwn)(io, 'the job timed out and was killed');
|
|
43
|
+
else if (outcome.reason === 'killed')
|
|
44
|
+
(0, output_1.sayOwn)(io, `job ${jobId} was killed`);
|
|
45
|
+
else if (outcome.reason === 'lost')
|
|
46
|
+
(0, output_1.sayOwn)(io, `job ${jobId} ended without a result (its process was lost)`);
|
|
47
|
+
return outcome.code;
|
|
48
|
+
}
|
|
49
|
+
/** @description Follow a staged job in the foreground; resolves with remote-run's exit code. */
|
|
50
|
+
async function followForeground(params) {
|
|
51
|
+
const { client, staged, io } = params;
|
|
52
|
+
const child = client.stream('lease', [staged.slug, staged.jobId, staged.group, `${params.leaseMs}`]);
|
|
53
|
+
const router = (0, output_1.createJobOutputRouter)(io);
|
|
54
|
+
let sshStderr = '';
|
|
55
|
+
child.stdout.setEncoding('utf8');
|
|
56
|
+
child.stderr.setEncoding('utf8');
|
|
57
|
+
child.stdout.on('data', (chunk) => router.write(chunk));
|
|
58
|
+
child.stderr.on('data', (chunk) => { sshStderr += chunk; });
|
|
59
|
+
child.stdin.on('error', () => { });
|
|
60
|
+
let interrupt = null;
|
|
61
|
+
let isTimedOut = false;
|
|
62
|
+
let killing = null;
|
|
63
|
+
const closed = (0, interrupts_1.waitForChildEnd)(child, () => killing !== null);
|
|
64
|
+
const writeHeartbeat = () => {
|
|
65
|
+
child.stdin.write('h');
|
|
66
|
+
};
|
|
67
|
+
writeHeartbeat();
|
|
68
|
+
const heartbeatTimer = setInterval(writeHeartbeat, (0, leaseTiming_1.getHeartbeatIntervalMs)(params.leaseMs));
|
|
69
|
+
const killJob = () => {
|
|
70
|
+
killing ??= (async () => {
|
|
71
|
+
clearInterval(heartbeatTimer);
|
|
72
|
+
// A kill because the limit ran out is recorded as the limit (124), as the runner's own watchdog records it when it gets there first.
|
|
73
|
+
await client.call('kill', [staged.slug, staged.jobId, ...(isTimedOut ? [killReasonTimeout] : [])], { timeoutMs: interrupts_1.killCallTimeoutMs });
|
|
74
|
+
setTimeout(() => child.kill('SIGKILL'), streamEndGraceMs).unref();
|
|
75
|
+
})();
|
|
76
|
+
return killing;
|
|
77
|
+
};
|
|
78
|
+
const removeSignalHandlers = (0, interrupts_1.addInterruptHandler)((signal) => {
|
|
79
|
+
interrupt ??= signal;
|
|
80
|
+
void killJob();
|
|
81
|
+
});
|
|
82
|
+
const timeoutTimer = setTimeout(() => {
|
|
83
|
+
isTimedOut = true;
|
|
84
|
+
void killJob();
|
|
85
|
+
}, staged.timeoutSeconds * 1000);
|
|
86
|
+
await closed;
|
|
87
|
+
clearInterval(heartbeatTimer);
|
|
88
|
+
clearTimeout(timeoutTimer);
|
|
89
|
+
removeSignalHandlers();
|
|
90
|
+
router.flush();
|
|
91
|
+
if (killing !== null)
|
|
92
|
+
await killing;
|
|
93
|
+
if (interrupt !== null) {
|
|
94
|
+
(0, output_1.sayOwn)(io, `interrupted — job ${staged.jobId} was stopped on ${client.runner.name}`);
|
|
95
|
+
return (0, exitCodes_1.planInterrupt)(interrupt).exitCode;
|
|
96
|
+
}
|
|
97
|
+
let result;
|
|
98
|
+
try {
|
|
99
|
+
result = await (0, jobQuery_1.readJobOutcome)(client, staged.slug, staged.jobId);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const detail = error instanceof Error ? error.message : 'no answer';
|
|
103
|
+
(0, output_1.sayOwn)(io, `lost the connection to ${client.runner.name} (${sshStderr.trim().split('\n').pop() || detail}); the runner stops job ${staged.jobId} itself when its lease runs out`);
|
|
104
|
+
return exitCodes_1.remoteRunExitCodes.failed;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
await (0, jobFiles_1.fetchJobFiles)({ client, facts: result.facts, jobId: staged.jobId, target: params.target, io });
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
(0, output_1.sayOwn)(io, error instanceof remoteRunError_1.RemoteRunError ? error.message : 'the result files could not be fetched');
|
|
111
|
+
}
|
|
112
|
+
if (isTimedOut) {
|
|
113
|
+
(0, output_1.sayOwn)(io, `timed out after ${staged.timeoutSeconds}s — job ${staged.jobId} was killed`);
|
|
114
|
+
return exitCodes_1.remoteRunExitCodes.timedOut;
|
|
115
|
+
}
|
|
116
|
+
return describeEnd(result.outcome, staged.jobId, io, sshStderr);
|
|
117
|
+
}
|
|
118
|
+
/** @description Run a one-off command in the runner's copy under the same lease; resolves with the command's exit code. */
|
|
119
|
+
async function runExec(params) {
|
|
120
|
+
const { client, io } = params;
|
|
121
|
+
const child = client.stream('exec', [params.slug, params.subfolder, `${params.leaseMs}`, params.command]);
|
|
122
|
+
child.stdout.setEncoding('utf8');
|
|
123
|
+
child.stderr.setEncoding('utf8');
|
|
124
|
+
child.stdout.on('data', (chunk) => io.stdout(chunk));
|
|
125
|
+
const stderr = (0, output_1.createExitMarkerFilter)(io.stderr);
|
|
126
|
+
child.stderr.on('data', (chunk) => stderr.write(chunk));
|
|
127
|
+
child.stdin.on('error', () => { });
|
|
128
|
+
let interrupt = null;
|
|
129
|
+
const closed = (0, interrupts_1.waitForChildEnd)(child, () => interrupt !== null);
|
|
130
|
+
const writeHeartbeat = () => {
|
|
131
|
+
child.stdin.write('h');
|
|
132
|
+
};
|
|
133
|
+
writeHeartbeat();
|
|
134
|
+
const heartbeatTimer = setInterval(writeHeartbeat, (0, leaseTiming_1.getHeartbeatIntervalMs)(params.leaseMs));
|
|
135
|
+
const removeSignalHandlers = (0, interrupts_1.addInterruptHandler)((signal) => {
|
|
136
|
+
interrupt ??= signal;
|
|
137
|
+
clearInterval(heartbeatTimer);
|
|
138
|
+
// The end of the stream without a "done" byte is what makes the runner kill the command's group.
|
|
139
|
+
child.stdin.end();
|
|
140
|
+
setTimeout(() => child.kill('SIGKILL'), streamEndGraceMs).unref();
|
|
141
|
+
});
|
|
142
|
+
const exitCode = await closed;
|
|
143
|
+
clearInterval(heartbeatTimer);
|
|
144
|
+
removeSignalHandlers();
|
|
145
|
+
stderr.flush();
|
|
146
|
+
if (interrupt !== null)
|
|
147
|
+
return (0, exitCodes_1.planInterrupt)(interrupt).exitCode;
|
|
148
|
+
// The command's own code, as the runner reported it: a command that exits 255 is not a lost connection. Without the report the session
|
|
149
|
+
// died before the command ended, or ssh itself failed.
|
|
150
|
+
const reportedCode = stderr.getExitCode();
|
|
151
|
+
if (reportedCode !== null)
|
|
152
|
+
return reportedCode;
|
|
153
|
+
if ((0, ssh_1.checkIsConnectionLost)(exitCode)) {
|
|
154
|
+
(0, output_1.sayOwn)(io, `the connection to ${client.runner.name} failed while the command ran`);
|
|
155
|
+
return exitCodes_1.remoteRunExitCodes.failed;
|
|
156
|
+
}
|
|
157
|
+
return exitCode ?? exitCodes_1.remoteRunExitCodes.failed;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=foreground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foreground.js","sourceRoot":"","sources":["../../src/remoteRun/foreground.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ChildProcess } from 'child_process';
|
|
2
|
+
import { type InterruptSignal } from './exitCodes';
|
|
3
|
+
export declare const killCallTimeoutMs: number;
|
|
4
|
+
/**
|
|
5
|
+
* @description Run `handler` for SIGINT, SIGTERM and SIGHUP — a listener also keeps Node from ending the process by itself, so the
|
|
6
|
+
* command decides how it ends (kill the remote job first). Returns the function that removes the listeners.
|
|
7
|
+
*/
|
|
8
|
+
export declare function addInterruptHandler(handler: (signal: InterruptSignal) => void): () => void;
|
|
9
|
+
/**
|
|
10
|
+
* @description Resolves with the exit code when `child` has ended. Normally that is its `close` (the process is gone AND its output
|
|
11
|
+
* has been read to the end). Once `getIsStopped()` says the caller ended it on purpose, its `exit` is enough and the caller's end of
|
|
12
|
+
* its pipes is released: an ssh client that shares a master connection passes its stdio to the master, which keeps those pipes open
|
|
13
|
+
* until the REMOTE command ends — so after a kill the process is dead, `close` never comes, and the command would hang for as long as
|
|
14
|
+
* the remote side runs (hours, for a `wait`).
|
|
15
|
+
*/
|
|
16
|
+
export declare function waitForChildEnd(child: ChildProcess, getIsStopped: () => boolean): Promise<number | null>;
|
|
17
|
+
//# sourceMappingURL=interrupts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupts.d.ts","sourceRoot":"","sources":["../../src/remoteRun/interrupts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAsC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAIvF,eAAO,MAAM,iBAAiB,QAAoD,CAAC;AAEnF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAO1F;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUxG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.killCallTimeoutMs = void 0;
|
|
4
|
+
exports.addInterruptHandler = addInterruptHandler;
|
|
5
|
+
exports.waitForChildEnd = waitForChildEnd;
|
|
6
|
+
const exitCodes_1 = require("./exitCodes");
|
|
7
|
+
/** A `kill` call waits for the runner's grace time, then its own SIGKILL and the call itself. */
|
|
8
|
+
const killCallMarginSeconds = 30;
|
|
9
|
+
exports.killCallTimeoutMs = (exitCodes_1.killGraceSeconds + killCallMarginSeconds) * 1000;
|
|
10
|
+
/**
|
|
11
|
+
* @description Run `handler` for SIGINT, SIGTERM and SIGHUP — a listener also keeps Node from ending the process by itself, so the
|
|
12
|
+
* command decides how it ends (kill the remote job first). Returns the function that removes the listeners.
|
|
13
|
+
*/
|
|
14
|
+
function addInterruptHandler(handler) {
|
|
15
|
+
const listeners = exitCodes_1.interruptSignals.map((signal) => {
|
|
16
|
+
const listener = () => handler(signal);
|
|
17
|
+
process.on(signal, listener);
|
|
18
|
+
return { signal, listener };
|
|
19
|
+
});
|
|
20
|
+
return () => listeners.forEach(({ signal, listener }) => process.off(signal, listener));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @description Resolves with the exit code when `child` has ended. Normally that is its `close` (the process is gone AND its output
|
|
24
|
+
* has been read to the end). Once `getIsStopped()` says the caller ended it on purpose, its `exit` is enough and the caller's end of
|
|
25
|
+
* its pipes is released: an ssh client that shares a master connection passes its stdio to the master, which keeps those pipes open
|
|
26
|
+
* until the REMOTE command ends — so after a kill the process is dead, `close` never comes, and the command would hang for as long as
|
|
27
|
+
* the remote side runs (hours, for a `wait`).
|
|
28
|
+
*/
|
|
29
|
+
function waitForChildEnd(child, getIsStopped) {
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
child.once('close', (exitCode) => resolve(exitCode));
|
|
32
|
+
child.once('exit', (exitCode) => {
|
|
33
|
+
if (!getIsStopped())
|
|
34
|
+
return;
|
|
35
|
+
child.stdout?.destroy();
|
|
36
|
+
child.stderr?.destroy();
|
|
37
|
+
resolve(exitCode);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=interrupts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../../src/remoteRun/interrupts.ts"],"names":[],"mappings":";;;AAWA,kDAOC;AASD,0CAUC;AApCD,2CAAuF;AAEvF,iGAAiG;AACjG,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACpB,QAAA,iBAAiB,GAAG,CAAC,4BAAgB,GAAG,qBAAqB,CAAC,GAAG,IAAI,CAAC;AAEnF;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,OAA0C;IAC5E,MAAM,SAAS,GAAG,4BAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAChD,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,KAAmB,EAAE,YAA2B;IAC9E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC9B,IAAI,CAAC,YAAY,EAAE;gBAAE,OAAO;YAC5B,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { JobFacts } from './jobState';
|
|
2
|
+
import { type CliIo } from './output';
|
|
3
|
+
import type { RunnerClient } from './runnerClient';
|
|
4
|
+
import type { LocalJobRecord } from './jobRecords';
|
|
5
|
+
/**
|
|
6
|
+
* @description Bring a finished job's result files back. The job kept them on the runner under `jobs/<job>/artifacts/` (only what it
|
|
7
|
+
* created or changed and `pull:` names); they are rsynced without symlinks into a temp folder and copied into the project by
|
|
8
|
+
* `safeCopy.ts`. The project is the one the job was submitted from, as the MAIN BOX recorded it (`jobRecords.ts`) — never what the
|
|
9
|
+
* runner says — and the `pull:` patterns are those of that project's LOCAL `.remote-run`.
|
|
10
|
+
*/
|
|
11
|
+
export interface FetchTarget {
|
|
12
|
+
root: string;
|
|
13
|
+
/** The project's folder name on the runner, from the local record. */
|
|
14
|
+
slug: string;
|
|
15
|
+
patterns: string[];
|
|
16
|
+
/** Folders of the project git takes hooks from (`getHookDirectories`): nothing a runner returns lands in them. */
|
|
17
|
+
hookDirectories: string[];
|
|
18
|
+
}
|
|
19
|
+
/** @description The target for the project at `root`: its hook folders are read now, from the project's own git configuration. */
|
|
20
|
+
export declare function createFetchTarget(root: string, slug: string, patterns: string[]): FetchTarget;
|
|
21
|
+
/** @description The local project a job's files go back to, from the local record; an error says why there is none. */
|
|
22
|
+
export declare function resolveFetchTarget(record: LocalJobRecord | null): FetchTarget;
|
|
23
|
+
/** @description Fetch `jobId`'s result files into `target`; says how many came back. A job with none, or a project that names none, is not an error. */
|
|
24
|
+
export declare function fetchJobFiles(params: {
|
|
25
|
+
client: RunnerClient;
|
|
26
|
+
facts: JobFacts;
|
|
27
|
+
jobId: string;
|
|
28
|
+
target: FetchTarget;
|
|
29
|
+
io: Pick<CliIo, 'stderr'>;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=jobFiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobFiles.d.ts","sourceRoot":"","sources":["../../src/remoteRun/jobFiles.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAU,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAI9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kHAAkH;IAClH,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,kIAAkI;AAClI,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,CAE7F;AAED,uHAAuH;AACvH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,WAAW,CAI7E;AAED,wJAAwJ;AACxJ,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnK"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createFetchTarget = createFetchTarget;
|
|
37
|
+
exports.resolveFetchTarget = resolveFetchTarget;
|
|
38
|
+
exports.fetchJobFiles = fetchJobFiles;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const output_1 = require("./output");
|
|
43
|
+
const project_1 = require("./project");
|
|
44
|
+
const remoteRunError_1 = require("./remoteRunError");
|
|
45
|
+
const rsync_1 = require("./rsync");
|
|
46
|
+
const safeCopy_1 = require("./safeCopy");
|
|
47
|
+
const sendPlan_1 = require("./sendPlan");
|
|
48
|
+
/** @description The target for the project at `root`: its hook folders are read now, from the project's own git configuration. */
|
|
49
|
+
function createFetchTarget(root, slug, patterns) {
|
|
50
|
+
return { root, slug, patterns, hookDirectories: (0, project_1.getHookDirectories)(root) };
|
|
51
|
+
}
|
|
52
|
+
/** @description The local project a job's files go back to, from the local record; an error says why there is none. */
|
|
53
|
+
function resolveFetchTarget(record) {
|
|
54
|
+
if (record === null)
|
|
55
|
+
throw new remoteRunError_1.RemoteRunError('this machine did not submit the job as this user (or its record is gone) — its files are not fetched');
|
|
56
|
+
if (!fs.existsSync(record.projectRoot) || !fs.statSync(record.projectRoot).isDirectory())
|
|
57
|
+
throw new remoteRunError_1.RemoteRunError(`the job's project folder is gone from this machine: ${record.projectRoot}`);
|
|
58
|
+
return createFetchTarget(record.projectRoot, record.slug, (0, project_1.readProjectConfig)(record.projectRoot).pull);
|
|
59
|
+
}
|
|
60
|
+
/** @description Fetch `jobId`'s result files into `target`; says how many came back. A job with none, or a project that names none, is not an error. */
|
|
61
|
+
async function fetchJobFiles(params) {
|
|
62
|
+
const { client, facts, target } = params;
|
|
63
|
+
if (!facts.isWithArtifacts || target.patterns.length === 0)
|
|
64
|
+
return;
|
|
65
|
+
const workDir = await client.getAbsoluteWorkDir();
|
|
66
|
+
const fetchedRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'remote-run-files-'));
|
|
67
|
+
try {
|
|
68
|
+
const fetched = await (0, rsync_1.runRsync)((0, sendPlan_1.buildRsyncFetchArgs)({
|
|
69
|
+
sshCommand: client.rsyncSshCommand,
|
|
70
|
+
source: `${client.runner.ssh}:${workDir}/p/${target.slug}/jobs/${params.jobId}/artifacts`,
|
|
71
|
+
destinationDirectory: fetchedRoot,
|
|
72
|
+
}));
|
|
73
|
+
if (!fetched.isOk)
|
|
74
|
+
throw new remoteRunError_1.RemoteRunError(`fetching the result files from "${client.runner.name}" failed — ${fetched.errorTail}`);
|
|
75
|
+
const copied = (0, safeCopy_1.copyFetchedFiles)({ fetchedRoot, projectRoot: target.root, patterns: target.patterns, hookDirectories: target.hookDirectories });
|
|
76
|
+
if (copied.copied.length > 0 || copied.refusedCount > 0) {
|
|
77
|
+
(0, output_1.sayOwn)(params.io, `${copied.copied.length} result file${copied.copied.length === 1 ? '' : 's'} came back${copied.refusedCount > 0 ? `, ${copied.refusedCount} refused (not a regular file a "pull:" pattern names, or inside a .git, the project's .remote-run or a git hooks folder)` : ''}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
fs.rmSync(fetchedRoot, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=jobFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobFiles.js","sourceRoot":"","sources":["../../src/remoteRun/jobFiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type JobFacts, type JobOutcome } from './jobState';
|
|
2
|
+
import type { JobMeta } from './jobMeta';
|
|
3
|
+
/** @description `45s`, `3m12s`, `2h05m`, `1d3h`. */
|
|
4
|
+
export declare function formatDuration(totalSeconds: number): string;
|
|
5
|
+
/** @description `just now`, `5m ago`, `2h ago`, `3d ago`. */
|
|
6
|
+
export declare function formatAge(elapsedSeconds: number): string;
|
|
7
|
+
export interface JobEntry {
|
|
8
|
+
meta: JobMeta;
|
|
9
|
+
facts: JobFacts;
|
|
10
|
+
outcome: JobOutcome;
|
|
11
|
+
}
|
|
12
|
+
/** @description The lines of `ls`: columns aligned, newest job first. */
|
|
13
|
+
export declare function formatJobList(entries: readonly JobEntry[], nowMs: number): string[];
|
|
14
|
+
/** @description The block of `status <id>`. */
|
|
15
|
+
export declare function formatJobStatus(entry: JobEntry, nowMs: number): string;
|
|
16
|
+
//# sourceMappingURL=jobFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobFormat.d.ts","sourceRoot":"","sources":["../../src/remoteRun/jobFormat.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAMxD;AAMD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;CACrB;AAuBD,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBnF;AAED,+CAA+C;AAC/C,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBtE"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.formatDuration = formatDuration;
|
|
37
|
+
exports.formatAge = formatAge;
|
|
38
|
+
exports.formatJobList = formatJobList;
|
|
39
|
+
exports.formatJobStatus = formatJobStatus;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const jobState_1 = require("./jobState");
|
|
42
|
+
/**
|
|
43
|
+
* @description How `ls` and `status` show a job: one aligned line per job newest first, and a short block for one. Times are UTC and
|
|
44
|
+
* written out (`2026-10-31 22:10 UTC`), ages and durations short (`3m12s`, `2h ago`).
|
|
45
|
+
*/
|
|
46
|
+
const secondsPerMinute = 60;
|
|
47
|
+
const secondsPerHour = 3600;
|
|
48
|
+
const secondsPerDay = 86400;
|
|
49
|
+
const commandColumnLimit = 70;
|
|
50
|
+
const twoDigits = 2;
|
|
51
|
+
/** @description `45s`, `3m12s`, `2h05m`, `1d3h`. */
|
|
52
|
+
function formatDuration(totalSeconds) {
|
|
53
|
+
const seconds = Math.max(0, Math.round(totalSeconds));
|
|
54
|
+
if (seconds < secondsPerMinute)
|
|
55
|
+
return `${seconds}s`;
|
|
56
|
+
if (seconds < secondsPerHour)
|
|
57
|
+
return `${Math.floor(seconds / secondsPerMinute)}m${(seconds % secondsPerMinute).toString().padStart(twoDigits, '0')}s`;
|
|
58
|
+
if (seconds < secondsPerDay)
|
|
59
|
+
return `${Math.floor(seconds / secondsPerHour)}h${Math.floor((seconds % secondsPerHour) / secondsPerMinute).toString().padStart(twoDigits, '0')}m`;
|
|
60
|
+
return `${Math.floor(seconds / secondsPerDay)}d${Math.floor((seconds % secondsPerDay) / secondsPerHour)}h`;
|
|
61
|
+
}
|
|
62
|
+
/** @description `just now`, `5m ago`, `2h ago`, `3d ago`. */
|
|
63
|
+
function formatAge(elapsedSeconds) {
|
|
64
|
+
const seconds = Math.max(0, Math.round(elapsedSeconds));
|
|
65
|
+
if (seconds < secondsPerMinute)
|
|
66
|
+
return 'just now';
|
|
67
|
+
if (seconds < secondsPerHour)
|
|
68
|
+
return `${Math.floor(seconds / secondsPerMinute)}m ago`;
|
|
69
|
+
if (seconds < secondsPerDay)
|
|
70
|
+
return `${Math.floor(seconds / secondsPerHour)}h ago`;
|
|
71
|
+
return `${Math.floor(seconds / secondsPerDay)}d ago`;
|
|
72
|
+
}
|
|
73
|
+
function formatTimestamp(milliseconds) {
|
|
74
|
+
return `${new Date(milliseconds).toISOString().slice(0, 16).replace('T', ' ')} UTC`;
|
|
75
|
+
}
|
|
76
|
+
function getProjectLabel(meta) {
|
|
77
|
+
const name = path.basename(meta.projectRoot);
|
|
78
|
+
return meta.subfolder === '' ? name : `${name}/${meta.subfolder}`;
|
|
79
|
+
}
|
|
80
|
+
/** The seconds the job has run (or ran): from its own start to its end, or to now while it runs. */
|
|
81
|
+
function getRunSeconds(entry, nowMs) {
|
|
82
|
+
if (entry.facts.startedAtSeconds === null)
|
|
83
|
+
return null;
|
|
84
|
+
const endSeconds = entry.facts.finishedAtSeconds ?? Math.floor(nowMs / 1000);
|
|
85
|
+
return endSeconds - entry.facts.startedAtSeconds;
|
|
86
|
+
}
|
|
87
|
+
function getExitText(outcome) {
|
|
88
|
+
return outcome.state === 'done' ? `exit ${outcome.code}` : '';
|
|
89
|
+
}
|
|
90
|
+
function truncate(text, limit) {
|
|
91
|
+
const singleLine = text.replace(/\s+/g, ' ');
|
|
92
|
+
return singleLine.length > limit ? `${singleLine.slice(0, limit - 1)}…` : singleLine;
|
|
93
|
+
}
|
|
94
|
+
/** @description The lines of `ls`: columns aligned, newest job first. */
|
|
95
|
+
function formatJobList(entries, nowMs) {
|
|
96
|
+
const sorted = [...entries].sort((first, second) => second.meta.submittedAtMs - first.meta.submittedAtMs);
|
|
97
|
+
const rows = sorted.map((entry) => {
|
|
98
|
+
const runSeconds = getRunSeconds(entry, nowMs);
|
|
99
|
+
return [
|
|
100
|
+
entry.meta.id,
|
|
101
|
+
(0, jobState_1.describeJobState)(entry.outcome),
|
|
102
|
+
getExitText(entry.outcome),
|
|
103
|
+
runSeconds === null ? '' : formatDuration(runSeconds),
|
|
104
|
+
formatAge((nowMs - entry.meta.submittedAtMs) / 1000),
|
|
105
|
+
getProjectLabel(entry.meta),
|
|
106
|
+
truncate(entry.meta.command, commandColumnLimit),
|
|
107
|
+
];
|
|
108
|
+
});
|
|
109
|
+
const widths = rows.length === 0 ? [] : rows[0].map((_, column) => Math.max(...rows.map((row) => row[column].length)));
|
|
110
|
+
return rows.map((row) => row.map((cell, column) => (column === row.length - 1 ? cell : cell.padEnd(widths[column]))).join(' ').trimEnd());
|
|
111
|
+
}
|
|
112
|
+
/** @description The block of `status <id>`. */
|
|
113
|
+
function formatJobStatus(entry, nowMs) {
|
|
114
|
+
const runSeconds = getRunSeconds(entry, nowMs);
|
|
115
|
+
const state = (0, jobState_1.describeJobState)(entry.outcome);
|
|
116
|
+
const exitText = getExitText(entry.outcome);
|
|
117
|
+
const times = [
|
|
118
|
+
`submitted ${formatTimestamp(entry.meta.submittedAtMs)}`,
|
|
119
|
+
entry.facts.startedAtSeconds === null ? 'not started' : `started ${formatTimestamp(entry.facts.startedAtSeconds * 1000)}`,
|
|
120
|
+
runSeconds === null ? null : `${entry.outcome.state === 'running' ? 'running for' : 'took'} ${formatDuration(runSeconds)}`,
|
|
121
|
+
].filter((part) => part !== null);
|
|
122
|
+
return [
|
|
123
|
+
`job ${entry.meta.id} — ${state}${exitText === '' ? '' : ` (${exitText})`}`,
|
|
124
|
+
` runner: ${entry.meta.runner}`,
|
|
125
|
+
` project: ${getProjectLabel(entry.meta)}`,
|
|
126
|
+
` command: ${entry.meta.command}`,
|
|
127
|
+
` ${times.join(' · ')}`,
|
|
128
|
+
].join('\n');
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=jobFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobFormat.js","sourceRoot":"","sources":["../../src/remoteRun/jobFormat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const pueueLabelPrefix = "rr-";
|
|
2
|
+
/** @description A fresh id for a job that goes to `runnerName`. `random` is injectable for the tests. */
|
|
3
|
+
export declare function createJobId(runnerName: string, random?: (size: number) => Buffer): string;
|
|
4
|
+
/** @description The runner name inside a job id, or `null` when `text` is not a job id. */
|
|
5
|
+
export declare function parseJobId(text: string): {
|
|
6
|
+
runnerName: string;
|
|
7
|
+
} | null;
|
|
8
|
+
/** @description The Pueue label that ties a Pueue task to its job. */
|
|
9
|
+
export declare function getJobLabel(jobId: string): string;
|
|
10
|
+
/** @description The runner-side folder name of the project at `projectRoot` for this main-box user. */
|
|
11
|
+
export declare function getProjectSlug(projectRoot: string, owner: {
|
|
12
|
+
hostname: string;
|
|
13
|
+
uid: number;
|
|
14
|
+
}): string;
|
|
15
|
+
//# sourceMappingURL=jobId.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobId.d.ts","sourceRoot":"","sources":["../../src/remoteRun/jobId.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAItC,yGAAyG;AACzG,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAoB,GAAG,MAAM,CAStG;AAED,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGtE;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,uGAAuG;AACvG,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAIpG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.pueueLabelPrefix = void 0;
|
|
37
|
+
exports.createJobId = createJobId;
|
|
38
|
+
exports.parseJobId = parseJobId;
|
|
39
|
+
exports.getJobLabel = getJobLabel;
|
|
40
|
+
exports.getProjectSlug = getProjectSlug;
|
|
41
|
+
const crypto_1 = require("crypto");
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
/**
|
|
44
|
+
* @description Job ids and project slugs.
|
|
45
|
+
*
|
|
46
|
+
* A job id is `<runner>-<6 base32>`, made on the main box and stored on the runner as the Pueue label `rr-<id>` (Pueue's own ids
|
|
47
|
+
* restart after a reset, so they never name a job). The project slug names the runner-side copy of a project:
|
|
48
|
+
* `<basename>-<10 hex of sha256(hostname:uid:absolute root)>` — two main-box users or two checkouts of one project never share a copy.
|
|
49
|
+
*/
|
|
50
|
+
const base32Alphabet = 'abcdefghijklmnopqrstuvwxyz234567';
|
|
51
|
+
const jobSuffixLength = 6;
|
|
52
|
+
const slugHashLength = 10;
|
|
53
|
+
const slugBasenameMaxLength = 40;
|
|
54
|
+
const bitsPerBase32Digit = 5;
|
|
55
|
+
const bitMask = 0b11111;
|
|
56
|
+
const bytesPerSuffix = 4;
|
|
57
|
+
exports.pueueLabelPrefix = 'rr-';
|
|
58
|
+
const jobIdPattern = /^([a-z0-9]+(?:-[a-z0-9]+)*)-([a-z2-7]{6})$/;
|
|
59
|
+
/** @description A fresh id for a job that goes to `runnerName`. `random` is injectable for the tests. */
|
|
60
|
+
function createJobId(runnerName, random = crypto_1.randomBytes) {
|
|
61
|
+
const bytes = random(bytesPerSuffix);
|
|
62
|
+
let value = bytes.readUInt32BE(0);
|
|
63
|
+
let suffix = '';
|
|
64
|
+
for (let digit = 0; digit < jobSuffixLength; digit += 1) {
|
|
65
|
+
suffix += base32Alphabet[value & bitMask];
|
|
66
|
+
value = Math.floor(value / 2 ** bitsPerBase32Digit);
|
|
67
|
+
}
|
|
68
|
+
return `${runnerName}-${suffix}`;
|
|
69
|
+
}
|
|
70
|
+
/** @description The runner name inside a job id, or `null` when `text` is not a job id. */
|
|
71
|
+
function parseJobId(text) {
|
|
72
|
+
const match = jobIdPattern.exec(text);
|
|
73
|
+
return match === null ? null : { runnerName: match[1] };
|
|
74
|
+
}
|
|
75
|
+
/** @description The Pueue label that ties a Pueue task to its job. */
|
|
76
|
+
function getJobLabel(jobId) {
|
|
77
|
+
return `${exports.pueueLabelPrefix}${jobId}`;
|
|
78
|
+
}
|
|
79
|
+
/** @description The runner-side folder name of the project at `projectRoot` for this main-box user. */
|
|
80
|
+
function getProjectSlug(projectRoot, owner) {
|
|
81
|
+
const baseName = path.basename(projectRoot).replace(/[^A-Za-z0-9._-]/g, '_').replace(/^\.+/, '_').slice(0, slugBasenameMaxLength) || 'project';
|
|
82
|
+
const hash = (0, crypto_1.createHash)('sha256').update(`${owner.hostname}:${owner.uid}:${projectRoot}`).digest('hex').slice(0, slugHashLength);
|
|
83
|
+
return `${baseName}-${hash}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=jobId.js.map
|