waterplane 0.1.14 → 0.1.16
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 +44 -0
- package/README.md +4 -1
- package/node_modules/@waterplane/shared/dist/agentfiles.js +25 -2
- package/node_modules/@waterplane/shared/dist/agentfiles.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/alwaysonwords.d.ts +11 -0
- package/node_modules/@waterplane/shared/dist/alwaysonwords.js +19 -1
- package/node_modules/@waterplane/shared/dist/alwaysonwords.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/artifacts.js +5 -1
- package/node_modules/@waterplane/shared/dist/artifacts.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/askrules.d.ts +0 -13
- package/node_modules/@waterplane/shared/dist/askrules.js +2 -1
- package/node_modules/@waterplane/shared/dist/askrules.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/block.d.ts +114 -0
- package/node_modules/@waterplane/shared/dist/block.js +104 -0
- package/node_modules/@waterplane/shared/dist/block.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/buildscan.d.ts +16 -0
- package/node_modules/@waterplane/shared/dist/buildscan.js +73 -7
- package/node_modules/@waterplane/shared/dist/buildscan.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/claudeconfig.js +2 -1
- package/node_modules/@waterplane/shared/dist/claudeconfig.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/clihealth/healthfixture.js +1 -1
- package/node_modules/@waterplane/shared/dist/clihealth/healthfixture.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/clirestart.js +23 -1
- package/node_modules/@waterplane/shared/dist/clirestart.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/desktopfiles.js +2 -1
- package/node_modules/@waterplane/shared/dist/desktopfiles.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/dictate.js +1 -1
- package/node_modules/@waterplane/shared/dist/dictate.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/exposure.js +1 -0
- package/node_modules/@waterplane/shared/dist/exposure.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/followup.d.ts +1 -1
- package/node_modules/@waterplane/shared/dist/followup.js +8 -6
- package/node_modules/@waterplane/shared/dist/followup.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/hints.js +4 -3
- package/node_modules/@waterplane/shared/dist/hints.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/hosturl.d.ts +0 -24
- package/node_modules/@waterplane/shared/dist/hosturl.js +3 -2
- package/node_modules/@waterplane/shared/dist/hosturl.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/index.d.ts +11 -3
- package/node_modules/@waterplane/shared/dist/index.js +11 -3
- package/node_modules/@waterplane/shared/dist/index.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/installrow.d.ts +156 -0
- package/node_modules/@waterplane/shared/dist/installrow.js +261 -0
- package/node_modules/@waterplane/shared/dist/installrow.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/intent/types.d.ts +6 -0
- package/node_modules/@waterplane/shared/dist/intent/types.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/intent/words.d.ts +2 -1
- package/node_modules/@waterplane/shared/dist/intent/words.js +7 -2
- package/node_modules/@waterplane/shared/dist/intent/words.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/itempaths.d.ts +0 -10
- package/node_modules/@waterplane/shared/dist/itempaths.js +30 -3
- package/node_modules/@waterplane/shared/dist/itempaths.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/lineartrim.d.ts +11 -0
- package/node_modules/@waterplane/shared/dist/lineartrim.js +22 -0
- package/node_modules/@waterplane/shared/dist/lineartrim.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/netretry.d.ts +23 -2
- package/node_modules/@waterplane/shared/dist/netretry.js +24 -5
- package/node_modules/@waterplane/shared/dist/netretry.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/pairing.js +2 -1
- package/node_modules/@waterplane/shared/dist/pairing.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/peer.js +2 -1
- package/node_modules/@waterplane/shared/dist/peer.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/plugin/api.d.ts +8 -0
- package/node_modules/@waterplane/shared/dist/plugin/manifest.d.ts +23 -0
- package/node_modules/@waterplane/shared/dist/plugin/manifest.js +8 -0
- package/node_modules/@waterplane/shared/dist/plugin/manifest.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/plugin/version.d.ts +5 -1
- package/node_modules/@waterplane/shared/dist/plugin/version.js +5 -1
- package/node_modules/@waterplane/shared/dist/plugin/version.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/queue/queuelane.d.ts +23 -2
- package/node_modules/@waterplane/shared/dist/queue/queuelane.js +16 -4
- package/node_modules/@waterplane/shared/dist/queue/queuelane.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/queue/queueserial.js +5 -3
- package/node_modules/@waterplane/shared/dist/queue/queueserial.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/requirements.js +5 -1
- package/node_modules/@waterplane/shared/dist/requirements.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/schedule/schedrule.d.ts +3 -0
- package/node_modules/@waterplane/shared/dist/schedule/schedrule.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/sessionwindow.d.ts +25 -0
- package/node_modules/@waterplane/shared/dist/sessionwindow.js +24 -0
- package/node_modules/@waterplane/shared/dist/sessionwindow.js.map +1 -0
- package/node_modules/@waterplane/shared/dist/statedir.js +2 -1
- package/node_modules/@waterplane/shared/dist/statedir.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/themeoverlay.js +1 -1
- package/node_modules/@waterplane/shared/dist/themeoverlay.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/urls.js +1 -1
- package/node_modules/@waterplane/shared/dist/urls.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/wire/backend.d.ts +8 -0
- package/node_modules/@waterplane/shared/dist/wire/install.d.ts +5 -110
- package/node_modules/@waterplane/shared/dist/wire/install.js +0 -28
- package/node_modules/@waterplane/shared/dist/wire/install.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/wire/messages/clienthost.d.ts +1 -25
- package/node_modules/@waterplane/shared/dist/wire/messages/clientsession.d.ts +15 -0
- package/node_modules/@waterplane/shared/dist/wire/messages/hosttools.d.ts +0 -10
- package/node_modules/@waterplane/shared/dist/wire/notify.d.ts +13 -1
- package/node_modules/@waterplane/shared/dist/wire/notify.js +9 -2
- package/node_modules/@waterplane/shared/dist/wire/notify.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/wire/repo.js +1 -1
- package/node_modules/@waterplane/shared/dist/wire/repo.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/wire/sent.d.ts +8 -1
- package/node_modules/@waterplane/shared/dist/wire/session/info.d.ts +29 -3
- package/node_modules/@waterplane/shared/dist/wire/session/launch.d.ts +44 -3
- package/node_modules/@waterplane/shared/dist/wire/session.d.ts +1 -1
- package/node_modules/@waterplane/shared/dist/wire/telemetry.d.ts +7 -0
- package/node_modules/@waterplane/shared/dist/wire/work.d.ts +4 -2
- package/node_modules/@waterplane/shared/dist/wire/work.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/working.d.ts +30 -0
- package/node_modules/@waterplane/shared/dist/working.js +135 -13
- package/node_modules/@waterplane/shared/dist/working.js.map +1 -1
- package/node_modules/@waterplane/shared/dist/yamlfront.d.ts +13 -0
- package/node_modules/@waterplane/shared/dist/yamlfront.js +119 -0
- package/node_modules/@waterplane/shared/dist/yamlfront.js.map +1 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/packages/extensions/android-apps/waterplane-plugin.json +11 -0
- package/packages/host/dist/agentbuild.d.ts +48 -0
- package/packages/host/dist/agentbuild.js +105 -0
- package/packages/host/dist/agentbuild.js.map +1 -0
- package/packages/host/dist/agents.d.ts +2 -0
- package/packages/host/dist/agents.js +6 -1
- package/packages/host/dist/agents.js.map +1 -1
- package/packages/host/dist/androidenv.d.ts +10 -0
- package/packages/host/dist/androidenv.js +34 -2
- package/packages/host/dist/androidenv.js.map +1 -1
- package/packages/host/dist/apkcheck.d.ts +1 -1
- package/packages/host/dist/apkcheck.js +5 -5
- package/packages/host/dist/apkcheck.js.map +1 -1
- package/packages/host/dist/appready.d.ts +1 -1
- package/packages/host/dist/artifacts.js +6 -2
- package/packages/host/dist/artifacts.js.map +1 -1
- package/packages/host/dist/assess/hassrun.js +4 -1
- package/packages/host/dist/assess/hassrun.js.map +1 -1
- package/packages/host/dist/backends/claude-local.d.ts +34 -3
- package/packages/host/dist/backends/claude-local.js +86 -15
- package/packages/host/dist/backends/claude-local.js.map +1 -1
- package/packages/host/dist/backends/claude-sources.js +13 -7
- package/packages/host/dist/backends/claude-sources.js.map +1 -1
- package/packages/host/dist/backends/index.d.ts +7 -0
- package/packages/host/dist/backends/index.js +12 -1
- package/packages/host/dist/backends/index.js.map +1 -1
- package/packages/host/dist/builds.d.ts +1 -0
- package/packages/host/dist/builds.js +3 -1
- package/packages/host/dist/builds.js.map +1 -1
- package/packages/host/dist/clifixtures.d.ts +3 -0
- package/packages/host/dist/clifixtures.js +9 -1
- package/packages/host/dist/clifixtures.js.map +1 -1
- package/packages/host/dist/compliance.js +34 -1
- package/packages/host/dist/compliance.js.map +1 -1
- package/packages/host/dist/composer.d.ts +22 -0
- package/packages/host/dist/composer.js +23 -0
- package/packages/host/dist/composer.js.map +1 -1
- package/packages/host/dist/context.js +15 -5
- package/packages/host/dist/context.js.map +1 -1
- package/packages/host/dist/deliver/deliverreturn.d.ts +24 -0
- package/packages/host/dist/deliver/deliverreturn.js +37 -0
- package/packages/host/dist/deliver/deliverreturn.js.map +1 -1
- package/packages/host/dist/deliver/deliverrun.js +11 -11
- package/packages/host/dist/deliver/deliverrun.js.map +1 -1
- package/packages/host/dist/deliver/deliverscreen.js +4 -10
- package/packages/host/dist/deliver/deliverscreen.js.map +1 -1
- package/packages/host/dist/doctorclaude.d.ts +5 -1
- package/packages/host/dist/doctorclaude.js +7 -2
- package/packages/host/dist/doctorclaude.js.map +1 -1
- package/packages/host/dist/extensions/android-apps/host/index.d.mts +9 -0
- package/packages/host/dist/extensions/android-apps/host/index.mjs +59 -0
- package/packages/host/dist/extensions/android-apps/host/index.mjs.map +1 -0
- package/packages/host/dist/extensions/android-apps/host/installlog.d.mts +49 -0
- package/packages/host/dist/extensions/android-apps/host/installlog.mjs +196 -0
- package/packages/host/dist/extensions/android-apps/host/installlog.mjs.map +1 -0
- package/packages/host/dist/extensions/android-apps/host/readiness.d.mts +9 -0
- package/packages/host/dist/extensions/android-apps/host/readiness.mjs +5 -0
- package/packages/host/dist/extensions/android-apps/host/readiness.mjs.map +1 -0
- package/packages/host/dist/extensions/android-apps/shared/wire.d.mts +287 -0
- package/{node_modules/@waterplane/shared/dist/installlog.js → packages/host/dist/extensions/android-apps/shared/wire.mjs} +74 -1
- package/packages/host/dist/extensions/android-apps/shared/wire.mjs.map +1 -0
- package/packages/host/dist/headlessauth.d.ts +24 -0
- package/packages/host/dist/headlessauth.js +63 -0
- package/packages/host/dist/headlessauth.js.map +1 -0
- package/packages/host/dist/host.js +21 -2
- package/packages/host/dist/host.js.map +1 -1
- package/packages/host/dist/intents/contract.d.ts +6 -0
- package/packages/host/dist/intents/contract.js.map +1 -1
- package/packages/host/dist/intents/watch.d.ts +2 -0
- package/packages/host/dist/intents/watch.js +8 -0
- package/packages/host/dist/intents/watch.js.map +1 -1
- package/packages/host/dist/limitretry.d.ts +22 -3
- package/packages/host/dist/limitretry.js +20 -0
- package/packages/host/dist/limitretry.js.map +1 -1
- package/packages/host/dist/login.d.ts +1 -0
- package/packages/host/dist/login.js +17 -0
- package/packages/host/dist/login.js.map +1 -1
- package/packages/host/dist/main.js +5 -16
- package/packages/host/dist/main.js.map +1 -1
- package/packages/host/dist/naming.js +6 -0
- package/packages/host/dist/naming.js.map +1 -1
- package/packages/host/dist/netlog.d.ts +9 -0
- package/packages/host/dist/netlog.js +32 -3
- package/packages/host/dist/netlog.js.map +1 -1
- package/packages/host/dist/plugins/pluginapi.js +5 -0
- package/packages/host/dist/plugins/pluginapi.js.map +1 -1
- package/packages/host/dist/plugins/pluginauto.d.ts +21 -0
- package/packages/host/dist/plugins/pluginauto.js +67 -0
- package/packages/host/dist/plugins/pluginauto.js.map +1 -0
- package/packages/host/dist/plugins/pluginregistry.d.ts +50 -1
- package/packages/host/dist/plugins/pluginregistry.js +129 -7
- package/packages/host/dist/plugins/pluginregistry.js.map +1 -1
- package/packages/host/dist/question.js +10 -1
- package/packages/host/dist/question.js.map +1 -1
- package/packages/host/dist/recover/authgate.d.ts +174 -0
- package/packages/host/dist/recover/authgate.js +317 -0
- package/packages/host/dist/recover/authgate.js.map +1 -0
- package/packages/host/dist/recover/blockpush.d.ts +89 -0
- package/packages/host/dist/recover/blockpush.js +119 -0
- package/packages/host/dist/recover/blockpush.js.map +1 -0
- package/packages/host/dist/recover/giveuplatch.d.ts +42 -0
- package/packages/host/dist/recover/giveuplatch.js +48 -0
- package/packages/host/dist/recover/giveuplatch.js.map +1 -0
- package/packages/host/dist/recover/recoverwrite.d.ts +174 -0
- package/packages/host/dist/recover/recoverwrite.js +137 -0
- package/packages/host/dist/recover/recoverwrite.js.map +1 -0
- package/packages/host/dist/recover/wavegate.d.ts +145 -0
- package/packages/host/dist/recover/wavegate.js +277 -0
- package/packages/host/dist/recover/wavegate.js.map +1 -0
- package/packages/host/dist/repohealth.d.ts +8 -2
- package/packages/host/dist/repohealth.js +16 -6
- package/packages/host/dist/repohealth.js.map +1 -1
- package/packages/host/dist/repos.d.ts +13 -0
- package/packages/host/dist/repos.js +50 -0
- package/packages/host/dist/repos.js.map +1 -1
- package/packages/host/dist/reposkill.js +1 -1
- package/packages/host/dist/reposkill.js.map +1 -1
- package/packages/host/dist/reposkilltext.js +56 -10
- package/packages/host/dist/reposkilltext.js.map +1 -1
- package/packages/host/dist/review.js +7 -2
- package/packages/host/dist/review.js.map +1 -1
- package/packages/host/dist/routes/apihost.js +22 -10
- package/packages/host/dist/routes/apihost.js.map +1 -1
- package/packages/host/dist/routes/apirepowork.js +4 -1
- package/packages/host/dist/routes/apirepowork.js.map +1 -1
- package/packages/host/dist/routes/apisystem.js +10 -0
- package/packages/host/dist/routes/apisystem.js.map +1 -1
- package/packages/host/dist/routes/apitable.d.ts +4 -7
- package/packages/host/dist/routes/apitable.js.map +1 -1
- package/packages/host/dist/routes/session.js +14 -0
- package/packages/host/dist/routes/session.js.map +1 -1
- package/packages/host/dist/routes/system.js +0 -37
- package/packages/host/dist/routes/system.js.map +1 -1
- package/packages/host/dist/routes/types.d.ts +0 -3
- package/packages/host/dist/scaffold.d.ts +13 -0
- package/packages/host/dist/scaffold.js +31 -0
- package/packages/host/dist/scaffold.js.map +1 -1
- package/packages/host/dist/server/ctxseal.d.ts +1 -1
- package/packages/host/dist/server/ctxseal.js +1 -1
- package/packages/host/dist/server/ctxseal.js.map +1 -1
- package/packages/host/dist/server/http.js +0 -2
- package/packages/host/dist/server/http.js.map +1 -1
- package/packages/host/dist/server/intentDeps.js +7 -1
- package/packages/host/dist/server/intentDeps.js.map +1 -1
- package/packages/host/dist/server/plugins.d.ts +21 -0
- package/packages/host/dist/server/plugins.js +28 -0
- package/packages/host/dist/server/plugins.js.map +1 -0
- package/packages/host/dist/server/sessionEvents.js +21 -47
- package/packages/host/dist/server/sessionEvents.js.map +1 -1
- package/packages/host/dist/server/shutdown.js +2 -4
- package/packages/host/dist/server/shutdown.js.map +1 -1
- package/packages/host/dist/sessions/agentpoll.js +18 -5
- package/packages/host/dist/sessions/agentpoll.js.map +1 -1
- package/packages/host/dist/sessions/apiretry.d.ts +110 -8
- package/packages/host/dist/sessions/apiretry.js +349 -72
- package/packages/host/dist/sessions/apiretry.js.map +1 -1
- package/packages/host/dist/sessions/boxread.js +9 -3
- package/packages/host/dist/sessions/boxread.js.map +1 -1
- package/packages/host/dist/sessions/core.d.ts +43 -6
- package/packages/host/dist/sessions/drive.js +6 -1
- package/packages/host/dist/sessions/drive.js.map +1 -1
- package/packages/host/dist/sessions/endsession.js +1 -0
- package/packages/host/dist/sessions/endsession.js.map +1 -1
- package/packages/host/dist/sessions/knobs.d.ts +12 -0
- package/packages/host/dist/sessions/knobs.js +12 -0
- package/packages/host/dist/sessions/knobs.js.map +1 -1
- package/packages/host/dist/sessions/loopwatch.d.ts +2 -0
- package/packages/host/dist/sessions/loopwatch.js +73 -0
- package/packages/host/dist/sessions/loopwatch.js.map +1 -0
- package/packages/host/dist/sessions/resume.d.ts +25 -36
- package/packages/host/dist/sessions/resume.js +97 -188
- package/packages/host/dist/sessions/resume.js.map +1 -1
- package/packages/host/dist/sessions/signinwait.d.ts +44 -0
- package/packages/host/dist/sessions/signinwait.js +286 -0
- package/packages/host/dist/sessions/signinwait.js.map +1 -0
- package/packages/host/dist/sessions/tmux.js +5 -0
- package/packages/host/dist/sessions/tmux.js.map +1 -1
- package/packages/host/dist/sessions/turn.js +36 -4
- package/packages/host/dist/sessions/turn.js.map +1 -1
- package/packages/host/dist/sessions/wall.d.ts +8 -5
- package/packages/host/dist/sessions/wall.js +112 -66
- package/packages/host/dist/sessions/wall.js.map +1 -1
- package/packages/host/dist/sessions.d.ts +6 -0
- package/packages/host/dist/sessions.js +14 -7
- package/packages/host/dist/sessions.js.map +1 -1
- package/packages/host/dist/sidecar/sidecarname.d.ts +3 -0
- package/packages/host/dist/sidecar/sidecarname.js +4 -0
- package/packages/host/dist/sidecar/sidecarname.js.map +1 -1
- package/packages/host/dist/toolloop.d.ts +30 -0
- package/packages/host/dist/toolloop.js +117 -0
- package/packages/host/dist/toolloop.js.map +1 -0
- package/packages/host/dist/usage.d.ts +12 -2
- package/packages/host/dist/usage.js +35 -3
- package/packages/host/dist/usage.js.map +1 -1
- package/packages/web/dist/assets/demo-DkCtg-SJ.js +26 -0
- package/packages/web/dist/assets/icons-B48F-4nA.js +1 -0
- package/packages/web/dist/assets/index-CpdyS6Xe.css +1 -0
- package/packages/web/dist/assets/index-EYc28CfH.js +170 -0
- package/packages/web/dist/assets/shared-DjRRLGfw.js +50 -0
- package/packages/web/dist/assets/sheets-ByWNPa9p.js +248 -0
- package/packages/web/dist/build-id.txt +1 -1
- package/packages/web/dist/buildstamp.json +1 -1
- package/packages/web/dist/index.html +6 -6
- package/packages/web/dist/sw.js +2 -2
- package/release.json +6 -3
- package/tools/repohealth/lang/typescript-resolve.mjs +4 -2
- package/tools/repohealth.mjs +35 -6
- package/node_modules/@waterplane/shared/dist/installlog.d.ts +0 -137
- package/node_modules/@waterplane/shared/dist/installlog.js.map +0 -1
- package/packages/host/dist/installlog.d.ts +0 -25
- package/packages/host/dist/installlog.js +0 -137
- package/packages/host/dist/installlog.js.map +0 -1
- package/packages/web/dist/assets/demo-DsZGy-MC.js +0 -24
- package/packages/web/dist/assets/icons-eqlvjswV.js +0 -1
- package/packages/web/dist/assets/index-GHwJuQb3.js +0 -169
- package/packages/web/dist/assets/index-VzDSZwwH.css +0 -1
- package/packages/web/dist/assets/shared-BWk5jXWb.js +0 -49
- package/packages/web/dist/assets/sheets-Dj-0m0DB.js +0 -232
|
@@ -79,9 +79,10 @@ export interface SessionLimit {
|
|
|
79
79
|
nextAttemptAt: number | null;
|
|
80
80
|
/** Continue attempts sent since this block started. */
|
|
81
81
|
attempts: number;
|
|
82
|
-
/** The block is a WEEKLY limit
|
|
83
|
-
*
|
|
84
|
-
*
|
|
82
|
+
/** The block is a WEEKLY limit. Read off the screen its notice prints a bare
|
|
83
|
+
* time with no date, so `resetAt` is that time's next occurrence — the
|
|
84
|
+
* EARLIEST it can lift, possibly days early; auto-continue tries there and,
|
|
85
|
+
* still blocked, again at the same time each following day. */
|
|
85
86
|
weekly: boolean;
|
|
86
87
|
/**
|
|
87
88
|
* The wall is a SPEND wall (API-key / cloud account out of credit, or a spend
|
|
@@ -118,6 +119,40 @@ export interface SessionLimit {
|
|
|
118
119
|
resuming: boolean;
|
|
119
120
|
/** True when the user pushed this session to the front of the resume queue. */
|
|
120
121
|
first: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Why the host's continue is HELD rather than typed, as a sentence: today only
|
|
124
|
+
* `LIMIT_HELD_DRAFT` — a person's words sit in the desk's composer, and typing
|
|
125
|
+
* `continue` + Return there would send their draft with it. Set while parked on
|
|
126
|
+
* that; cleared on the next attempt, another blocker, or the block clearing.
|
|
127
|
+
* `nextAttemptAt` is then only the next LOOK, never a promise of a try, so a
|
|
128
|
+
* reader says this instead of a countdown. Absent/null = not held (an older
|
|
129
|
+
* host never sends it). Additive (2026-11-02).
|
|
130
|
+
*/
|
|
131
|
+
held?: string | null;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* A session whose turn stopped on a sign-out, waiting in its account's sign-in
|
|
135
|
+
* episode (host `recover/authgate.ts`). After a sign-in the host ASKS — it never
|
|
136
|
+
* types a `continue` until the person taps (owner, 2026-11-02).
|
|
137
|
+
*/
|
|
138
|
+
export interface SessionSignInWait {
|
|
139
|
+
/** Epoch ms the sign-out stopped this session's turn. */
|
|
140
|
+
since: number;
|
|
141
|
+
/** Epoch ms the host confirmed the account is signed in again (`claude auth
|
|
142
|
+
* status` after a sign-out was seen, a sign-in link that finished, or another
|
|
143
|
+
* session's served turn). Absent = still signed out as far as the host knows. */
|
|
144
|
+
signedInAt?: number;
|
|
145
|
+
/** The person tapped continue and this session is in line behind the first
|
|
146
|
+
* one, which goes alone (`signin.continue`). */
|
|
147
|
+
queued?: boolean;
|
|
148
|
+
/** The host's `continue` for this session is typed and its verdict owed. */
|
|
149
|
+
continuing?: boolean;
|
|
150
|
+
/** The host CANNOT TELL whether the account signed in again: `claude auth
|
|
151
|
+
* status` keeps reading "in" while this episode never read "out" (a stale
|
|
152
|
+
* local credential, or the sign-in done elsewhere), so no confirmation will
|
|
153
|
+
* come. The phone offers continue — "continue if you have signed in". Only
|
|
154
|
+
* while `signedInAt` is absent. Additive (2026-11-02). */
|
|
155
|
+
unsure?: boolean;
|
|
121
156
|
}
|
|
122
157
|
/**
|
|
123
158
|
* The host retrying a turn the CLI GAVE UP on a transient API error — a DNS or
|
|
@@ -146,6 +181,12 @@ export interface SessionNetRetry {
|
|
|
146
181
|
at: number;
|
|
147
182
|
/** For `gaveup` (or a `waiting` that is parked): the host's sentence why. */
|
|
148
183
|
why?: string;
|
|
184
|
+
/** This `waiting` is HELD: another session's retry is the open question on this
|
|
185
|
+
* desktop (`recover/wavegate.ts`) and nothing is typed here until it gets
|
|
186
|
+
* through. The holder's session id (the probe in flight when nobody holds yet).
|
|
187
|
+
* The field is the fact; `why` carries the same sentence for an older phone.
|
|
188
|
+
* Absent = not held. */
|
|
189
|
+
heldBy?: string | null;
|
|
149
190
|
/** This `waiting`/`sent` is a STALL PROBE: the ladder ran out and the host
|
|
150
191
|
* is trying once more on the slow cadence. The work waiting on the session
|
|
151
192
|
* is still stalled meanwhile (`netRetryStalls`). Absent = the ladder. */
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* live next to the union that happens to send it.
|
|
8
8
|
*/
|
|
9
9
|
export type { PromptOption, StandingRule, DetectedPrompt } from "./session/promptbox.js";
|
|
10
|
-
export type { SendView, Effort, PermissionMode, LaunchOpts, ExternalSession, LimitResumeMode, SessionLimit, SessionNetRetry, SessionLogin, ShellLink, SessionAgent, SessionAsk, SessionShell, SessionShellDetail } from "./session/launch.js";
|
|
10
|
+
export type { SendView, Effort, PermissionMode, LaunchOpts, ExternalSession, LimitResumeMode, SessionLimit, SessionNetRetry, SessionSignInWait, SessionLogin, ShellLink, SessionAgent, SessionAsk, SessionShell, SessionShellDetail } from "./session/launch.js";
|
|
11
11
|
export type { SessionInfo, FollowUp, FollowUpBy } from "./session/info.js";
|
|
12
12
|
export type { NewImage, RecentSession, ArchivedConversation, ArchiveListing, Bookmark, ClosedSession, ClosedBy, SessionOriginKind, SessionOrigin, HistoryEntry, SessionSearchScope, SessionSearchMatch, SessionSearchResult } from "./session/archive.js";
|
|
13
13
|
export type { OpenDelivery } from "./session/delivery.js";
|
|
@@ -86,6 +86,13 @@ export interface UsageInfo {
|
|
|
86
86
|
weeklyResetAt: number | null;
|
|
87
87
|
/** Epoch ms of the scrape. */
|
|
88
88
|
checkedAt: number;
|
|
89
|
+
/**
|
|
90
|
+
* Present when this account has NO 5-hour window: `/usage` has printed the
|
|
91
|
+
* week and no "Current session" row since this instant (`sessionWindowGoneSince`,
|
|
92
|
+
* `sessionwindow.ts`). Only ever set beside `sessionPct: null`. Absent = it has
|
|
93
|
+
* one, or nobody can say — never read a bare null as "none".
|
|
94
|
+
*/
|
|
95
|
+
sessionGoneSince?: number;
|
|
89
96
|
/**
|
|
90
97
|
* True when this reading was not probed by THIS process — it was re-offered
|
|
91
98
|
* at boot out of `usagelog.ts`, because the daemon restarting is not a fact
|
|
@@ -274,14 +274,16 @@ export interface BacklogItem {
|
|
|
274
274
|
* "limited" is deliberately NOT "error": the reviewer never ran, so nothing was
|
|
275
275
|
* judged. Reported as an error it reads as a broken install (and as a claim
|
|
276
276
|
* about the work), when the true fact is a quota that lifts by itself.
|
|
277
|
+
* "signedOut" is the same class: the reviewer never ran because the CLI is
|
|
278
|
+
* signed out; one sign-in clears it, and a re-run is the person's tap.
|
|
277
279
|
*/
|
|
278
|
-
export type BacklogCheckStatus = "checking" | "done" | "partial" | "questions" | "not_done" | "error" | "limited";
|
|
280
|
+
export type BacklogCheckStatus = "checking" | "done" | "partial" | "questions" | "not_done" | "error" | "limited" | "signedOut";
|
|
279
281
|
/**
|
|
280
282
|
* Verdict of a deep outcome validation (CLI self-reports structured JSON).
|
|
281
283
|
* "validating" = in flight; achieved/likely/unlikely/unclear grade how well the
|
|
282
284
|
* user's expected outcome appears to be met.
|
|
283
285
|
*/
|
|
284
|
-
export type BacklogValidateStatus = "validating" | "achieved" | "likely" | "unlikely" | "unclear" | "error" | "limited";
|
|
286
|
+
export type BacklogValidateStatus = "validating" | "achieved" | "likely" | "unlikely" | "unclear" | "error" | "limited" | "signedOut";
|
|
285
287
|
/** A proposed next step from validation: a short button label + the full instruction to send. */
|
|
286
288
|
export interface BacklogNextStep {
|
|
287
289
|
/** Short label shown on the tappable option button. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work.js","sourceRoot":"","sources":["../../src/wire/work.ts"],"names":[],"mappings":"AAAA,qGAAqG;
|
|
1
|
+
{"version":3,"file":"work.js","sourceRoot":"","sources":["../../src/wire/work.ts"],"names":[],"mappings":"AAAA,qGAAqG;AA8nBrG,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAC3B,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;CAChB,CAAC;AAuDF;;;;GAIG;AACH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC"}
|
|
@@ -27,6 +27,36 @@
|
|
|
27
27
|
* ellipsis, and a parenthetical carrying a duration or a token count — which is
|
|
28
28
|
* what the line has been in every version, hint or no hint.
|
|
29
29
|
*/
|
|
30
|
+
/**
|
|
31
|
+
* ANSI escapes removed, exactly as replacing every match of the regex
|
|
32
|
+
* `/\x1b\[[0-9;?]*[ -/]*[@-~]|\x1b[PX^_].*?\x1b\\|\x1b\][^\x07]*\x07/g` with ""
|
|
33
|
+
* did, but as a scan. That regex was quadratic on PTY bytes (CodeQL
|
|
34
|
+
* `js/polynomial-redos`): every unterminated `ESC P` / `ESC ]` re-scanned to the
|
|
35
|
+
* end of its line or of the tail. Same removals: a CSI as before (sticky); a
|
|
36
|
+
* DCS/SOS/PM/APC runs to the FIRST `ESC \` after it unless a line terminator
|
|
37
|
+
* (what `.` will not cross) comes first; an OSC runs to the first BEL. The next
|
|
38
|
+
* ST / BEL / line end is looked up once and reused while it still lies ahead,
|
|
39
|
+
* so the whole scan is linear.
|
|
40
|
+
*/
|
|
41
|
+
export declare function stripAnsi(s: string): string;
|
|
42
|
+
/** The phrase the spinner cycles: always a gerund, always ellipsed. Taken as the
|
|
43
|
+
* LAST such word on the line because a partial TUI redraw leaves junk in front
|
|
44
|
+
* of it ("✽Bloviating…", "│ ✻ Vibing…").
|
|
45
|
+
*
|
|
46
|
+
* Every match of `/([A-Za-z][A-Za-z'-]*ing)\s*(?:…|\.\.\.)/g`, group 1 only — as
|
|
47
|
+
* a scan, because that regex re-read a long word from each of its letters
|
|
48
|
+
* (CodeQL `js/polynomial-redos`). With `objects`, every match of the object
|
|
49
|
+
* form below. */
|
|
50
|
+
export declare function gerundPhrases(s: string, objects?: boolean): string[];
|
|
51
|
+
/**
|
|
52
|
+
* The stats shape: what `/(?:^|\s)\d+(?:\.\d+)?\s*[smh](?:\s+\d+\s*[sm])*\s+·\s+[↓↑]\s*[\d.,]+\s*[km]?\s+tokens?\s*$/i`
|
|
53
|
+
* answered, without its quadratic retry from every whitespace (CodeQL
|
|
54
|
+
* `js/polynomial-redos`). Two facts make it a split: the `·` it matched is the
|
|
55
|
+
* line's LAST one (nothing after it may hold another), and the `(?:\s+\d+\s*[sm])*`
|
|
56
|
+
* run never decided anything — its last item alone, after whitespace, is already
|
|
57
|
+
* a first item — so one duration before the `·` is the same test.
|
|
58
|
+
*/
|
|
59
|
+
export declare function trayStats(line: string): boolean;
|
|
30
60
|
export interface WorkingLine {
|
|
31
61
|
/** "Clauding…" — the TUI's own word for what it is doing. */
|
|
32
62
|
phrase: string;
|
|
@@ -27,8 +27,59 @@
|
|
|
27
27
|
* ellipsis, and a parenthetical carrying a duration or a token count — which is
|
|
28
28
|
* what the line has been in every version, hint or no hint.
|
|
29
29
|
*/
|
|
30
|
-
/** ANSI escapes, so a scraped line is text and not styling. */
|
|
31
|
-
const
|
|
30
|
+
/** ANSI escapes, so a scraped line is text and not styling (`stripAnsi`). */
|
|
31
|
+
const CSI = /\x1b\[[0-9;?]*[ -/]*[@-~]/y;
|
|
32
|
+
const LINE_END = /[\n\r\u2028\u2029]/g;
|
|
33
|
+
/**
|
|
34
|
+
* ANSI escapes removed, exactly as replacing every match of the regex
|
|
35
|
+
* `/\x1b\[[0-9;?]*[ -/]*[@-~]|\x1b[PX^_].*?\x1b\\|\x1b\][^\x07]*\x07/g` with ""
|
|
36
|
+
* did, but as a scan. That regex was quadratic on PTY bytes (CodeQL
|
|
37
|
+
* `js/polynomial-redos`): every unterminated `ESC P` / `ESC ]` re-scanned to the
|
|
38
|
+
* end of its line or of the tail. Same removals: a CSI as before (sticky); a
|
|
39
|
+
* DCS/SOS/PM/APC runs to the FIRST `ESC \` after it unless a line terminator
|
|
40
|
+
* (what `.` will not cross) comes first; an OSC runs to the first BEL. The next
|
|
41
|
+
* ST / BEL / line end is looked up once and reused while it still lies ahead,
|
|
42
|
+
* so the whole scan is linear.
|
|
43
|
+
*/
|
|
44
|
+
export function stripAnsi(s) {
|
|
45
|
+
let out = "";
|
|
46
|
+
let from = 0;
|
|
47
|
+
// Next index at/after the point last looked up; -1 = none ahead; -2 = not looked up yet.
|
|
48
|
+
let st = -2;
|
|
49
|
+
let bel = -2;
|
|
50
|
+
let eol = -2;
|
|
51
|
+
const ahead = (cached, at, find) => cached === -1 || cached >= at ? cached : find(at);
|
|
52
|
+
for (let i = s.indexOf("\x1b"); i >= 0; i = s.indexOf("\x1b", i)) {
|
|
53
|
+
const c = s[i + 1];
|
|
54
|
+
let end = -1;
|
|
55
|
+
if (c === "[") {
|
|
56
|
+
CSI.lastIndex = i;
|
|
57
|
+
if (CSI.test(s))
|
|
58
|
+
end = CSI.lastIndex;
|
|
59
|
+
}
|
|
60
|
+
else if (c === "P" || c === "X" || c === "^" || c === "_") {
|
|
61
|
+
st = ahead(st, i + 2, (at) => s.indexOf("\x1b\\", at));
|
|
62
|
+
eol = ahead(eol, i + 2, (at) => {
|
|
63
|
+
LINE_END.lastIndex = at;
|
|
64
|
+
return LINE_END.exec(s)?.index ?? -1;
|
|
65
|
+
});
|
|
66
|
+
if (st >= 0 && (eol < 0 || eol > st))
|
|
67
|
+
end = st + 2;
|
|
68
|
+
}
|
|
69
|
+
else if (c === "]") {
|
|
70
|
+
bel = ahead(bel, i + 2, (at) => s.indexOf("\x07", at));
|
|
71
|
+
if (bel >= 0)
|
|
72
|
+
end = bel + 1;
|
|
73
|
+
}
|
|
74
|
+
if (end < 0) {
|
|
75
|
+
i++;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
out += s.slice(from, i);
|
|
79
|
+
from = i = end;
|
|
80
|
+
}
|
|
81
|
+
return from === 0 ? s : out + s.slice(from);
|
|
82
|
+
}
|
|
32
83
|
/** "17s", "9m 20s", "450ms" — the elapsed field of the parenthetical. */
|
|
33
84
|
const DUR_RE = /^(?:\d+(?:\.\d+)?\s*(?:ms|s|m|h)\s*)+$/i;
|
|
34
85
|
/** Terminal affordances. The reader is not a terminal and has its own key bar,
|
|
@@ -36,8 +87,64 @@ const DUR_RE = /^(?:\d+(?:\.\d+)?\s*(?:ms|s|m|h)\s*)+$/i;
|
|
|
36
87
|
const HINT_RE = /\b(?:esc|ctrl\+|shift\+|tab)\b/i;
|
|
37
88
|
/** The phrase the spinner cycles: always a gerund, always ellipsed. Taken as the
|
|
38
89
|
* LAST such word on the line because a partial TUI redraw leaves junk in front
|
|
39
|
-
* of it ("✽Bloviating…", "│ ✻ Vibing…").
|
|
40
|
-
|
|
90
|
+
* of it ("✽Bloviating…", "│ ✻ Vibing…").
|
|
91
|
+
*
|
|
92
|
+
* Every match of `/([A-Za-z][A-Za-z'-]*ing)\s*(?:…|\.\.\.)/g`, group 1 only — as
|
|
93
|
+
* a scan, because that regex re-read a long word from each of its letters
|
|
94
|
+
* (CodeQL `js/polynomial-redos`). With `objects`, every match of the object
|
|
95
|
+
* form below. */
|
|
96
|
+
export function gerundPhrases(s, objects = false) {
|
|
97
|
+
const out = [];
|
|
98
|
+
const isWord = (c) => c !== undefined && /[A-Za-z'-]/.test(c);
|
|
99
|
+
const isLetter = (c) => c !== undefined && /[A-Za-z]/.test(c);
|
|
100
|
+
const isSpace = (c) => c !== undefined && /\s/.test(c);
|
|
101
|
+
const wordEnd = (at) => { while (isWord(s[at]))
|
|
102
|
+
at++; return at; };
|
|
103
|
+
/** Index just past `\s*(?:…|\.\.\.)` at `at`, or -1. */
|
|
104
|
+
const ellipsis = (at) => {
|
|
105
|
+
while (isSpace(s[at]))
|
|
106
|
+
at++;
|
|
107
|
+
return s[at] === "…" ? at + 1 : s.startsWith("...", at) ? at + 3 : -1;
|
|
108
|
+
};
|
|
109
|
+
let i = 0;
|
|
110
|
+
while (i < s.length) {
|
|
111
|
+
if (!isWord(s[i])) {
|
|
112
|
+
i++;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// A run of word characters: a match can only start at its first letter and
|
|
116
|
+
// its gerund can only end where the run does — what follows is never a word
|
|
117
|
+
// character.
|
|
118
|
+
const end = wordEnd(i);
|
|
119
|
+
let start = i;
|
|
120
|
+
while (start < end && !isLetter(s[start]))
|
|
121
|
+
start++;
|
|
122
|
+
let next = -1;
|
|
123
|
+
let to = end;
|
|
124
|
+
if (end - start >= 4 && s.endsWith("ing", end)) {
|
|
125
|
+
if (!objects)
|
|
126
|
+
next = ellipsis(end);
|
|
127
|
+
else {
|
|
128
|
+
for (let n = 0; n < 3 && next < 0; n++) {
|
|
129
|
+
let k = to;
|
|
130
|
+
while (isSpace(s[k]))
|
|
131
|
+
k++;
|
|
132
|
+
if (k === to || !isLetter(s[k]))
|
|
133
|
+
break;
|
|
134
|
+
to = wordEnd(k);
|
|
135
|
+
next = ellipsis(to);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (next < 0) {
|
|
140
|
+
i = end;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
out.push(s.slice(start, to));
|
|
144
|
+
i = next;
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
41
148
|
/**
|
|
42
149
|
* The same shape with an OBJECT between the gerund and the ellipsis —
|
|
43
150
|
* "Compacting conversation… (35s)", which is what `/compact` prints for however
|
|
@@ -49,8 +156,10 @@ const PHRASE_RE = /([A-Za-z][A-Za-z'-]*ing)\s*(?:…|\.\.\.)/g;
|
|
|
49
156
|
* inherited CL…" would read as "working on: saving is off" — which is this app
|
|
50
157
|
* inventing an activity, the failure `workingLine`'s doc names. A measured
|
|
51
158
|
* parenthetical is what a spinner has and a truncated warning does not.
|
|
159
|
+
*
|
|
160
|
+
* Read by `gerundPhrases(s, true)`: every match of
|
|
161
|
+
* `/([A-Za-z][A-Za-z'-]*ing(?:\s+[A-Za-z][A-Za-z'-]*){1,3})\s*(?:…|\.\.\.)/g`.
|
|
52
162
|
*/
|
|
53
|
-
const PHRASE_OBJ_RE = /([A-Za-z][A-Za-z'-]*ing(?:\s+[A-Za-z][A-Za-z'-]*){1,3})\s*(?:…|\.\.\.)/g;
|
|
54
163
|
/**
|
|
55
164
|
* **The other measured thing, and for the first half-minute it is the ONLY one.**
|
|
56
165
|
*
|
|
@@ -96,7 +205,20 @@ const PROGRESS_RE = /^[▰▱▬█▓░▒⣿⠿\s]*[▰▱▬█▓░▒⣿
|
|
|
96
205
|
* tokens") — the spinner always wraps its stats in parentheses.
|
|
97
206
|
*/
|
|
98
207
|
const TRAY_ROW_RE = /^\s*[◯◉○●◎⏺]\s+[A-Za-z][\w:-]*\s{2,}\S/;
|
|
99
|
-
|
|
208
|
+
/**
|
|
209
|
+
* The stats shape: what `/(?:^|\s)\d+(?:\.\d+)?\s*[smh](?:\s+\d+\s*[sm])*\s+·\s+[↓↑]\s*[\d.,]+\s*[km]?\s+tokens?\s*$/i`
|
|
210
|
+
* answered, without its quadratic retry from every whitespace (CodeQL
|
|
211
|
+
* `js/polynomial-redos`). Two facts make it a split: the `·` it matched is the
|
|
212
|
+
* line's LAST one (nothing after it may hold another), and the `(?:\s+\d+\s*[sm])*`
|
|
213
|
+
* run never decided anything — its last item alone, after whitespace, is already
|
|
214
|
+
* a first item — so one duration before the `·` is the same test.
|
|
215
|
+
*/
|
|
216
|
+
export function trayStats(line) {
|
|
217
|
+
const dot = line.lastIndexOf("·");
|
|
218
|
+
return dot >= 0
|
|
219
|
+
&& /(?:^|\s)\d+(?:\.\d+)?\s*[smh]\s+$/i.test(line.slice(0, dot))
|
|
220
|
+
&& /^\s+[↓↑]\s*[\d.,]+(?:\s*[km])?\s+tokens?\s*$/i.test(line.slice(dot + 1));
|
|
221
|
+
}
|
|
100
222
|
/**
|
|
101
223
|
* The CLI's working line, recovered from recent PTY bytes.
|
|
102
224
|
*
|
|
@@ -111,12 +233,12 @@ const TRAY_STATS_RE = /(?:^|\s)\d+(?:\.\d+)?\s*[smh](?:\s+\d+\s*[sm])*\s+·\s+[
|
|
|
111
233
|
export function workingLine(tail) {
|
|
112
234
|
if (!tail)
|
|
113
235
|
return null;
|
|
114
|
-
const lines = tail
|
|
236
|
+
const lines = stripAnsi(tail).split(/[\r\n]+/);
|
|
115
237
|
const clean = (raw) => (raw ?? "").replace(/[│┃|╭╮╰╯─]/g, " ").replace(/\s+/g, " ").trim();
|
|
116
238
|
let weak = null;
|
|
117
239
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
118
240
|
// A background agent's tray row is the AGENT working, not the turn.
|
|
119
|
-
if (TRAY_ROW_RE.test(lines[i] ?? "") ||
|
|
241
|
+
if (TRAY_ROW_RE.test(lines[i] ?? "") || trayStats(lines[i] ?? ""))
|
|
120
242
|
continue;
|
|
121
243
|
const line = clean(lines[i]);
|
|
122
244
|
if (!line)
|
|
@@ -148,18 +270,18 @@ export function workingLine(tail) {
|
|
|
148
270
|
const pct = PROGRESS_RE.exec(clean(lines[i + 1]))?.[1] ?? PROGRESS_RE.exec(line.slice(line.search(/[▰▱▬█▓░▒⣿⠿]/) < 0 ? line.length : line.search(/[▰▱▬█▓░▒⣿⠿]/)))?.[1] ?? null;
|
|
149
271
|
if (pct)
|
|
150
272
|
extra.push(`${pct}%`);
|
|
151
|
-
const phrases =
|
|
273
|
+
const phrases = gerundPhrases(head);
|
|
152
274
|
// The gerund-with-an-object form is read ONLY off a line that also carries
|
|
153
275
|
// something MEASURED — a parenthetical with a duration or a token count, or
|
|
154
|
-
// the progress row above. See
|
|
276
|
+
// the progress row above. See the object form's doc for why it is never read on
|
|
155
277
|
// its own. It is how `/compact` announces itself, and `/compact` fires no
|
|
156
278
|
// hook at all, so this line is the only thing that says the CLI is busy for
|
|
157
279
|
// the minutes it runs.
|
|
158
|
-
const objs = phrases.length || !(elapsed || tokens || pct) ? [] :
|
|
280
|
+
const objs = phrases.length || !(elapsed || tokens || pct) ? [] : gerundPhrases(head, true);
|
|
159
281
|
const hit = phrases[phrases.length - 1] ?? objs[objs.length - 1];
|
|
160
282
|
if (!hit)
|
|
161
283
|
continue;
|
|
162
|
-
const phrase = `${hit
|
|
284
|
+
const phrase = `${hit}…`;
|
|
163
285
|
if (!elapsed && !tokens && !pct) {
|
|
164
286
|
// A gerund with nothing measured behind it — the first repaint of a turn,
|
|
165
287
|
// or a redraw that split the line. Worth showing if nothing better turns
|
|
@@ -203,6 +325,6 @@ const SCROLL_FOOTER = /\bto scroll\b/i;
|
|
|
203
325
|
export function scrollPanelOpen(tail) {
|
|
204
326
|
if (!tail)
|
|
205
327
|
return false;
|
|
206
|
-
return SCROLL_FOOTER.test(tail
|
|
328
|
+
return SCROLL_FOOTER.test(stripAnsi(tail).slice(-PANEL_WINDOW));
|
|
207
329
|
}
|
|
208
330
|
//# sourceMappingURL=working.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working.js","sourceRoot":"","sources":["../src/working.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH
|
|
1
|
+
{"version":3,"file":"working.js","sourceRoot":"","sources":["../src/working.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A top-level `key: value` line as `[key, value]`, the value untrimmed; null when the line is not
|
|
3
|
+
* one. Answers what `/^(KEY)[ \t]*:(?:[ \t]+(.*))?[ \t]*$/` did (its value only ever read trimmed),
|
|
4
|
+
* but that regex was quadratic on a long tab run ending in a line terminator (CodeQL
|
|
5
|
+
* `js/polynomial-redos`). Same refusals: something other than a space or tab right after the `:`,
|
|
6
|
+
* and any character `.` would not cross — so a CRLF line still is not a key line.
|
|
7
|
+
*/
|
|
8
|
+
export declare function keyLine(line: string): [string, string] | null;
|
|
9
|
+
/**
|
|
10
|
+
* A short sentence naming the first frontmatter key whose value is not strict YAML, and why;
|
|
11
|
+
* null when the file has no frontmatter or nothing in it trips these rules.
|
|
12
|
+
*/
|
|
13
|
+
export declare function frontmatterYamlProblem(text: string): string | null;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a file's frontmatter is STRICT YAML — the half of a skill another agent may refuse.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code reads a SKILL.md's `description:` leniently, so an unquoted value containing `: `
|
|
5
|
+
* loads fine there. GitHub Copilot CLI (measured on 1.0.98) parses the same block as strict YAML,
|
|
6
|
+
* reads that `: ` as a second mapping key, and SKIPS the skill: `copilot skill list` printed
|
|
7
|
+
* "mapping values are not allowed in this context" for 18 of this repo's 24 skills, and an agent
|
|
8
|
+
* told to load one got "Skill not found". Nobody noticed, because the agent the repo was written
|
|
9
|
+
* for never complained.
|
|
10
|
+
*
|
|
11
|
+
* Deliberately not a YAML parser: it judges only the top-level `key: value` lines (and the
|
|
12
|
+
* indented lines continuing a plain value), by the handful of rules that decide whether a PLAIN
|
|
13
|
+
* scalar is legal. Quoted, block (`|`/`>`) and flow (`[`/`{`) values are accepted as written,
|
|
14
|
+
* except a quote that never closes on its own line. Null means "nothing found", never "valid".
|
|
15
|
+
*/
|
|
16
|
+
import { frontmatterLines } from "./contextweight.js";
|
|
17
|
+
/** A top-level key, bare (`name`) or quoted, up to and including its `:`. */
|
|
18
|
+
const KEY_HEAD = /^([A-Za-z0-9_][\w.-]*|"[^"]*"|'[^']*')[ \t]*:/;
|
|
19
|
+
/**
|
|
20
|
+
* A top-level `key: value` line as `[key, value]`, the value untrimmed; null when the line is not
|
|
21
|
+
* one. Answers what `/^(KEY)[ \t]*:(?:[ \t]+(.*))?[ \t]*$/` did (its value only ever read trimmed),
|
|
22
|
+
* but that regex was quadratic on a long tab run ending in a line terminator (CodeQL
|
|
23
|
+
* `js/polynomial-redos`). Same refusals: something other than a space or tab right after the `:`,
|
|
24
|
+
* and any character `.` would not cross — so a CRLF line still is not a key line.
|
|
25
|
+
*/
|
|
26
|
+
export function keyLine(line) {
|
|
27
|
+
const m = KEY_HEAD.exec(line);
|
|
28
|
+
if (!m)
|
|
29
|
+
return null;
|
|
30
|
+
const rest = line.slice(m[0].length);
|
|
31
|
+
if (rest && rest[0] !== " " && rest[0] !== "\t")
|
|
32
|
+
return null;
|
|
33
|
+
if (/[\n\r\u2028\u2029]/.test(rest))
|
|
34
|
+
return null;
|
|
35
|
+
return [m[1], rest];
|
|
36
|
+
}
|
|
37
|
+
/** Characters that may not START a plain YAML scalar. */
|
|
38
|
+
const INDICATOR = /^[-?:,\]}#&*!%@`]/;
|
|
39
|
+
/** Index just past the closing quote of a quoted scalar starting at 0, or -1 when it never closes. */
|
|
40
|
+
function closeQuote(s) {
|
|
41
|
+
const q = s[0];
|
|
42
|
+
for (let i = 1; i < s.length; i++) {
|
|
43
|
+
if (q === '"' && s[i] === "\\") {
|
|
44
|
+
i++;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (s[i] !== q)
|
|
48
|
+
continue;
|
|
49
|
+
if (q === "'" && s[i + 1] === "'") {
|
|
50
|
+
i++;
|
|
51
|
+
continue;
|
|
52
|
+
} // '' is an escaped ' in single quotes
|
|
53
|
+
return i + 1;
|
|
54
|
+
}
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
/** Why a PLAIN (unquoted) value is not strict YAML, or null. */
|
|
58
|
+
function plainProblem(v) {
|
|
59
|
+
if (/: /.test(v) || v.endsWith(":"))
|
|
60
|
+
return `is unquoted and contains ": ", which strict YAML reads as a second key`;
|
|
61
|
+
if (/[ \t]#/.test(v))
|
|
62
|
+
return `is unquoted and contains " #", which strict YAML reads as the start of a comment`;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* A short sentence naming the first frontmatter key whose value is not strict YAML, and why;
|
|
67
|
+
* null when the file has no frontmatter or nothing in it trips these rules.
|
|
68
|
+
*/
|
|
69
|
+
export function frontmatterYamlProblem(text) {
|
|
70
|
+
const lines = frontmatterLines(text);
|
|
71
|
+
if (!lines)
|
|
72
|
+
return null;
|
|
73
|
+
let key = null;
|
|
74
|
+
let plain = false;
|
|
75
|
+
for (const line of lines) {
|
|
76
|
+
if (!line.trim() || /^[ \t]*#/.test(line))
|
|
77
|
+
continue;
|
|
78
|
+
if (/^[ \t]/.test(line)) {
|
|
79
|
+
// A continuation of the previous key's value: a plain one keeps the plain-scalar rules.
|
|
80
|
+
if (key && plain) {
|
|
81
|
+
const why = plainProblem(line.trim());
|
|
82
|
+
if (why)
|
|
83
|
+
return `The \`${key}\` value continues onto a line that ${why.replace(/^is unquoted and /, "")}.`;
|
|
84
|
+
}
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const m = keyLine(line);
|
|
88
|
+
if (!m) {
|
|
89
|
+
key = null;
|
|
90
|
+
plain = false;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
key = m[0].replace(/^["']|["']$/g, "");
|
|
94
|
+
const v = m[1].trim();
|
|
95
|
+
plain = false;
|
|
96
|
+
if (!v)
|
|
97
|
+
continue;
|
|
98
|
+
const c = v[0];
|
|
99
|
+
if (c === '"' || c === "'") {
|
|
100
|
+
const end = closeQuote(v);
|
|
101
|
+
if (end < 0)
|
|
102
|
+
return `The \`${key}\` value opens a ${c === '"' ? "double" : "single"}-quoted string that does not close on that line.`;
|
|
103
|
+
const after = v.slice(end).trim();
|
|
104
|
+
if (after && !after.startsWith("#"))
|
|
105
|
+
return `The \`${key}\` value has text after its closing quote.`;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (c === "|" || c === ">" || c === "[" || c === "{")
|
|
109
|
+
continue;
|
|
110
|
+
plain = true;
|
|
111
|
+
if (INDICATOR.test(v))
|
|
112
|
+
return `The \`${key}\` value is unquoted and starts with "${c}", which strict YAML reserves.`;
|
|
113
|
+
const why = plainProblem(v);
|
|
114
|
+
if (why)
|
|
115
|
+
return `The \`${key}\` value ${why}.`;
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=yamlfront.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yamlfront.js","sourceRoot":"","sources":["../src/yamlfront.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,+CAA+C,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACtB,CAAC;AACD,yDAAyD;AACzD,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC,sGAAsG;AACtG,SAAS,UAAU,CAAC,CAAS;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAClD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,SAAS;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC,CAAG,sCAAsC;QAC9F,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,gEAAgE;AAChE,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,wEAAwE,CAAC;IACrH,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,kFAAkF,CAAC;IAChH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,wFAAwF;YACxF,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACjB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtC,IAAI,GAAG;oBAAE,OAAO,SAAS,GAAG,uCAAuC,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,GAAG,CAAC;YAC7G,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,CAAC;YAAC,GAAG,GAAG,IAAI,CAAC;YAAC,KAAK,GAAG,KAAK,CAAC;YAAC,SAAS;QAAC,CAAC;QAChD,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,GAAG,KAAK,CAAC;QACd,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,SAAS,GAAG,oBAAoB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,kDAAkD,CAAC;YACtI,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,GAAG,4CAA4C,CAAC;YACrG,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,SAAS;QAC/D,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,GAAG,yCAAyC,CAAC,gCAAgC,CAAC;QACrH,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG;YAAE,OAAO,SAAS,GAAG,YAAY,GAAG,GAAG,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "waterplane",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "waterplane",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.16",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@xterm/headless": "5.5.0",
|
package/package.json
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "android-apps",
|
|
3
|
+
"name": "Android apps",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"apiVersion": "2.5",
|
|
6
|
+
"description": "Your repos' Android apps on this phone: build, download and install each one, and the history of what installed itself where. On by itself when a repo here builds an Android app.",
|
|
7
|
+
"host": "host/index.mts",
|
|
8
|
+
"web": "web/index.ts",
|
|
9
|
+
"optional": true,
|
|
10
|
+
"autoOn": "androidRepo"
|
|
11
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GET /api/agent/builds?dir=` and `POST /api/agent/builds/run` — an agent runs one of its repo's BUILD BUTTONS,
|
|
3
|
+
* exactly as a tap on the phone would (`BuildManager.run`): same entry, same parameter rules, same refusals.
|
|
4
|
+
*
|
|
5
|
+
* Why it exists: only a button run is collected into `.claude/outbox/` (`artifacts.ts`), recorded and picked up by
|
|
6
|
+
* the auto-download rule — an APK the agent built with `./gradlew` in its own shell stays in `build/` and never
|
|
7
|
+
* reaches the phone (owner, 2026-11-01: "build it and put it on my phone" had no answer short of "tap the button").
|
|
8
|
+
* It grants nothing new: the agent can already run the command itself; this only routes it through the one path
|
|
9
|
+
* whose output reaches a person.
|
|
10
|
+
*
|
|
11
|
+
* Same caller gate as every agent route (`agentCallerRefusal`: loopback, not proxied, not a browser). `key` is
|
|
12
|
+
* required and makes the run once-only (`agent-build-<key>` is the intent id; a retry answers the same run).
|
|
13
|
+
* An entry that is not in the repo's `builds.json` is refused — an agent cannot run a command through this route,
|
|
14
|
+
* only a button the person can see.
|
|
15
|
+
*/
|
|
16
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
17
|
+
import type { BuildConfig, BuildRun } from "@waterplane/shared";
|
|
18
|
+
export interface AgentBuildDeps {
|
|
19
|
+
builds: {
|
|
20
|
+
list(repoDir: string): BuildConfig[];
|
|
21
|
+
run(repoDir: string, buildId: string, given?: Record<string, string>, opts?: {
|
|
22
|
+
origin?: string;
|
|
23
|
+
id?: string;
|
|
24
|
+
}): BuildRun | {
|
|
25
|
+
error: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/** The containment gate on a client-named directory (`wsops.ts`); null = refuse. */
|
|
29
|
+
containRepoDir(dir: unknown): Promise<string | null>;
|
|
30
|
+
/** A repo id (from `/api/repos`) → its worktree, or null. */
|
|
31
|
+
repoDir(id: string): Promise<string | null>;
|
|
32
|
+
json(res: ServerResponse, data: unknown, status?: number): void;
|
|
33
|
+
readJson(req: IncomingMessage): Promise<any>;
|
|
34
|
+
}
|
|
35
|
+
/** The entry as an agent needs it: what to pass, nothing the phone's form state holds. */
|
|
36
|
+
export declare function agentBuildEntry(b: BuildConfig): {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
cmd: string;
|
|
40
|
+
dir?: string;
|
|
41
|
+
params?: {
|
|
42
|
+
id: string;
|
|
43
|
+
options?: string[];
|
|
44
|
+
default?: string;
|
|
45
|
+
}[];
|
|
46
|
+
};
|
|
47
|
+
/** `true` when the request was this route's (answered, or refused). */
|
|
48
|
+
export declare function handleAgentBuilds(req: IncomingMessage, res: ServerResponse, path: string, url: URL, d: AgentBuildDeps): Promise<boolean>;
|