@ours.network/fleet 1.2.0-nightly.28 → 1.2.0-nightly.29

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
@@ -1825,3 +1825,5 @@ See [Room layouts](docs/room-layouts.md) for YAML examples and CLI commands.
1825
1825
  ### Dedicated notification service
1826
1826
 
1827
1827
  Configure the web backend with `OURS_NOTIFICATIONS_ORIGIN` and a Fleet-scoped `OURS_NOTIFICATIONS_PRODUCER_TOKEN`. It reads each local supervisor ledger incrementally with persistent checkpoints under web state, correlating owner browser/channel prompts with terminal completion. Monitor/startup turns do not notify. First installation skips existing history; no agent restart or conversation controller is needed. Persist web state across deployment/restarts. Reads are bounded to 256 KiB per role per tick, and oversized model/media records are skipped across chunks. Expose `/notifications` through the generic authenticated prefix gateway with a server-side user token and `stripBrowserContext: true`; producer tokens stay server-side. All browser sessions of this single-owner console map to one stable notification account. See [ours-notifications](https://github.com/adapt-toolkit/ours-notifications) for configuration/API/release details.
1828
+
1829
+ Existing-host enrollment: `ours-fleet workspace-enroll --file <private-file> --preserve-profile` requires Messenger to advertise preservation support before any enrollment POST. It omits Name/Surname and leaves existing/absent profile untouched. Existing Fleet models and agents are retained; the installer must skip init when its configuration exists. Signed root proof, tunnel setup and device QR issuance remain the normal enrollment flow. Older Messenger fails closed and requires its preservation-capable release.
@@ -1,10 +1,11 @@
1
1
  {
2
- "version": "1.2.0-nightly.28",
3
- "buildId": "7b8a6a05d7bf",
4
- "commit": "e3c40e2873a322b6f0b43d940475eed2a94eb2c4",
2
+ "version": "1.2.0-nightly.29",
3
+ "buildId": "cc1740d5df7b",
4
+ "commit": "e4737a56d25b0244222bd94b25c299825b8f916f",
5
5
  "dirty": true,
6
- "builtAt": "2026-10-01T07:15:35.480Z",
6
+ "builtAt": "2026-10-01T10:23:02.435Z",
7
7
  "capabilities": [
8
+ "workspace.enroll.preserve-profile-v1",
8
9
  "cowork.http-management-v1",
9
10
  "monitor.interrupt.after_tool"
10
11
  ]
@@ -15,7 +15,8 @@
15
15
  /** `monitor.interrupt: after_tool` — cancel at the next tool boundary (#67). */
16
16
  export declare const CAP_MONITOR_INTERRUPT_AFTER_TOOL = "monitor.interrupt.after_tool";
17
17
  export declare const CAP_HTTP_COWORK = "cowork.http-management-v1";
18
- export declare const CAPABILITIES: readonly ["cowork.http-management-v1", "monitor.interrupt.after_tool"];
18
+ export declare const CAP_WORKSPACE_PRESERVE_PROFILE = "workspace.enroll.preserve-profile-v1";
19
+ export declare const CAPABILITIES: readonly ["workspace.enroll.preserve-profile-v1", "cowork.http-management-v1", "monitor.interrupt.after_tool"];
19
20
  export type Capability = (typeof CAPABILITIES)[number];
20
21
  /** Does this build declare `token`? */
21
22
  export declare const hasCapability: (token: string) => boolean;
@@ -15,7 +15,9 @@
15
15
  /** `monitor.interrupt: after_tool` — cancel at the next tool boundary (#67). */
16
16
  export const CAP_MONITOR_INTERRUPT_AFTER_TOOL = 'monitor.interrupt.after_tool';
17
17
  export const CAP_HTTP_COWORK = 'cowork.http-management-v1';
18
+ export const CAP_WORKSPACE_PRESERVE_PROFILE = 'workspace.enroll.preserve-profile-v1';
18
19
  export const CAPABILITIES = [
20
+ CAP_WORKSPACE_PRESERVE_PROFILE,
19
21
  CAP_HTTP_COWORK,
20
22
  CAP_MONITOR_INTERRUPT_AFTER_TOOL,
21
23
  ];
package/dist/cli.js CHANGED
@@ -1531,10 +1531,11 @@ webCommand.command('open').description('securely open or re-pair a browser with
1531
1531
  });
1532
1532
  cOpt(program.command('workspace-enroll').description('enroll this host using a private account setup file'))
1533
1533
  .requiredOption('--file <path>', 'owned private payload file')
1534
+ .option('--preserve-profile', 'retain the existing human profile without creating or rewriting it')
1534
1535
  .option('--migrate-app-origin', 'explicitly migrate the same workspace to its new account origin after verified signed proof')
1535
1536
  .action(async (opts) => {
1536
1537
  try {
1537
- const result = await enrollWorkspace(readWorkspacePayload(opts.file), opts.configuration, { migrateAppOrigin: opts.migrateAppOrigin });
1538
+ const result = await enrollWorkspace(readWorkspacePayload(opts.file), opts.configuration, { migrateAppOrigin: opts.migrateAppOrigin, preserveProfile: opts.preserveProfile });
1538
1539
  if (!existsSync(new WebAccessStore().path))
1539
1540
  configureWebAccess({ pairing: true });
1540
1541
  const manager = new WebServiceManager();
@@ -18,6 +18,7 @@ export interface WorkspacePayload {
18
18
  export declare function readWorkspacePayload(file: string): WorkspacePayload;
19
19
  export declare function enrollWorkspace(payload: WorkspacePayload, configuration?: string, options?: {
20
20
  migrateAppOrigin?: boolean;
21
+ preserveProfile?: boolean;
21
22
  }): Promise<{
22
23
  origin: string;
23
24
  hostWorkspaceId: string;
@@ -63,6 +63,8 @@ export async function enrollWorkspace(payload, configuration = defaultConfigPath
63
63
  const identity = await request('workspace/enrollment-identity');
64
64
  if (!/^[a-f0-9]{64}$/i.test(identity.cid))
65
65
  throw Error('Bound Messenger identity unavailable');
66
+ if (options.preserveProfile && identity.preserveProfile !== true)
67
+ throw Error('Existing-host setup requires Messenger profile-preservation support; update the host Messenger before retrying');
66
68
  if (loaded.rooms && loaded.rooms.owner.expected_cid.toLowerCase() !== identity.cid.toLowerCase())
67
69
  throw Error('Retained room owner CID conflicts with the Human root');
68
70
  const inviteFile = loaded.rooms?.owner.public_invite_file || join(dir, 'owner.invite');
@@ -74,7 +76,8 @@ export async function enrollWorkspace(payload, configuration = defaultConfigPath
74
76
  const devices = new WorkspaceDeviceStore();
75
77
  const hostWorkspaceId = devices.workspaceId;
76
78
  devices.close();
77
- const result = await request('workspace/enroll', { ...payload, hostWorkspaceId });
79
+ const { name, surname, ...proofPayload } = payload;
80
+ const result = await request('workspace/enroll', options.preserveProfile ? { ...proofPayload, hostWorkspaceId, preserveProfile: true } : { ...payload, hostWorkspaceId });
78
81
  if (!result.submitted || !/^[a-f0-9]{64}$/i.test(result.rootCid) || typeof result.ownerInvite !== 'string')
79
82
  throw Error('Malformed workspace enrollment response');
80
83
  if (loaded.rooms && loaded.rooms.owner.expected_cid.toLowerCase() !== result.rootCid.toLowerCase())
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ours.network/fleet",
3
- "version": "1.2.0-nightly.28",
3
+ "version": "1.2.0-nightly.29",
4
4
  "description": "Harness-agnostic fleet of persistent, identity-bound AI agents. Declarative fleet.yaml, managed native/ACP sessions, supervision, and ours.network messaging.",
5
5
  "type": "module",
6
6
  "license": "FSL-1.1-Apache-2.0",