Skip to content

Commit 7621524

Browse files
committed
Merge origin/main into feat/conversation-outline-timeline
2 parents ddf38d3 + 0097afc commit 7621524

421 files changed

Lines changed: 4375 additions & 5017 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/agent-core-dev/orient.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ There is no domain-layer numbering — a domain may import any other domain, gui
6868

6969
## Comment convention
7070

71-
`packages/agent-core-v2/AGENTS.md` bans comments: no file headers, no section banners, no statement-level narration — the code is the source of truth. The only exception is JSDoc attached to exported symbols, which flows into the generated `.d.ts` and the consumers' IDE hover. Tooling directives (`eslint-disable`, `@ts-expect-error`, …) are banned too: fix the underlying lint/type problem instead, and put negative type-safety cases in compiler-asserted fixtures. DI scope is carried by registration: `LifecycleScope.App`, `LifecycleScope.Session`, or `LifecycleScope.Agent`. A `workspace*` filename marks workspace-domain ownership, not a DI scope (see service-authoring.md).
71+
`packages/agent-core-v2/AGENTS.md` bans comments entirely: no file headers, no section banners, no statement-level narration, no JSDoc (not even on exported symbols) — the code is the source of truth. The only exception is a load-bearing lint-suppression directive (`oxlint-disable` / `eslint-disable`) for a deliberate pattern; other tooling directives (`@ts-expect-error`, …) are banned: fix the underlying lint/type problem instead, and put negative type-safety cases in compiler-asserted fixtures. DI scope is carried by registration: `LifecycleScope.App`, `LifecycleScope.Session`, or `LifecycleScope.Agent`. A `workspace*` filename marks workspace-domain ownership, not a DI scope (see service-authoring.md).
7272

7373
## Red lines (this stage)
7474

7575
- Import via the `#/...` alias (mapped to `src/`); never reach into another domain's internals by relative path.
7676
- Short-lived may inject long-lived; never the reverse.
77-
- No comments — not file headers, not beside statements; exported-symbol JSDoc is the only exception.
77+
- No comments — not file headers, not beside statements, not JSDoc; a load-bearing lint-suppression directive is the only exception.

.agents/skills/agent-core-dev/service-authoring.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ What belongs here:
164164
- **Helper classes / functions** used only by this impl (e.g. a built-in writer, an `extractError` helper) — co-located in the same file.
165165
- **Top-level `registerScopedService(...)`** — one per Service the file owns; importing the impl file runs the registration.
166166

167-
Base class: extend `Service` (from `#/_base/di/service`) when the unit needs capability calls on `this``provide` / `effect` / `on` / `get` / `ref` (e.g. contributing a record to a `collection` token). `Service` extends `Disposable`, so `_register` keeps working; constructor-time `provide` / `on` / `effect` calls are buffered and flushed by the kernel after construction, while `get` / `ref` throw inside the constructor (dependencies stay constructor parameters). Otherwise extend `Disposable` — both are full DI units; a service whose own members collide with the `Service` vocabulary (`name` / `state` / `config` / `get`) must stay on `Disposable` (leave a NOTE comment saying so).
167+
Base class: extend `Service` (from `#/_base/di/service`) when the unit needs capability calls on `this``provide` / `effect` / `on` / `get` / `ref` (e.g. contributing a record to a `collection` token). `Service` extends `Disposable`, so `_register` keeps working; constructor-time `provide` / `on` / `effect` calls are buffered and flushed by the kernel after construction, while `get` / `ref` throw inside the constructor (dependencies stay constructor parameters). Otherwise extend `Disposable` — both are full DI units; a service whose own members collide with the `Service` vocabulary (`name` / `state` / `config` / `get`) must stay on `Disposable`.
168168

169169
## Constructor conventions
170170

@@ -296,9 +296,8 @@ Importing the package therefore fires every `register*` side effect, exactly as
296296

297297
## Comments
298298

299-
- **No comments** (orient.md): no file headers, no statement-level narration; the only exception is JSDoc attached to exported symbols.
299+
- **No comments** (orient.md): no file headers, no statement-level narration, no JSDoc; the only exception is a load-bearing lint-suppression directive.
300300
- **Methods and fields carry no comments by default.** Well-named identifiers and types say *what*; the code is the source of truth for *how*.
301-
- Write an inline comment only when the *why* is non-obvious (a hidden constraint, a subtle invariant, a workaround). One short line.
302301
- For unimplemented stubs, throw `NotImplementedError('feature')` rather than `throw new Error('TODO: …')` (errors.md).
303302

304303
## Complete minimal example

.agents/skills/agent-core-dev/test.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Resolving by interface is what makes `registerScopedService(ISut, Sut, …)` par
2121

2222
Pure functions, value objects, and services with **no** `@IService` dependencies may be constructed directly.
2323

24-
The only other exception is a test that genuinely needs **two independent instances** of the same service with different dependencies (e.g. constructing two `TurnService`s with different `ILoopRunner`s). A singleton-per-container resolution cannot produce both, so `ix.createInstance(Impl)` is acceptable there — annotate it with a comment explaining why.
24+
The only other exception is a test that genuinely needs **two independent instances** of the same service with different dependencies (e.g. constructing two `TurnService`s with different `ILoopRunner`s). A singleton-per-container resolution cannot produce both, so `ix.createInstance(Impl)` is acceptable there — state the reason in the test name and local identifiers.
2525

2626
## Two harnesses
2727

.agents/skills/agent-core-dev/verify.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Walk the stages you touched and confirm:
2121
- **Design** — scope follows state identity; no `Map<sessionId, …>` at `App`; dependency arrows do not make a foundational layer know an upstream one; no cycle was routed around.
2222
- **Implement** — no `new` on `@IService`-carrying classes; `@IX` on constructor params only (service params after static params); interface + impl carry `_serviceBrand`; decorator names unique; coded errors only; flags for unreleased behavior.
2323
- **Test** — SUT resolved by interface; stubs under `test/`; scope tests re-register after `_clearScopedRegistryForTests()`; teardown through one `DisposableStore`.
24-
- **Files** — no comments (exported-symbol JSDoc excepted); registration runs from the impl file's top level; the new domain is exported from `src/index.ts`.
24+
- **Files** — no comments (no JSDoc either); registration runs from the impl file's top level; the new domain is exported from `src/index.ts`.
2525

2626
Then re-read the [global red lines](SKILL.md#global-red-lines) once — they catch most cross-stage mistakes in a single scan.
2727

.agents/skills/release/SKILL.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ mechanics and failure modes.
1818
- **Private lanes use the push boundary.** `publishedPackages` only lists packages published to npm.
1919
Desktop and VS Code are private workspaces, so `detect-lane-bumps.mjs` compares their versions at
2020
`github.event.before` and `github.sha`.
21-
- **Desktop is tag-driven.** The required `cut-desktop-tag` job creates `desktop-v<version>`, which
22-
starts `desktop-release.yml`.
21+
- **Desktop Stable and Beta are tag-driven.** The required `cut-desktop-tag` job creates
22+
`desktop-v<version>`, which starts `desktop-release.yml`; prerelease versions publish to the
23+
explicit Beta feed.
24+
- **Desktop Nightly is default-branch driven.** `nightly.yml` calls `desktop-release.yml` after each
25+
scheduled main build and publishes a signed Nightly prerelease only when the main commit changed.
2326
- **VS Code is isolated.** `vscode-release.yml` supports `workflow_call` and version-checked manual
2427
dispatch. Existing registry versions are skipped by the publisher scripts, so recovery is safe.
2528

@@ -35,6 +38,7 @@ workspace, set its `private` and changesets policy explicitly and update `flake.
3538
|---|---|---|
3639
| `Release` | every main push after CI + Nix | Detect lane versions, build, run changesets |
3740
| `Cut desktop release tag` | desktop version changed | Required and idempotent; App token makes the tag trigger the desktop workflow |
41+
| `Desktop Nightly` | scheduled main build | Reusable workflow; signed assets and the explicit Nightly update feed |
3842
| `Publish VS Code extension` | extension version changed | Reusable workflow; six VSIX targets, both registries, provenance |
3943
| `Native release artifact` | CLI was published | Six signed/tested zips, checksums, provenance |
4044
| `Publish native release assets` | native builds passed | All-or-nothing immutable upload with `manifest.json` |
@@ -56,6 +60,8 @@ otherwise errors.
5660
genuinely half-published release — read the log; do not blind-rerun.
5761
- **Version PR looks wrong.** Never patch the `changeset-release/main` branch by hand. Fix or add
5862
changesets on `main`; the next workflow run regenerates the PR.
63+
- **Beta or Nightly checks Stable.** GitHub does not infer update channels. Confirm the release is a
64+
prerelease and contains `beta*.yml` or `nightly*.yml`; do not rename Stable manifests.
5965
- **Native builder fails after npm publish succeeded.** npm state is final. Re-run failed jobs from
6066
the same run before any assets upload. A complete asset set is an idempotent no-op. A partial set
6167
must not be filled from a rebuild; keep it or publish a new patch version.
@@ -83,6 +89,7 @@ otherwise errors.
8389

8490
```bash
8591
gh run list --workflow=release.yml --branch=main -L 3 # workflow health
92+
gh run list --workflow=nightly.yml --branch=main -L 3 # Nightly desktop health
8693
gh pr list --search 'ci: release packages in:title' --state open
8794
pnpm release:status # all live lanes
8895
npm view @pymodel/pythinker-code dist-tags --json
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@pymodel/pythinker-code": patch
3+
---
4+
5+
Silence the MaxListenersExceededWarning that could appear during long agent turns with many parallel tool calls.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@pymodel/pythinker-code": patch
3+
---
4+
5+
Fix messages sent from one web client not appearing on other clients connected to the same session.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@pymodel/pythinker-code": major
3+
---
4+
5+
Remove the `--allow-remote-terminals` flag from `pythinker web`; PTY terminal routes now stay available on loopback binds only.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@pymodel/pythinker-code": patch
3+
---
4+
5+
Persist a picked thinking effort as the default only up to the model's own default effort; a more expensive pick stays session-only.

.changeset/infinite-retry-mode.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@pymodel/pythinker-code": minor
3+
---
4+
5+
Add `PYTHINKER_CODE_INFINITE_RETRY=1` to retry every failed model request indefinitely with backoff instead of failing the turn, for long unattended runs.

0 commit comments

Comments
 (0)