workbite 0.1.13 → 0.1.14
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/README.md +18 -6
- package/lib/cli.js +2 -1
- package/lib/install.js +5 -0
- package/lib/runtime.js +22 -3
- package/package.json +1 -1
- package/release.json +12 -12
package/README.md
CHANGED
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
WorkBite installs and opens **Work Stack** (organizes the work) and
|
|
4
4
|
**StackBite** (gets it moving) as one native suite.
|
|
5
5
|
|
|
6
|
-
Launcher 0.1.
|
|
7
|
-
|
|
6
|
+
Launcher 0.1.14 pins the **Windows x64** native bundle and is published under
|
|
7
|
+
the `windows` dist-tag. Install it with `npm install -g workbite@0.1.14`.
|
|
8
|
+
The `latest` dist-tag retains the earlier Windows/Linux x64 (glibc 2.28+)
|
|
9
|
+
release; no new Linux binary is included in 0.1.14.
|
|
10
|
+
It opens the familiar TypeScript Work Stack UI by default, which
|
|
8
11
|
has one Tasks workbench: switch Focus/Table/Board without losing your selected
|
|
9
12
|
Task, deploy its agent, and control the native terminal beside or below the Tasks.
|
|
10
13
|
Use F6 to move focus, Ctrl+B to hide the sidebar, Alt+Shift+L to switch layouts,
|
|
@@ -24,7 +27,7 @@ operator handover of existing backend processes; the launcher does not stop
|
|
|
24
27
|
them or clear startup records automatically.
|
|
25
28
|
|
|
26
29
|
```sh
|
|
27
|
-
npm install -g workbite
|
|
30
|
+
npm install -g workbite@0.1.14 # Windows x64
|
|
28
31
|
workbite install
|
|
29
32
|
workbite open --workspace /abs/path/new-folder --init # first time, once
|
|
30
33
|
workbite # afterwards (TypeScript UI)
|
|
@@ -67,9 +70,8 @@ with absolute `WORKBITE_HOME` / `WORKBITE_STATE_DIR`) and never touches
|
|
|
67
70
|
separately installed Work Stack or StackBite apps, their state or ports. It
|
|
68
71
|
never approves provider trust or starts paid agents by itself.
|
|
69
72
|
|
|
70
|
-
Startup diagnostics
|
|
71
|
-
`workbite doctor [--json]` and `workbite recover --dry-run [--json]`.
|
|
72
|
-
installed launcher's `--help` before using them. They inspect evidence and plan
|
|
73
|
+
Startup diagnostics include `workbite status [--json]`,
|
|
74
|
+
`workbite doctor [--json]` and `workbite recover --dry-run [--json]`. They inspect evidence and plan
|
|
73
75
|
only: no process starts/stops, record reset, native intent repair or migration.
|
|
74
76
|
`open --no-ui` does start/reuse the backend stack (including native selection for
|
|
75
77
|
v2) and prints JSON, but never launches or validates the foreground UI. Startup
|
|
@@ -103,5 +105,15 @@ it starts. The `workbite-native` agent skill shipped in this package
|
|
|
103
105
|
(`skills/workbite-native/`) describes the commands, packets and recovery
|
|
104
106
|
rules.
|
|
105
107
|
|
|
108
|
+
Windows 0.1.14 also includes a read-only phone companion pilot. Open Settings
|
|
109
|
+
with `,`, select Phone, enable it, then pair using the expiring QR and compare
|
|
110
|
+
the complete fingerprint before approving on the PC. Remembered browsers can
|
|
111
|
+
reconnect; devices can be revoked. Initial PC enrollment requires an operator
|
|
112
|
+
invitation through the supported embedding/bootstrap surface; this release
|
|
113
|
+
does not include a public invitation-entry UI. The hosted relay needs no user
|
|
114
|
+
domain or Cloudflare client. CurrentUser DPAPI on local NTFS is required.
|
|
115
|
+
Mobile Task writes, deployment, terminal input, replies, notifications and
|
|
116
|
+
background connectivity are not supported. The PC must remain online.
|
|
117
|
+
|
|
106
118
|
This package is `UNLICENSED` (all rights reserved). Third-party licenses ship
|
|
107
119
|
in each bundle's `licenses/` folder.
|
package/lib/cli.js
CHANGED
|
@@ -317,7 +317,8 @@ async function main(argv = process.argv.slice(2), options = {}) {
|
|
|
317
317
|
return { code: 0, signal: null };
|
|
318
318
|
}
|
|
319
319
|
return openSuite({ installed, commands: options.commands, workspace: parsed.workspace, init: parsed.init, ui: parsed.ui,
|
|
320
|
-
frontend: parsed.frontend, stateRoot, environment, spawnImpl: options.spawnImpl, execImpl: options.execImpl, stdout, stderr, timeouts: options.timeouts
|
|
320
|
+
frontend: parsed.frontend, stateRoot, environment, spawnImpl: options.spawnImpl, execImpl: options.execImpl, stdout, stderr, timeouts: options.timeouts,
|
|
321
|
+
mobileBootstrap: options.mobileBootstrap });
|
|
321
322
|
}
|
|
322
323
|
|
|
323
324
|
module.exports = { main, parseArguments, HELP };
|
package/lib/install.js
CHANGED
|
@@ -105,6 +105,11 @@ async function validateBundle(directory, spec) {
|
|
|
105
105
|
try { bundle = JSON.parse(bundleBytes.toString('utf8')); } catch { fail('bundle.json is not valid JSON'); }
|
|
106
106
|
if (!plainObject(bundle) || !Object.hasOwn(ROSTERS, bundle.schema)) fail('bundle.json identity or executable layout mismatch');
|
|
107
107
|
const executables = expectedExecutables(spec, bundle.schema);
|
|
108
|
+
// Optional reviewed Windows mobile assembly. Older v1/v2 bundles keep their exact roster.
|
|
109
|
+
// A mobile entry is accepted only at this fixed path and receives the same full hash/magic proof.
|
|
110
|
+
if (bundle.schema === BUNDLE_V2 && spec.platform === 'win32' && Object.hasOwn(bundle.executables || {}, 'workbite_mobile')) {
|
|
111
|
+
executables.workbite_mobile = 'workstack/workbite-mobile.exe';
|
|
112
|
+
}
|
|
108
113
|
if (bundle.product !== 'WorkBite'
|
|
109
114
|
|| bundle.version !== spec.version || bundle.target !== spec.target || !plainObject(bundle.components)
|
|
110
115
|
|| !sameKeys(bundle.executables, Object.keys(executables))
|
package/lib/runtime.js
CHANGED
|
@@ -605,14 +605,16 @@ function typescriptExecutionEnvironment(layout, bridge) {
|
|
|
605
605
|
}
|
|
606
606
|
const verifiedPath = value => typeof value === 'string' && path.isAbsolute(value) && !/[\x00-\x1f]/.test(value);
|
|
607
607
|
|
|
608
|
-
function uiEnvironment(base, { executables, layout, endpoint, uid, backendId, execution = null, bridge = null }) {
|
|
608
|
+
function uiEnvironment(base, { executables, layout, endpoint, uid, backendId, execution = null, bridge = null, mobile = null }) {
|
|
609
609
|
const home = path.dirname(executables.stackbite);
|
|
610
610
|
return withPath({ ...base, WORKSTACK_TRANSPORT: 'native', WORKSTACK_NATIVE_CLIENT: executables.workstack_client,
|
|
611
611
|
WORKSTACK_ENDPOINT: endpoint, WORKSTACK_WORKSPACE_UID: uid, WORKSTACK_STATE_DIR: layout.tuiState,
|
|
612
612
|
WORKSTACK_EXECUTION_DOCK_CONFIG: layout.dock, WORKSTACK_EXECUTION_DOCK_BACKEND_ID: backendId,
|
|
613
613
|
WORKSTACK_DEPLOY_JOURNAL_DIR: layout.journal, WORKSTACK_STACKBITE_EXECUTABLE: executables.stackbite,
|
|
614
614
|
...(execution ? { WORKSTACK_TUI_STATE: layout.tuiIntent, WORKSTACK_TUI_SETTINGS: layout.tuiSettings } : {}),
|
|
615
|
-
...(bridge ? typescriptExecutionEnvironment(layout, bridge) : {})
|
|
615
|
+
...(bridge ? typescriptExecutionEnvironment(layout, bridge) : {}),
|
|
616
|
+
...(mobile ? { WORKBITE_MOBILE_EXECUTABLE: executables.workbite_mobile,
|
|
617
|
+
WORKBITE_MOBILE_HOST: JSON.stringify(mobile) } : {}) }, home);
|
|
616
618
|
}
|
|
617
619
|
|
|
618
620
|
function runForeground(command, args, environment, { spawnImpl = spawn, signalSource = process,
|
|
@@ -646,7 +648,7 @@ function runForeground(command, args, environment, { spawnImpl = spawn, signalSo
|
|
|
646
648
|
// commands maps each bundle executable to its argv prefix; tests substitute fixtures.
|
|
647
649
|
async function openSuite({ installed, commands, workspace, init = false, stateRoot, environment = process.env,
|
|
648
650
|
ui = true, frontend = 'typescript', spawnImpl = spawn, execImpl = execFile, platform = process.platform,
|
|
649
|
-
stdout = process.stdout, stderr = process.stderr, timeouts = {}, bootImpl = bootIdentity }) {
|
|
651
|
+
stdout = process.stdout, stderr = process.stderr, timeouts = {}, bootImpl = bootIdentity, mobileBootstrap = undefined }) {
|
|
650
652
|
if (!FRONTENDS.includes(frontend)) fail(`--frontend must be one of: ${FRONTENDS.join(', ')}`);
|
|
651
653
|
if (workspace !== undefined) workspace = checkedWorkspace(workspace);
|
|
652
654
|
else if (init) fail('--init needs --workspace ABS naming the new or empty folder');
|
|
@@ -738,6 +740,23 @@ async function openSuite({ installed, commands, workspace, init = false, stateRo
|
|
|
738
740
|
const environmentForUi = uiEnvironment(base, { executables: installed.executables, layout, endpoint: session.engine.endpoint,
|
|
739
741
|
uid: session.uid, backendId: session.backendId, execution: frontend === 'rust' ? execution : null,
|
|
740
742
|
bridge: bridge && ['enabled', 'initialized'].includes(session.executionUi) ? bridge : null });
|
|
743
|
+
if (frontend === 'typescript' && platform === 'win32' && verifiedPath(installed.executables?.workbite_mobile)) {
|
|
744
|
+
const mobileRoot = path.join(layout.root, 'mobile');
|
|
745
|
+
await stage('private phone state', async () => {
|
|
746
|
+
await safeDirectory(mobileRoot);
|
|
747
|
+
await protectPrivateDirectories([mobileRoot], { platform, environment: base, execImpl: startupExec,
|
|
748
|
+
timeout: finiteTimeout(timeouts.privateState, 60000) });
|
|
749
|
+
});
|
|
750
|
+
environmentForUi.WORKBITE_MOBILE_EXECUTABLE = installed.executables.workbite_mobile;
|
|
751
|
+
environmentForUi.WORKBITE_MOBILE_HOST = JSON.stringify({
|
|
752
|
+
directory: path.join(mobileRoot, workspaceKey(workspace)), executable: installed.executables.workbite_mobile,
|
|
753
|
+
scope: { host_id: session.backendId, workspace_uid: session.uid },
|
|
754
|
+
native: { executable: installed.executables.workstack_client, cwd: workspace, endpoint: session.engine.endpoint,
|
|
755
|
+
workspaceUid: session.uid, deployment: { connection: layout.dock, backendId: session.backendId, journalDir: layout.journal } },
|
|
756
|
+
// Embedding hosts may supply the private operator invitation at first setup; never a token.
|
|
757
|
+
...(mobileBootstrap ? { initialInput: mobileBootstrap } : {}),
|
|
758
|
+
});
|
|
759
|
+
}
|
|
741
760
|
// Exactly one foreground child in this terminal (inherited stdio, never detached or a new console).
|
|
742
761
|
// The TypeScript UI gets the v1 environment (keeping its own familiar settings file) plus, when the
|
|
743
762
|
// v2 opt-in is enabled, only the WORKBITE_EXECUTION_* names above.
|
package/package.json
CHANGED
package/release.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"schema": "workbite.release.v1",
|
|
3
|
+
"product": "WorkBite",
|
|
4
|
+
"repository": "Shinick-Han/WorkBite-releases",
|
|
5
|
+
"tag": "v0.1.14",
|
|
6
|
+
"version": "0.1.14",
|
|
7
|
+
"launcherVersion": "0.1.14",
|
|
3
8
|
"platforms": {
|
|
4
9
|
"windows-x64": {
|
|
5
|
-
"asset": "workbite-0.1.
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"size":
|
|
9
|
-
"url": "https://github.com/Shinick-Han/WorkBite-releases/releases/download/v0.1.
|
|
10
|
+
"asset": "workbite-0.1.14-windows-x64.zip",
|
|
11
|
+
"sha256": "3cac949c2b9d5135dfa195425581b7f731d1e28eb6712069781f0f82f6adcdfd",
|
|
12
|
+
"bundleSha256": "459ae8b6667a13613824729e8b35c1df13c8d9fa77f757fbbcdc312f2c224742",
|
|
13
|
+
"size": 136146372,
|
|
14
|
+
"url": "https://github.com/Shinick-Han/WorkBite-releases/releases/download/v0.1.14/workbite-0.1.14-windows-x64.zip"
|
|
10
15
|
}
|
|
11
|
-
}
|
|
12
|
-
"product": "WorkBite",
|
|
13
|
-
"repository": "Shinick-Han/WorkBite-releases",
|
|
14
|
-
"schema": "workbite.release.v1",
|
|
15
|
-
"tag": "v0.1.13",
|
|
16
|
-
"version": "0.1.13"
|
|
16
|
+
}
|
|
17
17
|
}
|