@awebai/oats 0.29.1 → 0.29.3
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/capabilities/oats-aweb/bin/oats-aweb.mjs +210 -58
- package/capabilities/oats-aweb/injects/aweb.md +39 -74
- package/capabilities/oats-aweb/lib/binding-wire.mjs +14 -5
- package/capabilities/oats-aweb/lib/wake-receive.mjs +56 -0
- package/capabilities/oats-aweb/oats.json +7 -6
- package/capabilities/oats-aweb/skills/VENDORED.md +6 -1
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +24 -14
- package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +1 -1
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +216 -0
- package/docs/capabilities.md +3 -4
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +2 -0
- package/docs/design/2026-09-24-phase-d-plan.md +2 -0
- package/docs/design/2026-09-25-teams-contract.md +36 -4
- package/docs/design/2026-09-26-desktop-design-brief-architecture.md +4 -4
- package/docs/official-catalog.md +1 -1
- package/docs/packages.md +4 -4
- package/docs/release-notes/v0.29.2.md +51 -0
- package/docs/release-notes/v0.29.3.md +53 -0
- package/docs/workspaces.md +3 -3
- package/lib/core.mjs +3 -3
- package/lib/resolve.mjs +2 -2
- package/lib/workspace.mjs +3 -3
- package/package-catalog.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# OATS 0.29.2
|
|
2
|
+
|
|
3
|
+
## oats.aweb 1.15.0 (catalog pin and bundled mirror)
|
|
4
|
+
|
|
5
|
+
The catalog and this repo's workspace pin `oats.aweb` to `v1.15.0`, and the
|
|
6
|
+
bundled `capabilities/oats-aweb` is the tag's tree.
|
|
7
|
+
|
|
8
|
+
- **Live receive on joined teams.** An instance's joined teams now receive
|
|
9
|
+
live through the host wake broker. Session homes register the primary
|
|
10
|
+
identity plus every joined identity. Claude and Pi channel homes use aw's
|
|
11
|
+
mixed mode, and Codex keeps polling. Readiness reports each joined team's
|
|
12
|
+
actual mode (`joined-team-receive` or `joined-team-poll-only`, with the
|
|
13
|
+
reason). This needs aw >= 1.36.12.
|
|
14
|
+
- **The identity-home scrub (critical fix).** Provider commands and nested
|
|
15
|
+
spawns and retires no longer inherit the caller's `AWEB_IDENTITY_HOME`.
|
|
16
|
+
Inside an instance, that variable made aw refuse cwd-rooted commands, which
|
|
17
|
+
broke roster and join. On retire, it could delete the caller's workspace.
|
|
18
|
+
- **Home operations work under the kernel.** `oats operation run
|
|
19
|
+
messaging:teams|join|leave` gets exactly one JSON-v1 envelope, whose `ok`
|
|
20
|
+
agrees with the exit status. The Desktop's teams, join and leave buttons now
|
|
21
|
+
work. A partial multi-label join or leave records every label it completed.
|
|
22
|
+
A failed spawn hands its joined teams to compensation. `oats aweb join`
|
|
23
|
+
refuses resident-grant homes (`E_TEAM_GLOBAL_MODE`).
|
|
24
|
+
- **An agent playbook.** The new `oats-aweb` skill carries the playbook, and
|
|
25
|
+
the inject is shorter and points to it. `oats aweb roster --label <label>`
|
|
26
|
+
is new.
|
|
27
|
+
- **Deferred to 1.16: per-workspace personal-team enrollment.** It needs a
|
|
28
|
+
per-deployment login and a recorded owner. 1.15 makes no `aw auth` or
|
|
29
|
+
`aw team ensure` call, and the primary team resolves as in 1.14.2. A
|
|
30
|
+
host-set `settings.oats.aweb.roots.personal` is ignored with the readiness
|
|
31
|
+
warning `personal-root-deferred`.
|
|
32
|
+
|
|
33
|
+
## Desktop
|
|
34
|
+
|
|
35
|
+
- **Line counts on the Changes rows** (#245, #246). The server passes kernel
|
|
36
|
+
#238's per-file counts through, and each W6 Changes row ends with "+84 −3",
|
|
37
|
+
or "binary". An unknown count (untracked, submodule) and older kernels show
|
|
38
|
+
nothing, never "+0".
|
|
39
|
+
- **The Git & GitHub tab counts unresolved review threads** (#247). The tab and
|
|
40
|
+
the collapsed rail button say "Git & GitHub, 2 unresolved review threads".
|
|
41
|
+
- **Send N threads to <instance>** (#248, #249). When the instance's PR has
|
|
42
|
+
unresolved review threads, the Pull request card offers to send them to the
|
|
43
|
+
instance.
|
|
44
|
+
- The server composes the text, and the preview shows exactly what will be
|
|
45
|
+
pasted.
|
|
46
|
+
- The text is one line, framed as untrusted input from GitHub reviewers,
|
|
47
|
+
with control, bidi and zero-width characters stripped.
|
|
48
|
+
- It is pasted into the instance's terminal without Enter.
|
|
49
|
+
- A digest of the previewed bytes guards the send: if the threads changed,
|
|
50
|
+
nothing is pasted and the preview refreshes.
|
|
51
|
+
- The Desktop still accepts OATS CLIs `>=0.25.8 <0.30.0`.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# OATS 0.29.3
|
|
2
|
+
|
|
3
|
+
## Changed
|
|
4
|
+
|
|
5
|
+
- **There is no "personal team"; a workspace has its default team.** The
|
|
6
|
+
vocabulary follows the teams contract's amendment of 2026-09-26: a workspace
|
|
7
|
+
has its **default team** (the team for the workspace key in its owner's
|
|
8
|
+
namespace), and agents may join other teams. The model is unchanged:
|
|
9
|
+
- an instance is in the workspace's default team only, by default;
|
|
10
|
+
- joining an eligible team is an explicit act;
|
|
11
|
+
- `OATS_TEAMS` is `[]` for a soul with no label.
|
|
12
|
+
|
|
13
|
+
The kernel's docs, comments and the `unmapped-team-label` warning use the
|
|
14
|
+
new words. The warning now reads "… fall back to the workspace's default team
|
|
15
|
+
for it". The oats.framework skills (oats.core 2.1.1, oats.setup 2.1.2,
|
|
16
|
+
oats.framework 1.3.1) teach the same model. The kernel carries no wire name
|
|
17
|
+
with "personal", and there are no compatibility aliases.
|
|
18
|
+
- **The messaging provider uses the same words** (oats.aweb 1.16.0, below).
|
|
19
|
+
|
|
20
|
+
## oats.aweb 1.16.0 (catalog pin and bundled mirror)
|
|
21
|
+
|
|
22
|
+
- **The catalog and this repo's workspace pin `oats.aweb` to `v1.16.0`, and
|
|
23
|
+
the bundled `capabilities/oats-aweb` is the tag's tree.** It renames the
|
|
24
|
+
provider's wire names to the default-team vocabulary:
|
|
25
|
+
- the teams operation's `personal` field becomes `defaultTeam`
|
|
26
|
+
(`{ team, source }`, where `source` is `setting` or `root`);
|
|
27
|
+
- `E_TEAM_PERSONAL` becomes `E_TEAM_DEFAULT`;
|
|
28
|
+
- the broker receive label `personal` becomes `default`;
|
|
29
|
+
- `settings.oats.aweb.roots.personal` is removed: `roots` keys are team ids
|
|
30
|
+
only, and the `personal-root-deferred` warning is gone.
|
|
31
|
+
|
|
32
|
+
There are no aliases: a reader of the old names must move to the new ones,
|
|
33
|
+
as the Desktop does in this release. A home spawned under 1.15 still resolves
|
|
34
|
+
its default team from its recorded team. Per-workspace default-team
|
|
35
|
+
enrollment is still deferred.
|
|
36
|
+
|
|
37
|
+
## oats.framework 1.3.1 (catalog pin)
|
|
38
|
+
|
|
39
|
+
- **The catalog and this repo's workspace pin `oats.framework` to
|
|
40
|
+
`oats-framework/v1.3.1`.** Its only change is the default-team vocabulary
|
|
41
|
+
above, in `oats.core` 2.1.1 and `oats.setup` 2.1.2. A deployment on
|
|
42
|
+
`oats.framework: v1.3.0` keeps working, and moving the pin to `v1.3.1` picks
|
|
43
|
+
up the new skill text.
|
|
44
|
+
|
|
45
|
+
## Desktop
|
|
46
|
+
|
|
47
|
+
- **"Default team" everywhere** (#252). The teams panel reads oats.aweb 1.16's
|
|
48
|
+
`defaultTeam` and says where the team comes from: the workspace or host
|
|
49
|
+
setting, or the messaging root's active team. The spawn dialog, the soul
|
|
50
|
+
inspector and the teams panel say "Default team" in place of "Personal".
|
|
51
|
+
A 1.15 `personal` document no longer decodes, so this Desktop needs the
|
|
52
|
+
oats.aweb 1.16.0 pin.
|
|
53
|
+
- The Desktop still accepts OATS CLIs `>=0.25.8 <0.30.0`.
|
package/docs/workspaces.md
CHANGED
|
@@ -59,7 +59,7 @@ members: # repo refs, NO @revision (E_WORKSPAC
|
|
|
59
59
|
- git:github.com/acme/tools # a member that ALSO publishes a package (see below)
|
|
60
60
|
|
|
61
61
|
packages: # the ONLY versioned things
|
|
62
|
-
oats.framework: v1.3.
|
|
62
|
+
oats.framework: v1.3.1 # bare version → resolves through the official catalog
|
|
63
63
|
oats.okf: v4.0.0
|
|
64
64
|
acme.tools: git:github.com/acme/tools@v0.4.0 # outside the catalog → git:<repo>@<tag|OID>; still a package
|
|
65
65
|
|
|
@@ -399,7 +399,7 @@ keys, with `byTeam` stripped) ⊕ soul slot payload ⊕ `local.settings[cap]`
|
|
|
399
399
|
**No `byTeam[<label>]` is merged into it, the primary's included** (teams
|
|
400
400
|
amendment K): each label's `base ⊕ byTeam[label]` reaches the provider only as
|
|
401
401
|
that label's entry in `OATS_TEAMS` (the preview's `teams`). So `settings.team`
|
|
402
|
-
(and `OATS_TEAM_ID`) is the
|
|
402
|
+
(and `OATS_TEAM_ID`) is the workspace's default team if the host, the soul or the spawn
|
|
403
403
|
set one; empty means the provider's own default. The provider's own `binding` contract
|
|
404
404
|
(`normalize → bind → check`) runs over the merged payload exactly as before.
|
|
405
405
|
Two teams, two messaging identities, one workspace:
|
|
@@ -420,7 +420,7 @@ one. A label under `byTeam` that is not declared in `teams:` is
|
|
|
420
420
|
act.** `spawn --preview` shows the merged `settings.<cap>` and the `teams`, so
|
|
421
421
|
the delivery is verifiable, and `instance.json` records both. With oats.aweb
|
|
422
422
|
1.13.1 (which reads `team` from its settings and ignores `OATS_TEAMS`) the
|
|
423
|
-
primary identity therefore mints into the
|
|
423
|
+
primary identity therefore mints into the workspace's default team: the `.aw` root's
|
|
424
424
|
active team, or the one the host set. What the payload does not change is
|
|
425
425
|
**where the `.aw` root is found**: the hook still searches
|
|
426
426
|
bounded candidates, first hit wins — the instance home, the Git repository
|
package/lib/core.mjs
CHANGED
|
@@ -1485,17 +1485,17 @@ export function instanceSoulDir(home, meta = undefined) {
|
|
|
1485
1485
|
/** The team facts a lifecycle hook receives (workspace model only, lead decision
|
|
1486
1486
|
* c3-7): the team SCOPE is the deployment directory, the team ID is the messaging
|
|
1487
1487
|
* slot's merged payload `team` (workspace base ⊕ soul ⊕ host ⊕ spawn; no byTeam entry
|
|
1488
|
-
* is merged since teams amendment K): the
|
|
1488
|
+
* is merged since teams amendment K): the workspace's default team if one is set; empty = the
|
|
1489
1489
|
* provider's default (for oats.aweb, the root's active team). The provider also gets
|
|
1490
1490
|
* the soul's primary team LABEL and the workspace's name and canonical key, so it can
|
|
1491
|
-
* derive
|
|
1491
|
+
* derive the workspace's default team; each label's mapped payload is in
|
|
1492
1492
|
* OATS_TEAMS.
|
|
1493
1493
|
* OATS_TEAM_NAME (the 0.25 `team:` block's name) is always empty, so an ambient
|
|
1494
1494
|
* value never reaches a hook. Human decision 2026-09-24 (messaging default).
|
|
1495
1495
|
*
|
|
1496
1496
|
* Teams contract 2026-09-25 (decision 4): `resolved.teams` is the ELIGIBLE teams,
|
|
1497
1497
|
* `[{ label, team, mapped, payload }]` in soul order. OATS_TEAM_LABELS is their
|
|
1498
|
-
* labels comma-joined and OATS_TEAMS their JSON (`[]` = no label:
|
|
1498
|
+
* labels comma-joined and OATS_TEAMS their JSON (`[]` = no label: the workspace's default team only).
|
|
1499
1499
|
* Both are empty when the teams are not known (a home spawned before 0.26.0 whose
|
|
1500
1500
|
* workspace cannot be read now) — empty means "unknown", never "none".
|
|
1501
1501
|
* OATS_TEAMS_SOURCE says where the list came from: `live` (the workspace read now,
|
package/lib/resolve.mjs
CHANGED
|
@@ -346,7 +346,7 @@ export function teamLabelsOf(soulEntry) {
|
|
|
346
346
|
* `{ label, team, mapped, payload }`. `payload` is workspace.messaging's base ⊕ byTeam[label] when the
|
|
347
347
|
* workspace maps the label, else the base alone with `mapped: false`; `team` is the payload's team id
|
|
348
348
|
* when mapped (null otherwise). Kernel-owned and delivered BESIDE a provider's settings, never inside
|
|
349
|
-
* them; joining any of them is the messaging provider's explicit act. No label → [] (
|
|
349
|
+
* them; joining any of them is the messaging provider's explicit act. No label → [] (the workspace's default team only).
|
|
350
350
|
* Pure: resolveSoul validates every carried label's entry (reserved byTeam, hostOnly keys) first.
|
|
351
351
|
*/
|
|
352
352
|
export function teamsOf(workspace, labels) {
|
|
@@ -731,7 +731,7 @@ export async function resolveSoul(discovery, soulEntry, { local = null, lock = n
|
|
|
731
731
|
// Decision 23 as amended by K (teams contract, co-lead ruling): the provider's settings are
|
|
732
732
|
// base ⊕ soul ⊕ host ⊕ spawn. No byTeam[<label>] is merged, the primary's included: each
|
|
733
733
|
// label's base ⊕ byTeam[label] is delivered only in its `teams` entry (teamsOf → OATS_TEAMS),
|
|
734
|
-
// so settings.team is the
|
|
734
|
+
// so settings.team is the default team a host, soul or spawn set. `byTeam` never reaches the
|
|
735
735
|
// provider, and the primary team's own payload may still not nest one.
|
|
736
736
|
const { byTeam, ...base } = workspace.messaging;
|
|
737
737
|
committed(base, "/messaging", { kind: "workspace", at: "oats-workspace.yaml#/messaging" });
|
package/lib/workspace.mjs
CHANGED
|
@@ -753,8 +753,8 @@ export function workspaceWarnings(workspace, members, externalRows, packageSouls
|
|
|
753
753
|
|
|
754
754
|
/** Teams contract decision 5: a soul label the workspace declares in `teams:` but does not map in
|
|
755
755
|
* `messaging.byTeam` is a WARNING, not a problem — the label stays eligible-but-unmapped and the
|
|
756
|
-
* messaging provider falls back to the
|
|
757
|
-
* ONE warning per unmapped label, naming its souls (a
|
|
756
|
+
* messaging provider falls back to the workspace's default team for it. (An undeclared label is E_TEAM_UNKNOWN.)
|
|
757
|
+
* ONE warning per unmapped label, naming its souls (a workspace on its default team alone would otherwise print
|
|
758
758
|
* a line per soul): { code, label, souls, paths, message }, sorted by label. */
|
|
759
759
|
const byCodepointOrder = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
760
760
|
function unmappedLabelWarnings(workspace, members, externalRows, teams) {
|
|
@@ -774,7 +774,7 @@ function unmappedLabelWarnings(workspace, members, externalRows, teams) {
|
|
|
774
774
|
const order = names.map((n, i) => i).sort((x, y) => byCodepointOrder(names[x], names[y]) || byCodepointOrder(paths[x], paths[y]));
|
|
775
775
|
const sorted = order.map((i) => names[i]);
|
|
776
776
|
return { code: "unmapped-team-label", label, souls: sorted, paths: order.map((i) => paths[i]),
|
|
777
|
-
message: `team ${show(label)} has no messaging.byTeam entry; its souls (${sorted.join(", ")}) fall back to the
|
|
777
|
+
message: `team ${show(label)} has no messaging.byTeam entry; its souls (${sorted.join(", ")}) fall back to the workspace's default team for it` };
|
|
778
778
|
});
|
|
779
779
|
}
|
|
780
780
|
|
package/package-catalog.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"oats.aweb": {
|
|
10
10
|
"url": "https://github.com/awebai/oats-aweb.git",
|
|
11
|
-
"ref": "v1.
|
|
11
|
+
"ref": "v1.16.0",
|
|
12
12
|
"path": "oats-package"
|
|
13
13
|
},
|
|
14
14
|
"oats.jira": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"oats.framework": {
|
|
35
35
|
"url": "https://github.com/awebai/oats.git",
|
|
36
|
-
"ref": "oats-framework/v1.3.
|
|
36
|
+
"ref": "oats-framework/v1.3.1",
|
|
37
37
|
"path": "oats-package"
|
|
38
38
|
}
|
|
39
39
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awebai/oats",
|
|
3
|
-
"version": "0.29.
|
|
3
|
+
"version": "0.29.3",
|
|
4
4
|
"description": "OATS (Open Agent Team Specification) — durable souls, disposable instances, targetable capability packages, and the runtime-neutral oats CLI/kernel.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agents",
|