Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,19 @@ new version heading in the same commit.

## [Unreleased]

## [0.445.0] - 2026-09-17
### Added
- **Edit an automation by talking it through with its agent.** Automations → ⋯ → **Edit with agent…** opens
an interactive session with the agent the automation runs, briefed with the automation's current
trigger, mode, run-as identity, full task prompt and its last five runs (plus an optional note on what
should change). The agent can't write the automation: `automation_propose` gained an `editOf` lane that
carries only the changed fields, validates them against the live automation when proposed, and lands as
an **edit card** in the Automations proposals panel (before → after per field, a side-by-side view for a
rewritten task prompt). Approving updates that automation under the same ownership rule as the Edit form,
and refuses if someone changed it after the proposal was made — so the agent's snapshot never silently
reverts a human's edit. Pinned by `scripts/automation-edit-proposal-test.cjs`.
**For admins:** On any automation, choose **Edit with agent…** to describe a change in plain words — the agent drafts it and you approve the edit before anything changes. [Open Automations](#/automations)

## [0.444.2] - 2026-09-16
### Fixed
- **A blocked task now carries the actual question, and you can answer it with a number.** v0.444.0 made
Expand Down
1 change: 1 addition & 0 deletions docs/agent-mcp-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ scope/parity properties, but not the cost.
| `policy_propose` | `POST /api/agent/policy/propose` | `TerminalManager.proposePolicy` → `applyProposal` + messages | W | proposes a **TIGHTEN-ONLY** change to the governance ruleset — `tighten` an existing rule to a stricter outcome, `reorder` a conditional rule above the unconditional allow rules (fixes a first-match hole), or `add` a new `ask`/`never` guardrail. `applyProposal` (`src/governance/policy.ts`) refuses anything that would LOOSEN a guardrail (checked by construction **and** an exhaustive monotonicity sweep over the ruleset's arg space), touch a hard-deny `never`, change the default, or add an `allow` — so an invalid proposal is rejected up front with a reason. A valid proposal posts a `policy.proposal` inbox card (owner-addressed) carrying the delta + a before→after `preview`; **applies nothing** until an **owner** approves via `POST /api/policy/proposals/:id/approve` (re-validated against the current doc; then `AgentOS.applyPolicyDocument` snapshots to `policy_revisions`, writes the override, hot-reloads) or rejects via `…/reject`. Deduped + capped (≤10 open/agent). Agents see the raw `rules` via `GET /api/agent/policy` (`list_capabilities`) to craft the delta. Audited `policy.proposed` / `policy.proposal.approved` / `policy.proposal.rejected`; every applied edit (console, always-approve, approved proposal) is revertable via `POST /api/policy/revisions/:rev/revert` (owner) |
| `goal_measure` | `POST /api/goals/measure` | `GoalStore.addReading` + `metricStatus` | W | records one measured READING of a goal's metric — the OUTCOME record, as against `goal_events` (activity). This is the one goal write agents get besides proposing: they may report the number, they may not move the goalposts (metric/target/status stay human-owned). Every reading stores WHO took it (`agent:<id>`), so a number reported by the same agent that did the work is visibly self-reported. Refuses a non-finite value and a goal with no metric set. The reading also lands on the goal timeline, so a diligently-measured goal is never reported "stuck" by the activity sweep. Returns the recomputed verdict (`measuring` / `flat` / `regressing` / `achieved` / `unmeasured` / `new`). Audited `goal.measured` |
| `workflow_propose` | `POST /api/agent/workflow/propose` | `TerminalManager.proposeWorkflow` + messages | W | proposes a **WORKFLOW** — 1–6 automations that make up one ongoing FUNCTION, carried on a SINGLE `automation.proposed` card (`args.specs` + a `workflow` name) and approved as a unit. `automation_propose` is the one-part sibling and shares the same validator, card type, queue cap (≤10 open/agent), dedupe and approve/reject routes. Approval is **all-or-nothing**: `POST /api/automations/proposals/:id/approve` creates every part, and a part `Automations.add` rejects (bad cron, an agent deleted since the proposal) rolls the earlier parts back — the error names the failing part and the proposal stays open. The approver's `runAs` override applies to every part. Proposes TRIGGERS only: the judgment inside a function belongs in each part's `task` prompt, decided at runtime, so a branch never becomes its own automation. Audited `automation.proposed` / `automation.proposal.approved` / `automation.proposal.rolled_back` / `automation.proposal.rejected` |
| `automation_propose({ editOf })` | `POST /api/agent/automation/propose` | `planAutomationEdit` (`src/edge/automation-edit.ts`) + `TerminalManager.postAutomationEditProposal` | W | the **EDIT** lane — the agent sends an existing automation's id and ONLY the fields that change (name / schedule / filter / mode / runAs / task; type + agent are fixed). Merged over the live automation and validated at propose time (bad cron, schedule-on-an-event-trigger, no-op edit → refused). Rides the same `automation.proposed` card (`args.edit` + `editOf` + `before`/`after`/`changes` + a `base` fingerprint), cap and approve route; approve calls `Automations.update` under the console edit's ownership rule and **409s if the automation changed since the proposal** (excluding `enabled`), so a human's interim edit is never silently reverted. Entry point: the console's **Edit with agent…** (`POST /api/automations/:id/edit-with-agent`) opens an interactive session with the automation's own agent, briefed with its config + last 5 runs. Audited `automation.edit.session` / `automation.edit.proposed` / `automation.edit.approved` |
| `skill_find` | `GET /api/skills/discover` | `TerminalManager.requestableSkills` (+ `searchSkillsh` when `q`) | R | the caller's installed library (each flagged `active` for this agent) + the bundled catalog — what's installable to ask for; with a `query` also returns matching **community** skills from the skills.sh directory, each with its `source` (`owner/repo`) |
| `skill_request` | `POST /api/skills/request` | `TerminalManager.requestSkill` + messages | W | **asks** an owner/admin to install a skill (never installs itself). `source` omitted ⇒ the bundled catalog (validated against it); `source: 'owner/repo'` ⇒ a **remote GitHub repo** (`browseRepo` resolves the skill + its path at request time so a typo fails fast). Dedupes an open request for the same skill+source, posts a `skill.request` card to owner/admins; audited `skill.requested`. Human installs via `POST /api/skills/requests/:id/approve` (owner/admin; catalog → `SkillsStore.install`, remote → `fetchSkill` + `installFiles`; optional `scope:'agent'`) or dismisses via `POST /api/skills/requests/:id/dismiss`. On approve, `TerminalManager.refreshAgentSkills` delivers same-session to the requester's LIVE interactive sessions (materialise into the watched `.claude/skills` + inject `/reload-skills`, claude ≥2.1.152); headless/next-launch otherwise |
| `library_list` | `GET /api/agent/artifacts` | `ArtifactStore.list` + `ArtifactStore.folders` | R | list scoped to the agent's own deliverables in the Library; also returns the tenant-wide Library folders so a `publish` files into the existing tree (discovery) |
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agent-os",
"version": "0.444.2",
"version": "0.445.0",
"description": "A generic, governed operating system for running autonomous agents safely across brands. Ships with a local web console.",
"license": "MIT",
"type": "commonjs",
Expand All @@ -27,7 +27,7 @@
"check-deps": "bash scripts/install-deps.sh --check",
"dev": "ts-node src/cli.ts serve",
"demo:dev": "ts-node src/demo.ts",
"test:governance": "node scripts/version-sync-test.cjs && node scripts/governance-conformance.cjs && node scripts/tier-a-policy-test.cjs && node scripts/policy-baseline-test.cjs && node scripts/heredoc-intent-test.cjs && node scripts/capability-registry-test.cjs && node scripts/composio-envelope-test.cjs && node scripts/composio-identity-test.cjs && node scripts/idle-reaper-test.cjs && node scripts/dm-continuity-test.cjs && node scripts/telegram-dm-lane-test.cjs && node scripts/cli-link-origin-test.cjs && node scripts/alert-staleness-test.cjs && node scripts/run-as-identity-test.cjs && node scripts/email-identity-guard-test.cjs && node scripts/deps-freshness-test.cjs && node scripts/runtime-account-test.cjs && node scripts/runtime-account-misattribution-test.cjs && node scripts/runtime-usage-refresh-test.cjs && node scripts/keychain-credential-test.cjs && node scripts/credential-preflight-test.cjs && node scripts/runtime-login-test.cjs && node scripts/rotate-on-reload-test.cjs && node scripts/headless-resumable-test.cjs && node scripts/session-revive-gates-test.cjs && node scripts/claude-config-seed-test.cjs && node scripts/claude-config-isolation-test.cjs && node scripts/output-style-test.cjs && node scripts/session-cost-test.cjs && node scripts/chain-model-test.cjs && node scripts/task-workers-test.cjs && node scripts/tuning-patch-test.cjs && node scripts/task-runs-test.cjs && node scripts/task-pr-links-test.cjs && node scripts/task-draft-delete-test.cjs && node scripts/task-discussion-delivery-test.cjs && node scripts/task-resume-test.cjs && node scripts/task-unblock-test.cjs && node scripts/audience-session-access-test.cjs && node scripts/warm-chat-test.cjs && node scripts/poke-warm-caller-test.cjs && node scripts/wakeup-queue-test.cjs && node scripts/stranded-human-stop-test.cjs && node scripts/inject-submit-test.cjs && node scripts/blocked-routing-test.cjs && node scripts/self-dispatch-guard-test.cjs && node scripts/task-proposals-test.cjs && node scripts/npm-boundary-test.cjs && node scripts/agent-edit-guard-test.cjs && node scripts/per-agent-context-test.cjs && node scripts/goal-update-guard-test.cjs && node scripts/insights-signal-test.cjs && node scripts/outcome-derivation-test.cjs && node scripts/episode-quality-test.cjs && node scripts/memory-upkeep-test.cjs && node scripts/automem-health-test.cjs && node scripts/memory-store-switch-test.cjs && node scripts/memory-preload-test.cjs && node scripts/turn-lifecycle-test.cjs && node scripts/resume-seed-test.cjs && node scripts/outcome-vocabulary-test.cjs && node scripts/skill-presets-test.cjs && node scripts/skill-edit-proposal-test.cjs && node scripts/notify-hook-route-test.cjs && node scripts/review-notify-test.cjs && node scripts/turn-idle-background-guard-test.cjs && node scripts/waiting-brief-test.cjs && node scripts/runtime-death-alert-test.cjs && node scripts/github-per-member-test.cjs && node scripts/github-multi-org-test.cjs && node scripts/card-measurement-test.cjs && node scripts/scheduler-admission-test.cjs && node scripts/tick-liveness-test.cjs && node scripts/audit-mirror-test.cjs && node scripts/request-metrics-test.cjs && node scripts/tool-usage-test.cjs && node scripts/sessions-list-perf-test.cjs && node scripts/summarizer-degradation-test.cjs && node scripts/agent-history-scope-test.cjs && node scripts/webhook-ingress-test.cjs && node scripts/slack-content-filter-test.cjs && node scripts/slack-ingress-test.cjs && node scripts/discord-ingress-test.cjs && node scripts/chat-attachments-test.cjs && node scripts/clickup-task-bridge-test.cjs && node scripts/agentric-commands-test.cjs && node scripts/whats-new-test.cjs && node scripts/opencode-gate-test.cjs && node scripts/protected-path-guard-test.cjs && node scripts/attach-grace-test.cjs && node scripts/attach-file-liveness-test.cjs && node scripts/feed-smoke.cjs && node scripts/activity-classify-test.cjs && node scripts/goal-room-test.cjs && node scripts/secret-rotation-test.cjs && node scripts/update-watch-test.cjs && node scripts/runtime-update-watch-test.cjs && node scripts/setup-wizard-test.cjs && node scripts/md-pdf-test.cjs && node scripts/proposal-surfacing-test.cjs && node scripts/process-janitor-test.cjs && node scripts/detached-work-steer-test.cjs && node scripts/statusline-install-test.cjs && node scripts/docs-create-agent-test.cjs && node scripts/agent-stats-rollup-test.cjs && node scripts/task-discussion-rollup-test.cjs && node scripts/session-insights-stamp-test.cjs && node scripts/loop-stall-attribution-test.cjs && node scripts/session-progress-test.cjs && node scripts/goal-metric-review-test.cjs && node scripts/capability-gap-test.cjs && node scripts/workflow-proposal-test.cjs",
"test:governance": "node scripts/version-sync-test.cjs && node scripts/governance-conformance.cjs && node scripts/tier-a-policy-test.cjs && node scripts/policy-baseline-test.cjs && node scripts/heredoc-intent-test.cjs && node scripts/capability-registry-test.cjs && node scripts/composio-envelope-test.cjs && node scripts/composio-identity-test.cjs && node scripts/idle-reaper-test.cjs && node scripts/dm-continuity-test.cjs && node scripts/telegram-dm-lane-test.cjs && node scripts/cli-link-origin-test.cjs && node scripts/alert-staleness-test.cjs && node scripts/run-as-identity-test.cjs && node scripts/email-identity-guard-test.cjs && node scripts/deps-freshness-test.cjs && node scripts/runtime-account-test.cjs && node scripts/runtime-account-misattribution-test.cjs && node scripts/runtime-usage-refresh-test.cjs && node scripts/keychain-credential-test.cjs && node scripts/credential-preflight-test.cjs && node scripts/runtime-login-test.cjs && node scripts/rotate-on-reload-test.cjs && node scripts/headless-resumable-test.cjs && node scripts/session-revive-gates-test.cjs && node scripts/claude-config-seed-test.cjs && node scripts/claude-config-isolation-test.cjs && node scripts/output-style-test.cjs && node scripts/session-cost-test.cjs && node scripts/chain-model-test.cjs && node scripts/task-workers-test.cjs && node scripts/tuning-patch-test.cjs && node scripts/task-runs-test.cjs && node scripts/task-pr-links-test.cjs && node scripts/task-draft-delete-test.cjs && node scripts/task-discussion-delivery-test.cjs && node scripts/task-resume-test.cjs && node scripts/task-unblock-test.cjs && node scripts/audience-session-access-test.cjs && node scripts/warm-chat-test.cjs && node scripts/poke-warm-caller-test.cjs && node scripts/wakeup-queue-test.cjs && node scripts/stranded-human-stop-test.cjs && node scripts/inject-submit-test.cjs && node scripts/blocked-routing-test.cjs && node scripts/self-dispatch-guard-test.cjs && node scripts/task-proposals-test.cjs && node scripts/npm-boundary-test.cjs && node scripts/agent-edit-guard-test.cjs && node scripts/per-agent-context-test.cjs && node scripts/goal-update-guard-test.cjs && node scripts/insights-signal-test.cjs && node scripts/outcome-derivation-test.cjs && node scripts/episode-quality-test.cjs && node scripts/memory-upkeep-test.cjs && node scripts/automem-health-test.cjs && node scripts/memory-store-switch-test.cjs && node scripts/memory-preload-test.cjs && node scripts/turn-lifecycle-test.cjs && node scripts/resume-seed-test.cjs && node scripts/outcome-vocabulary-test.cjs && node scripts/skill-presets-test.cjs && node scripts/skill-edit-proposal-test.cjs && node scripts/notify-hook-route-test.cjs && node scripts/review-notify-test.cjs && node scripts/turn-idle-background-guard-test.cjs && node scripts/waiting-brief-test.cjs && node scripts/runtime-death-alert-test.cjs && node scripts/github-per-member-test.cjs && node scripts/github-multi-org-test.cjs && node scripts/card-measurement-test.cjs && node scripts/scheduler-admission-test.cjs && node scripts/tick-liveness-test.cjs && node scripts/audit-mirror-test.cjs && node scripts/request-metrics-test.cjs && node scripts/tool-usage-test.cjs && node scripts/sessions-list-perf-test.cjs && node scripts/summarizer-degradation-test.cjs && node scripts/agent-history-scope-test.cjs && node scripts/webhook-ingress-test.cjs && node scripts/slack-content-filter-test.cjs && node scripts/slack-ingress-test.cjs && node scripts/discord-ingress-test.cjs && node scripts/chat-attachments-test.cjs && node scripts/clickup-task-bridge-test.cjs && node scripts/agentric-commands-test.cjs && node scripts/whats-new-test.cjs && node scripts/opencode-gate-test.cjs && node scripts/protected-path-guard-test.cjs && node scripts/attach-grace-test.cjs && node scripts/attach-file-liveness-test.cjs && node scripts/feed-smoke.cjs && node scripts/activity-classify-test.cjs && node scripts/goal-room-test.cjs && node scripts/secret-rotation-test.cjs && node scripts/update-watch-test.cjs && node scripts/runtime-update-watch-test.cjs && node scripts/setup-wizard-test.cjs && node scripts/md-pdf-test.cjs && node scripts/proposal-surfacing-test.cjs && node scripts/process-janitor-test.cjs && node scripts/detached-work-steer-test.cjs && node scripts/statusline-install-test.cjs && node scripts/docs-create-agent-test.cjs && node scripts/agent-stats-rollup-test.cjs && node scripts/task-discussion-rollup-test.cjs && node scripts/session-insights-stamp-test.cjs && node scripts/loop-stall-attribution-test.cjs && node scripts/session-progress-test.cjs && node scripts/goal-metric-review-test.cjs && node scripts/capability-gap-test.cjs && node scripts/workflow-proposal-test.cjs && node scripts/automation-edit-proposal-test.cjs",
"test:alert-staleness": "node scripts/alert-staleness-test.cjs",
"test:deps": "node scripts/deps-freshness-test.cjs && node scripts/runtime-account-test.cjs && node scripts/runtime-account-misattribution-test.cjs && node scripts/runtime-login-test.cjs && node scripts/claude-config-seed-test.cjs && node scripts/claude-config-isolation-test.cjs",
"test:dm-continuity": "node scripts/dm-continuity-test.cjs",
Expand Down
Loading
Loading