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 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.11 (native bundle 0.1.11) supports **Windows x64 and Linux x64**
7
- (glibc 2.28+). It opens the familiar TypeScript Work Stack UI by default, which
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 in the **unreleased source** add `workbite status [--json]`,
71
- `workbite doctor [--json]` and `workbite recover --dry-run [--json]`. Check your
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) : {}) }, home);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workbite",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "WorkBite (Work Stack + StackBite) verified native suite installer and launcher",
5
5
  "license": "UNLICENSED",
6
6
  "engines": {
package/release.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
- "launcherVersion": "0.1.13",
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.13-windows-x64.zip",
6
- "bundleSha256": "61886b62c848d3342580b27eb6ca76acac4bd2c608b67684139434893602d7d1",
7
- "sha256": "061fb2b08470c9f39afc5d109abb2521e4ba137455aaebd75a7b2b1b8ccc36f5",
8
- "size": 97782408,
9
- "url": "https://github.com/Shinick-Han/WorkBite-releases/releases/download/v0.1.13/workbite-0.1.13-windows-x64.zip"
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
  }