@ours.network/fleet 1.2.0-nightly.53 → 1.2.0-nightly.54

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.
@@ -0,0 +1,102 @@
1
+ # Sending files in an ACP chat
2
+
3
+ An opted-in managed Agent uses the existing Ours `send_file` tool:
4
+
5
+ ```json
6
+ {"path":"deliverables/report.pdf"}
7
+ ```
8
+
9
+ Omitting `contact` sends to the current ACP chat. Supplying a non-empty contact
10
+ keeps ordinary Ours delivery:
11
+
12
+ ```json
13
+ {"contact":"Alice","path":"deliverables/report.pdf"}
14
+ ```
15
+
16
+ Only an absent contact chooses the chat. Null, empty or whitespace-only contacts,
17
+ unknown fields and unknown recipients fail without falling back to chat. Outside
18
+ opt-in, contact remains required. Current-chat sending accepts `path`, optional
19
+ `filename` and `mime`; inline base64 and Ours reply fields are unsupported.
20
+
21
+ Each call makes one attempt. Failures are returned to the agent. There is no
22
+ request ID, deduplication, automatic retry or recovery of failed sends. If a user
23
+ asks to resend, another tool call makes a new attempt and can produce another
24
+ attachment. UUIDs identify stored attachments; the stored SHA-256 checks integrity.
25
+ Neither is a retry key.
26
+
27
+ Set this on the Agent definition, not manifest defaults or a Brain:
28
+
29
+ ```yaml
30
+ file_delivery:
31
+ enabled: true
32
+ directory: deliverables
33
+ ```
34
+
35
+ The tool description advertises this directory and the 20 MiB limit to the Agent.
36
+ The directory is a non-hidden subtree of the Agent's working directory. Both
37
+ routes interpret relative paths from that working directory; absolute paths keep
38
+ their usual meaning. Chat sending additionally enforces the export directory.
39
+ The Agent should finish writing the file before calling `send_file`. Symlinks,
40
+ hardlinks, hidden/credential paths, changed files and files over 20 MiB fail.
41
+
42
+ Initial support requires Linux, the managed Ours connector, a stock Codex or
43
+ Claude ACP adapter, and a tracked active turn. Idle, scheduled, steered, cancelled,
44
+ replaced and unsupported sessions cannot export. Existing native tool approval
45
+ and the neutral role permission policy both apply before bytes are read. An
46
+ `ask` decision needs an attached controller; `deny` refuses. A native policy that
47
+ refuses MCP execution (including Codex `never` without a native tool allowance)
48
+ can still refuse before Fleet receives the call.
49
+
50
+ Codex requires native runtime 0.159.0 or newer and Fleet's managed App Server
51
+ proxy. Before each turn, its public exact-thread, paginated MCP inventory must
52
+ show a connected managed `ours` with the expected optional-contact schema.
53
+ Ours aliases, filtered aliases, ambiguous identity, failed discovery and an
54
+ incompatible schema make the turn unavailable. Unrelated identified tools are
55
+ preserved. Explicitly disabled Ours is rejected before replacement. Inherited
56
+ TOML MCP settings, including project/profile sources, are conservatively
57
+ unsupported until their disabling semantics can be qualified before replacement.
58
+ Use a clean Codex configuration home for this initial opt-in.
59
+
60
+ Claude ACP 0.63.0's installed wrapper has no public same-session inventory RPC. Initial
61
+ support therefore requires an operator's explicit restricted MCP configuration:
62
+
63
+ ```yaml
64
+ harness_options:
65
+ mcp_servers_only: true
66
+ mcp_servers:
67
+ ours: { command: ours-mcp, args: [proxy] }
68
+ ```
69
+
70
+ Fleet replaces that connector with its bound bridge. Additional explicit MCP
71
+ servers and custom ACP commands are unsupported for this feature. Default-off
72
+ Agents retain their existing configuration.
73
+
74
+ Successful sends copy complete bytes into private immutable storage and append a
75
+ server-origin `file.attached` event containing the actual session generation,
76
+ ACP session and managed turn. One export can run at a time. Cancellation or
77
+ steering before publication revokes it; cancellation after publication does not
78
+ undo it. Unpublished stored bytes are never replayed or republished. Storage is
79
+ bounded to 100 files and 200 MiB per role incarnation, including incomplete and
80
+ orphaned copies. Exhausted storage fails; no automatic recovery is performed.
81
+
82
+ The App renders persisted file cards from these typed events. HTML and images
83
+ also download as files. Downloads require authentication, the matching role
84
+ incarnation, a published conversation event and intact bytes. Deleted, missing,
85
+ changed or orphaned artifacts return unavailable. Remote workspaces fetch bytes
86
+ using their existing device credential, limit the read to 20 MiB and prevent
87
+ saving after a workspace change.
88
+
89
+ ## Release prerequisite and qualification
90
+
91
+ This source requires the companion MCP implementation's
92
+ `MANAGED_FILE_DELIVERY_VERSION = 1`. Fleet pins published
93
+ `@ours.network/mcp@1.2.0-nightly.13`, which includes it. Older MCP packages without
94
+ this capability fail closed when file delivery is enabled. Changes to the MCP
95
+ pin require clean installed-package qualification without a built MCP overlay.
96
+
97
+ The deterministic native fixture uses real ACP adapters, the real managed
98
+ connector and an isolated daemon. A local scripted provider supplies only tool
99
+ intents; approval, read, copy, publication and bytes come from the implementation.
100
+ It does not qualify external-model inference, deployment or arbitrary native
101
+ MCP request-to-ACP tool-call ID mapping. Correlation is the authenticated bridge
102
+ and the actual active Fleet turn, which is revoked by cancellation/steering.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ours.network/fleet",
3
- "version": "1.2.0-nightly.53",
3
+ "version": "1.2.0-nightly.54",
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",
@@ -22,7 +22,8 @@
22
22
  "docs/live-voice.md",
23
23
  "docs/room-layouts.md",
24
24
  "docs/validation/managed-cli-permissions.md",
25
- "LICENSE"
25
+ "LICENSE",
26
+ "docs/acp-files.md"
26
27
  ],
27
28
  "engines": {
28
29
  "node": ">=22.13.0"
@@ -43,7 +44,7 @@
43
44
  "@agentclientprotocol/sdk": "^1.3.0",
44
45
  "@fastify/websocket": "^11.2.0",
45
46
  "@ours.network/cli": "2.8.1-nightly.15",
46
- "@ours.network/mcp": "1.2.0-nightly.12",
47
+ "@ours.network/mcp": "1.2.0-nightly.13",
47
48
  "@ours.network/sdk": "3.8.1-nightly.17",
48
49
  "commander": "^12.1.0",
49
50
  "fastify": "^5.4.0",