@jc_stack/ez-agents 0.1.0-beta.13 → 0.1.0-beta.19
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/.dockerignore +3 -0
- package/.env.example +20 -0
- package/AGENTS.md +12 -3
- package/CHANGELOG.md +63 -0
- package/CONTRIBUTING.md +62 -6
- package/Dockerfile +6 -0
- package/README.md +11 -2
- package/bin/ezenciel-agents-watch.mjs +8 -0
- package/compose.workforce-watch.yaml +33 -0
- package/compose.yaml +8 -1
- package/docker/run.ts +1 -1
- package/docs/architecture/ai-selection.md +15 -0
- package/docs/architecture/authority-boundaries.md +24 -1
- package/docs/architecture/telegram-intake.md +1 -1
- package/docs/docker-runtime.md +35 -0
- package/docs/host-service.md +19 -0
- package/docs/pagerduty.md +42 -0
- package/docs/plugin-catalog.md +28 -10
- package/docs/plugin-contributions.md +9 -0
- package/docs/plugins.md +46 -1
- package/docs/releasing.md +20 -9
- package/docs/repair.md +41 -0
- package/docs/responsive-channels.md +57 -0
- package/docs/scheduling.md +32 -4
- package/docs/selective-monitoring.md +12 -4
- package/docs/setup.md +43 -0
- package/docs/trusted-publishing.md +140 -0
- package/docs/upgrades.md +24 -4
- package/docs/workforce-watch.md +101 -0
- package/package.json +9 -4
- package/scripts/generate-publish-caller.mjs +60 -0
- package/scripts/smoke-busy-reply.ts +58 -0
- package/scripts/trusted-beta.mjs +289 -0
- package/src/agent-guidance.ts +9 -0
- package/src/ai-cli.ts +2 -1
- package/src/ai.ts +26 -8
- package/src/client-defaults.ts +29 -13
- package/src/codex-session.ts +4 -2
- package/src/config.ts +29 -1
- package/src/control-state.ts +26 -7
- package/src/desktop-bridge.ts +11 -2
- package/src/event-sources.ts +2 -1
- package/src/execution-authority.ts +2 -1
- package/src/executor.ts +34 -7
- package/src/failure.ts +32 -0
- package/src/host-executor-client.ts +7 -1
- package/src/host-executor.ts +22 -13
- package/src/identity.ts +8 -3
- package/src/inbox.ts +7 -3
- package/src/index.ts +260 -92
- package/src/install-tools.mjs +2 -2
- package/src/menu.ts +8 -6
- package/src/model-policy.ts +18 -0
- package/src/owner.ts +3 -3
- package/src/pagerduty.ts +109 -0
- package/src/plugins/manager.mjs +115 -8
- package/src/plugins/shared.mjs +76 -0
- package/src/repair-policy.ts +13 -0
- package/src/reply-context.ts +71 -0
- package/src/reply-executor.ts +55 -0
- package/src/reply-mcp.ts +23 -0
- package/src/runs.ts +14 -16
- package/src/schedule-cli.ts +36 -7
- package/src/scheduled-tasks.ts +33 -0
- package/src/scheduler.ts +22 -4
- package/src/setup.ts +3 -2
- package/src/software-status.ts +5 -5
- package/src/task-cli.ts +3 -3
- package/src/task-executor.ts +9 -6
- package/src/tasks.ts +35 -17
- package/src/telegram-source.ts +94 -0
- package/src/updates/artifact.mjs +16 -0
- package/src/updates/binding.mjs +3 -1
- package/src/updates/control.mjs +4 -4
- package/src/updates/runtime.mjs +5 -2
- package/src/workforce-watch-cli.ts +14 -0
- package/src/workforce-watch.ts +155 -0
- package/templates/agent/AGENTS.md +10 -2
- package/templates/agent/TOOLS.md +6 -0
- package/templates/agent-guidance.md +24 -0
- package/templates/chat-guidance.md +23 -0
- package/templates/failure-review.md +9 -0
- package/templates/maintainer-purpose.md +15 -0
- package/templates/updates.md +2 -2
- package/test/agent-guidance.test.ts +125 -0
- package/test/ai-cli.test.ts +7 -6
- package/test/ai.test.ts +81 -1
- package/test/busy-reply-relay.test.ts +41 -0
- package/test/client-defaults.test.ts +37 -5
- package/test/codex-context.test.ts +5 -2
- package/test/codex-session.test.ts +4 -2
- package/test/config.test.ts +29 -0
- package/test/event-sources.test.ts +4 -0
- package/test/executor.test.ts +11 -1
- package/test/failure.test.ts +256 -0
- package/test/group-owner.test.ts +36 -0
- package/test/host-executor.test.ts +54 -7
- package/test/intake-relay.test.ts +145 -4
- package/test/model-policy.test.ts +69 -0
- package/test/pagerduty.test.ts +104 -0
- package/test/plugin-manager.test.mjs +52 -2
- package/test/relay.test.ts +2 -2
- package/test/repair-policy.test.ts +23 -0
- package/test/reply.test.ts +153 -0
- package/test/runs.test.ts +7 -0
- package/test/schedule-cli.test.ts +10 -2
- package/test/scheduled-tasks.test.ts +43 -0
- package/test/shared-services.test.mjs +98 -0
- package/test/software-status.test.ts +5 -5
- package/test/task-native.test.ts +2 -2
- package/test/tasks.test.ts +14 -6
- package/test/telegram-source.test.ts +75 -0
- package/test/trusted-beta.test.mjs +224 -0
- package/test/updates.test.mjs +35 -3
- package/test/workforce-watch.test.ts +180 -0
package/.dockerignore
CHANGED
package/.env.example
CHANGED
|
@@ -24,3 +24,23 @@ EZ_EXECUTOR_CLI=agy
|
|
|
24
24
|
# Optional: OpenRouter API key for OpenCode CLI (Nemotron 3.5 Lightning)
|
|
25
25
|
# OPENROUTER_API_KEY=
|
|
26
26
|
# OPENCODE_MODEL=openrouter/nvidia/nemotron-3.5-lightning
|
|
27
|
+
|
|
28
|
+
# Interactive Codex CLI context limit; native compaction preserves the session.
|
|
29
|
+
EZ_CODEX_AUTO_COMPACT_TOKENS=64000
|
|
30
|
+
|
|
31
|
+
# Automatic core/plugin repair mandate. Set in deployment docker.env for Compose.
|
|
32
|
+
# Does not grant GitHub access, merge or publication permissions.
|
|
33
|
+
EZ_REPAIR_ENABLED=true
|
|
34
|
+
|
|
35
|
+
# Optional PagerDuty incident paging for critical Stocks outages. Put the routing
|
|
36
|
+
# key only in the private relay.env file when running Docker; place the other
|
|
37
|
+
# settings in docker.env so Compose passes them to the relay.
|
|
38
|
+
# PAGERDUTY_ROUTING_KEY=
|
|
39
|
+
# EZ_PAGERDUTY_STOCKS_HEALTH_URL=http://10.97.0.1:3006/health/critical
|
|
40
|
+
# EZ_PAGERDUTY_POLL_SECONDS=30
|
|
41
|
+
# EZ_PAGERDUTY_FAILURE_THRESHOLD=3
|
|
42
|
+
|
|
43
|
+
# Workforce Watch runs separately. Its enrollment secret and Telegram token are
|
|
44
|
+
# monitor-only credentials; do not put them in an agent workspace.
|
|
45
|
+
# EZ_WATCH_ENROLL_TOKEN=
|
|
46
|
+
# EZ_WATCH_TELEGRAM_CHAT_ID=
|
package/AGENTS.md
CHANGED
|
@@ -66,14 +66,14 @@ This package will be published as an open-source, lightweight Telegram-to-CLI re
|
|
|
66
66
|
- Main-conversation jobs queue sequentially in `RunStore`. Scheduled/background work uses separate task directories and native CLI sessions (up to four alongside chat). Never share a mutable task directory. Delegation decisions and goal persistence belong to the agent/executor; there is no automatic planner or canned chat ACK. Production executor runs have no wall-clock timeout; cancellation is explicit.
|
|
67
67
|
|
|
68
68
|
## 7. Fail-Closed Authority (Channel Access ≠ Execution)
|
|
69
|
-
- Incoming messages
|
|
70
|
-
-
|
|
69
|
+
- Incoming messages outside the approved owner binding must **never** spawn the executor. A first DM or group message records a pending request only. Explicitly approved owner groups grant owner access to all human members in that exact chat; bots and anonymous posts are ignored.
|
|
70
|
+
- Unapproved group messages from other senders and unknown DMs fail silently. Approved group text uses the existing conversation grant and restricted task runner. Paired-owner group text is discovery routed to the owner's private chat; it grants no group reply authority.
|
|
71
71
|
- Stopping work (`/stop`) must terminate the active worker PID immediately (`SIGTERM`, escalating to `SIGKILL` if unclosed after 3s).
|
|
72
72
|
|
|
73
73
|
## 8. Mandatory Adversarial & Negative Tests
|
|
74
74
|
Every pull request modifying authority, execution, or routing must include negative tests:
|
|
75
75
|
1. Unapproved Telegram ID $\rightarrow$ no process spawned.
|
|
76
|
-
2.
|
|
76
|
+
2. Non-owner group message $\rightarrow$ silent ignore; owner group discovery $\rightarrow$ private destination only.
|
|
77
77
|
3. Executor environment check $\rightarrow$ asserts `TELEGRAM_BOT_TOKEN` is `undefined`.
|
|
78
78
|
4. Corrupt JSON in store $\rightarrow$ handled gracefully without process crash.
|
|
79
79
|
5. Injected path traversal in IDs $\rightarrow$ rejected.
|
|
@@ -89,5 +89,14 @@ worktree/branch/PR, starting from fetched origin/main. Do not switch or mix work
|
|
|
89
89
|
another task's checkout. Stage only this task's changes. Keep its worktree through
|
|
90
90
|
review and QA; independent review and green CI precede an authorized merge.
|
|
91
91
|
Never treat task completion as permission to merge or publish.
|
|
92
|
+
Own the complete engineering/release handoff in CONTRIBUTING.md. Once ready,
|
|
93
|
+
proactively request only missing merge/release authority, then ship and verify;
|
|
94
|
+
do not leave the maintainer to discover ready drafts or operate the release.
|
|
92
95
|
|
|
93
96
|
- In channel-backend mode, the application owns native sessions and actions. Forward normalized inputs with stable run IDs, recover only by idempotent backend submission, and deliver replies through the existing outbox. Never launch a fallback CLI or pass relay credentials into an executor.
|
|
97
|
+
|
|
98
|
+
A coding-task handoff must include the pushed commit and draft PR URL, checks,
|
|
99
|
+
independent-review status and remaining QA. If PR creation is blocked, state the
|
|
100
|
+
blocker and preserved commit. The merging agent owns the post-merge worktree
|
|
101
|
+
cleanup check and reports removal or the specific reason to retain it. Follow
|
|
102
|
+
CONTRIBUTING.md for squash-merge evidence, ignored files and active-use checks.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.0-beta.19
|
|
4
|
+
|
|
5
|
+
- Preserve host-backed run completion and delivery evidence while the relay
|
|
6
|
+
finalizes state, rather than treating the host PID as a relay-local worker
|
|
7
|
+
process. Interrupted host transport and deliberate schedule cancellation retain
|
|
8
|
+
their distinct terminal states.
|
|
9
|
+
- Include the reviewed scheduled-task status, Workforce Watch, plugin-folder,
|
|
10
|
+
scheduler-model, incident-reopening, and catalog updates merged after beta.18.
|
|
11
|
+
|
|
12
|
+
## 0.1.0-beta.18.1
|
|
13
|
+
|
|
14
|
+
- Add explicit read-only existing-folder bindings for plugin services, preserving bindings across compatible updates without copying source files.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## 0.1.0-beta.18
|
|
18
|
+
|
|
19
|
+
- Await complete relay cleanup after fatal Telegram polling errors and preserve the primary failure.
|
|
20
|
+
- Refresh package-owned shared guidance in owner worker prompts, including resumed and scheduled work, while preserving personal workspace instructions and restricted worker boundaries.
|
|
21
|
+
- Include the reviewed beta.17 fixes. Earlier immutable unpublished candidates and existing beta acceptance limits remain.
|
|
22
|
+
|
|
23
|
+
## 0.1.0-beta.17
|
|
24
|
+
|
|
25
|
+
- Capture executor stderr before asynchronous PID persistence so fast failures retain actionable, redacted diagnostic evidence for agent-owned recovery.
|
|
26
|
+
- Wait for executor cleanup and final run-state writes when stopping the relay, so shutdown does not return while its state is still being written.
|
|
27
|
+
- Include the reviewed beta.16 runtime and catalog corrections. Earlier unpublished candidates remain preserved; existing beta acceptance limits remain.
|
|
28
|
+
|
|
29
|
+
## 0.1.0-beta.16
|
|
30
|
+
|
|
31
|
+
- Correct stale plugin-publication claims and link the catalog to live npm/GitHub release records. Agents must verify available versions instead of treating a dated catalog snapshot as a blocker.
|
|
32
|
+
- Include the reviewed beta.15 runtime unchanged. Preserve earlier unpublished candidates and existing beta acceptance limits.
|
|
33
|
+
|
|
34
|
+
## 0.1.0-beta.15
|
|
35
|
+
|
|
36
|
+
- Include current reviewed model defaults, reply/status fixes, shared Library services and CPU limits, and the corrected main-CI publisher validation.
|
|
37
|
+
- Testing beta; previously documented live-provider and fresh-host acceptance limits remain.
|
|
38
|
+
|
|
39
|
+
## 0.1.0-beta.14
|
|
40
|
+
|
|
41
|
+
- Preserve agent-specific scheduled authentication and model catalogs; show native
|
|
42
|
+
Codex defaults in status, and support explicitly approved group ownership.
|
|
43
|
+
- Keep owner chat responsive during shared work with restricted reply sessions.
|
|
44
|
+
Capture redacted failure evidence and support quiet, owner-scoped reviews.
|
|
45
|
+
- Add opt-in shared Docker plugin workers and agent-owned repair instructions.
|
|
46
|
+
- Add optional PagerDuty Stocks monitoring with restart-safe recovery. Activation
|
|
47
|
+
requires the companion Stocks critical-health endpoint and private routing-key
|
|
48
|
+
configuration; real trigger/resolve delivery is not yet verified.
|
|
49
|
+
- Publish verified beta artifacts through the shared trusted-publisher workflow.
|
|
50
|
+
|
|
51
|
+
- Add explicit host-owned shared-workspace access and serialize bindings to the
|
|
52
|
+
same resolved repository path while retaining isolated task transcripts.
|
|
53
|
+
- Bound interactive Codex context through native compaction and expose
|
|
54
|
+
content-free launch, execution and delivery timings.
|
|
55
|
+
- Support owner-approved Telegram text groups and ongoing incoming-only grants
|
|
56
|
+
through restricted task execution; retain exact conversation/account authority.
|
|
57
|
+
- Preserve revocation recovery and uncertain-send receipts. Ongoing WhatsApp
|
|
58
|
+
grants require the companion WhatsApp beta.13 provider.
|
|
59
|
+
- Fix graceful container shutdown, isolate CI package sources and await RPC
|
|
60
|
+
fixture cleanup. Make verified release handoff proactive and agent-owned.
|
|
61
|
+
- Beta limits: no group media; live group-recipient and final fresh-host/reboot
|
|
62
|
+
acceptance remain pending. No new live-delivery or latency claims.
|
|
63
|
+
- Default core and plugin automatic updates to the beta channel; preserve saved
|
|
64
|
+
stable-only and manual policies.
|
|
65
|
+
|
|
3
66
|
## 0.1.0-beta.13
|
|
4
67
|
|
|
5
68
|
- Escalate cancelled plugin clients and report container cleanup failures.
|
package/CONTRIBUTING.md
CHANGED
|
@@ -5,7 +5,8 @@ and the relevant CLI help first. Open an issue for substantial scope changes;
|
|
|
5
5
|
small fixes need no proposal. Internal plans and private QA belong outside this
|
|
6
6
|
repository. Public docs describe shipped behavior and explicit limitations.
|
|
7
7
|
|
|
8
|
-
1.
|
|
8
|
+
1. Start one coherent change in a dedicated worktree from fetched origin/main,
|
|
9
|
+
following the isolated-work rules below. Preserve unrelated work.
|
|
9
10
|
2. Install Node 22+ and pnpm 10.30.3. Run `pnpm install --frozen-lockfile`.
|
|
10
11
|
3. Change the code, user instructions and focused tests together. Authority,
|
|
11
12
|
paths, credentials, cancellation and uncertain writes need negative tests.
|
|
@@ -13,8 +14,9 @@ repository. Public docs describe shipped behavior and explicit limitations.
|
|
|
13
14
|
Packaging/runtime changes also need the Docker checks in docs/releasing.md.
|
|
14
15
|
5. Open a PR explaining the problem, resulting behavior, verification and limits.
|
|
15
16
|
Include a short sanitized reproduction. State which tests were not run.
|
|
16
|
-
6.
|
|
17
|
-
|
|
17
|
+
6. Obtain independent review and required CI, then complete the
|
|
18
|
+
maintainer-authorized merge. Maintainers use PRs too. No CLA, ticket
|
|
19
|
+
requirement, custom commit format or additional approval committee.
|
|
18
20
|
|
|
19
21
|
You are responsible for understanding submitted code, including AI-generated
|
|
20
22
|
code, and having the right to contribute it under this repository's license.
|
|
@@ -47,9 +49,17 @@ docs/plugin-contributions.md.
|
|
|
47
49
|
create one worktree/PR per repository and link dependencies and merge order.
|
|
48
50
|
Branch from an unmerged feature only when the dependency is intentional and
|
|
49
51
|
documented; do not quietly include it in an unrelated PR.
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
- Push the task branch and open a draft PR as soon as the first coherent change
|
|
53
|
+
is reviewable, before reporting implementation complete. Do not leave completed
|
|
54
|
+
work only in a local branch. Continue through the release handoff below;
|
|
55
|
+
implementation completion alone does not authorize publication.
|
|
56
|
+
- Every handoff names the repository, worktree, branch, exact commit, PR URL,
|
|
57
|
+
checks, independent-review status and remaining QA with its next action. If
|
|
58
|
+
pushing or PR creation is blocked, report the blocker and preserved local
|
|
59
|
+
commit; do not call the PR workflow complete. Resume the same task branch.
|
|
60
|
+
- Integration/release worktrees are task worktrees too. Give any unique fix its
|
|
61
|
+
own PR or include it in the explicitly scoped integration PR; never leave a
|
|
62
|
+
successful local integration as the only copy of a fix.
|
|
53
63
|
- Before merge, obtain an independent human or agent review of the final diff.
|
|
54
64
|
The implementer's self-check and passing CI are not independent review.
|
|
55
65
|
Reviewers inspect correctness, architecture, state/permissions and negative
|
|
@@ -65,6 +75,41 @@ docs/plugin-contributions.md.
|
|
|
65
75
|
inspect it for uncommitted/untracked files and local-only commits. Remove only
|
|
66
76
|
the clean task worktree after valuable work is preserved; never force cleanup.
|
|
67
77
|
Delete its branch only after confirming merge or authorized abandonment.
|
|
78
|
+
- The agent completing an authorized merge owns the cleanup check in that same
|
|
79
|
+
task. Fetch current main and read back the PR state and merged head; a clean
|
|
80
|
+
status or an ahead/behind count alone is not merge evidence. Squash/rebase
|
|
81
|
+
merges may require PR-head ancestry or patch-equivalence checks. Any commits
|
|
82
|
+
added after the reviewed PR head must be accounted for separately.
|
|
83
|
+
- Before removal, check ignored files as well as tracked/untracked files, and
|
|
84
|
+
confirm the path is not used by an active task, runtime or pending QA. Preserve
|
|
85
|
+
local state and evidence; do not use force removal or blanket pruning. Report
|
|
86
|
+
either the removed worktree or a concrete retention reason and next action.
|
|
87
|
+
Keep upgrade QA worktrees until their explicit acceptance or abandonment.
|
|
88
|
+
|
|
89
|
+
## Agent-owned release handoff
|
|
90
|
+
|
|
91
|
+
The agent owns the engineering work through shipping: implement, run proportional
|
|
92
|
+
checks, obtain independent review, repair findings, verify the packed artifact,
|
|
93
|
+
and prepare the release. Reuse valid final-commit evidence; repeat checks when
|
|
94
|
+
changes or failures invalidate it. Do not leave a ready feature silently in draft
|
|
95
|
+
or ask the maintainer to run commands, coordinate reviewers, or operate CI.
|
|
96
|
+
|
|
97
|
+
The maintainer's request is authorization for the requested work and its normal
|
|
98
|
+
implementation steps. Do not ask them to approve the same work again. Once the
|
|
99
|
+
applicable gates pass, execute the requested merge/release and report the packages,
|
|
100
|
+
versions, channel, verification and material limits. Batch related packages in
|
|
101
|
+
dependency order. Prepare the reviewed commits, artifacts and checksums before
|
|
102
|
+
shipping. A request to merge does not silently expand to publication or changing
|
|
103
|
+
a private package's visibility; a request to release already authorizes release.
|
|
104
|
+
If shipping was not requested, report readiness and the next step without treating
|
|
105
|
+
every completed feature as permission to publish.
|
|
106
|
+
|
|
107
|
+
Complete the authorized merge, publication and rollout using
|
|
108
|
+
docs/releasing.md, then verify registry metadata, downloaded artifact and the
|
|
109
|
+
installed runtime. Report the outcome. Escalate only a product decision, missing
|
|
110
|
+
credential/2FA, failed gate that cannot be repaired in scope, or material scope
|
|
111
|
+
change. Human attention belongs on product intent;
|
|
112
|
+
the agent operates the technical workflow.
|
|
68
113
|
|
|
69
114
|
Example, substituting a unique task name and an absolute external directory:
|
|
70
115
|
|
|
@@ -74,3 +119,14 @@ git worktree list
|
|
|
74
119
|
git fetch origin
|
|
75
120
|
git worktree add -b feat/task-name /absolute/worktrees/task-name origin/main
|
|
76
121
|
```
|
|
122
|
+
|
|
123
|
+
Beta publishing workflow changes follow [trusted publishing](docs/trusted-publishing.md).
|
|
124
|
+
Validate wrong source, repository, package, version and artifact inputs with
|
|
125
|
+
negative tests. Never dispatch publication to test authentication.
|
|
126
|
+
|
|
127
|
+
Finished work leaves zero task worktrees. Worktrees are temporary for active
|
|
128
|
+
implementation, PR review and specific unfinished acceptance steps. A merged
|
|
129
|
+
change, a completed release or a possible future follow-up is not a reason to
|
|
130
|
+
retain its checkout. Record deferred work in the PR/issue with its next action;
|
|
131
|
+
recreate a worktree from the preserved commit when that work actually resumes.
|
|
132
|
+
Every retained worktree must name an active task or a concrete unfinished gate.
|
package/Dockerfile
CHANGED
|
@@ -14,3 +14,9 @@ ENV HOME=/state/home EZ_AGENT_WORKSPACE=/workspace EZ_CONTROL_DIR=/state/control
|
|
|
14
14
|
WORKDIR /workspace
|
|
15
15
|
ENTRYPOINT ["/app/docker/entrypoint.sh"]
|
|
16
16
|
CMD ["start"]
|
|
17
|
+
|
|
18
|
+
FROM dependencies AS workforce-watch
|
|
19
|
+
RUN chmod +x bin/ezenciel-agents-watch.mjs && mkdir /state
|
|
20
|
+
ENV EZ_WATCH_STATE_DIR=/state
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
CMD ["node", "--import", "tsx", "src/workforce-watch-cli.ts"]
|
package/README.md
CHANGED
|
@@ -111,9 +111,18 @@ services; the existing host CLI and login are shared through one generic
|
|
|
111
111
|
transport, with separate agent workspaces and sessions. See
|
|
112
112
|
[Docker setup, state and QA](docs/docker-runtime.md).
|
|
113
113
|
|
|
114
|
+
For optional PagerDuty paging of a critical Stocks outage, see
|
|
115
|
+
[PagerDuty critical-outage paging](docs/pagerduty.md).
|
|
116
|
+
|
|
117
|
+
For independent agent check-ins and concise incident context, see
|
|
118
|
+
[Workforce Watch](docs/workforce-watch.md). It runs separately from relays and
|
|
119
|
+
does not receive their executor or provider credentials.
|
|
120
|
+
|
|
114
121
|
Telegram `/status` shows the running relay and host versions plus installed
|
|
115
|
-
plugin versions.
|
|
116
|
-
|
|
122
|
+
plugin versions. Its read-only **Scheduled tasks** control lists the paired
|
|
123
|
+
owner's saved task titles, instructions, timing, state and next run; it never
|
|
124
|
+
creates, changes or runs a task. The agent's `ez status` adds verified plugin
|
|
125
|
+
runtime states and upgrade job receipts. See [status and upgrades](docs/upgrades.md).
|
|
117
126
|
|
|
118
127
|
## You are the installing agent
|
|
119
128
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from 'node:child_process'
|
|
3
|
+
import { createRequire } from 'node:module'
|
|
4
|
+
import { dirname, join } from 'node:path'
|
|
5
|
+
import { fileURLToPath } from 'node:url'
|
|
6
|
+
const here=dirname(fileURLToPath(import.meta.url)),require=createRequire(import.meta.url),tsx=require.resolve('tsx'),entry=join(here,'..','src','workforce-watch-cli.ts')
|
|
7
|
+
const child=spawn(process.execPath,['--import',tsx,entry],{stdio:'inherit'})
|
|
8
|
+
child.on('exit',(code,signal)=>{if(signal)process.kill(process.pid,signal);process.exit(code??1)})
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
services:
|
|
2
|
+
workforce-watch:
|
|
3
|
+
image: ${EZ_WORKFORCE_WATCH_IMAGE:-ezenciel-agents:local}
|
|
4
|
+
build:
|
|
5
|
+
context: .
|
|
6
|
+
target: workforce-watch
|
|
7
|
+
init: true
|
|
8
|
+
restart: unless-stopped
|
|
9
|
+
read_only: true
|
|
10
|
+
cap_drop: [ALL]
|
|
11
|
+
security_opt: [no-new-privileges:true]
|
|
12
|
+
environment:
|
|
13
|
+
EZ_WATCH_PORT: 8080
|
|
14
|
+
EZ_WATCH_ENROLL_TOKEN: ${EZ_WATCH_ENROLL_TOKEN:?Set a private enrollment token}
|
|
15
|
+
EZ_WATCH_TELEGRAM_CHAT_ID: ${EZ_WATCH_TELEGRAM_CHAT_ID:-}
|
|
16
|
+
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-}
|
|
17
|
+
secrets: [workforce_watch_pagerduty]
|
|
18
|
+
volumes:
|
|
19
|
+
- workforce-watch-state:/state
|
|
20
|
+
tmpfs: [/tmp]
|
|
21
|
+
ports:
|
|
22
|
+
- ${EZ_WATCH_BIND_ADDRESS:-127.0.0.1}:${EZ_WATCH_PORT:-9919}:8080
|
|
23
|
+
healthcheck:
|
|
24
|
+
test: [CMD, node, -e, "fetch('http://127.0.0.1:8080/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
|
|
25
|
+
interval: 30s
|
|
26
|
+
timeout: 5s
|
|
27
|
+
retries: 3
|
|
28
|
+
start_period: 10s
|
|
29
|
+
volumes:
|
|
30
|
+
workforce-watch-state:
|
|
31
|
+
secrets:
|
|
32
|
+
workforce_watch_pagerduty:
|
|
33
|
+
file: ${EZ_WATCH_PAGERDUTY_SECRET_FILE:?Set EZ_WATCH_PAGERDUTY_SECRET_FILE to the protected workforce PagerDuty routing-key file}
|
package/compose.yaml
CHANGED
|
@@ -8,15 +8,22 @@ services:
|
|
|
8
8
|
restart: unless-stopped
|
|
9
9
|
stop_grace_period: 30s
|
|
10
10
|
cap_drop: [ALL]
|
|
11
|
-
|
|
11
|
+
# Init must forward shutdown to the privilege-dropped relay. The entrypoint
|
|
12
|
+
# still removes every capability from the relay and its executor children.
|
|
13
|
+
cap_add: [CHOWN, DAC_OVERRIDE, FOWNER, SETUID, SETGID, SETPCAP, KILL]
|
|
12
14
|
environment:
|
|
15
|
+
EZ_REPAIR_ENABLED: ${EZ_REPAIR_ENABLED:-true}
|
|
13
16
|
EZ_AGENT_PURPOSE_FILE: /run/agent-purpose.md
|
|
14
17
|
EZ_EXECUTOR_TRANSPORT: ${EZ_EXECUTOR_TRANSPORT:-host}
|
|
15
18
|
EZ_CHANNEL_BACKEND_URL: ${EZ_CHANNEL_BACKEND_URL:-}
|
|
16
19
|
EZ_AGENT_WORKSPACE: ${EZ_AGENT_WORKSPACE:?Set this agent workspace}
|
|
17
20
|
EZ_CONTROL_DIR: ${EZ_CONTROL_DIR:?Set this agent control directory}
|
|
18
21
|
EZ_EXECUTOR_CLI: ${EZ_EXECUTOR_CLI:?Set the host installation CLI}
|
|
22
|
+
EZ_CODEX_AUTO_COMPACT_TOKENS: ${EZ_CODEX_AUTO_COMPACT_TOKENS:-64000}
|
|
19
23
|
EZ_EXECUTOR_TIMEOUT_SECONDS: ${EZ_EXECUTOR_TIMEOUT_SECONDS:-300}
|
|
24
|
+
EZ_PAGERDUTY_STOCKS_HEALTH_URL: ${EZ_PAGERDUTY_STOCKS_HEALTH_URL:-}
|
|
25
|
+
EZ_PAGERDUTY_POLL_SECONDS: ${EZ_PAGERDUTY_POLL_SECONDS:-30}
|
|
26
|
+
EZ_PAGERDUTY_FAILURE_THRESHOLD: ${EZ_PAGERDUTY_FAILURE_THRESHOLD:-3}
|
|
20
27
|
secrets: [relay_env]
|
|
21
28
|
configs:
|
|
22
29
|
- source: agent_purpose
|
package/docker/run.ts
CHANGED
|
@@ -21,7 +21,7 @@ try { privateEnv = parseEnv(readFileSync(3, 'utf8')) } catch (error) {
|
|
|
21
21
|
if ((error as NodeJS.ErrnoException).code !== 'EINVAL' && (error as NodeJS.ErrnoException).code !== 'EBADF') throw error
|
|
22
22
|
} finally { try { closeSync(3) } catch {} }
|
|
23
23
|
for (const [key, value] of Object.entries(privateEnv)) {
|
|
24
|
-
if (value !== undefined && ['TELEGRAM_BOT_TOKEN', 'GEMINI_API_KEY', 'OPENAI_API_KEY', 'EZ_CHANNEL_BACKEND_TOKEN'].includes(key)) process.env[key] = value
|
|
24
|
+
if (value !== undefined && ['TELEGRAM_BOT_TOKEN', 'GEMINI_API_KEY', 'OPENAI_API_KEY', 'EZ_CHANNEL_BACKEND_TOKEN', 'PAGERDUTY_ROUTING_KEY'].includes(key)) process.env[key] = value
|
|
25
25
|
}
|
|
26
26
|
privateEnv = {}
|
|
27
27
|
const [command = 'start', ...args] = process.argv.slice(2)
|
|
@@ -35,3 +35,18 @@ model/effort settings (or `models` for the default model). Claude reads user and
|
|
|
35
35
|
workspace JSON settings; OpenCode reports resolved config. Unknown defaults and
|
|
36
36
|
opaque wrappers remain explicitly “client default”. No credentials are stored,
|
|
37
37
|
no inference runs, no new dependency, and no cross-CLI session transfer.
|
|
38
|
+
|
|
39
|
+
New Codex CLI and desktop agents seed **Responsive chat** (`gpt-5.6-sol`,
|
|
40
|
+
`medium`). Durable work keeps its independent `gpt-5.6-terra` / `high` default;
|
|
41
|
+
workers can explicitly select another model and effort for the job. Native
|
|
42
|
+
choices for other executors remain unchanged. No fallback is selected when a
|
|
43
|
+
model is unavailable.
|
|
44
|
+
|
|
45
|
+
Upgrades add the responsive preset to the menu without changing an existing
|
|
46
|
+
selection, default, session, or queued run. Choose it through Choose AI for the
|
|
47
|
+
current conversation or Settings for future conversations. `/status` shows the
|
|
48
|
+
saved selection. Legacy client-default seeds still use native configuration
|
|
49
|
+
metadata for display only.
|
|
50
|
+
|
|
51
|
+
See [responsive channels](../responsive-channels.md) for the conversational
|
|
52
|
+
policy and the separate boundaries for plugin correspondence and app backends.
|
|
@@ -17,7 +17,7 @@ owner does not edit JSON. The agent uses `list` and `revoke` when asked.
|
|
|
17
17
|
After approval the relay starts a restricted task, including the initial outgoing
|
|
18
18
|
message. Incoming-only tasks instead wait for new correspondence and never create
|
|
19
19
|
an opening run. Their task records use version 2 so older task readers fail closed. Matching new correspondence resumes that task in a fresh native session.
|
|
20
|
-
Other contacts remain blocked.
|
|
20
|
+
Other contacts remain blocked. Finite tasks have at most 30 distinct text sends;
|
|
21
21
|
there are no payments, attachments, extra recipients, plugin installation,
|
|
22
22
|
settings changes, or access to owner memory. A contact can have one active or
|
|
23
23
|
pending task at a time. Completed, revoked, expired, replaced-source, and changed-
|
|
@@ -30,6 +30,29 @@ that each sentence serves the booking or that a correspondent is truthful. A
|
|
|
30
30
|
prompt injection can still derail a task or elicit its shared context. It cannot
|
|
31
31
|
use the provided tools to read owner files or select another destination.
|
|
32
32
|
|
|
33
|
+
## Ongoing conversation permissions
|
|
34
|
+
|
|
35
|
+
Incoming-only proposals may use `--until-revoked` for an ongoing conversation.
|
|
36
|
+
This is a provider-neutral version-3 grant using the same owner, account, source,
|
|
37
|
+
conversation and disclosure checks. It has no total reply count or time expiry.
|
|
38
|
+
A 30-send ceiling applies per incoming run to bound runaway output, not per grant.
|
|
39
|
+
Receipts stay durable; current-run keys are namespaced to avoid collisions with
|
|
40
|
+
later replies. The runner gets current-run receipts and rolling group-only notes
|
|
41
|
+
(up to 16,000 characters), not the owner's private session or files. Providers
|
|
42
|
+
receive the largest supported timestamp for the watch; the core still checks
|
|
43
|
+
revocation before every operation. Older versions reject version-3 grants.
|
|
44
|
+
|
|
45
|
+
The native Telegram source implements the existing provider protocol for exact
|
|
46
|
+
group IDs. It records selected text messages and sender identity, and sends only
|
|
47
|
+
to the bound group with durable uncertain/accepted receipts. Bot messages and
|
|
48
|
+
anonymous-admin posts are excluded by intake. Unselected owner group text remains
|
|
49
|
+
private discovery; other unselected group messages cannot launch work. Source
|
|
50
|
+
registration enables discovery, never reply permission. Voice and attachments are
|
|
51
|
+
not handled by this group adapter. WhatsApp continues using its existing adapter;
|
|
52
|
+
group and ongoing watch support requires the companion provider update. Older
|
|
53
|
+
adapters reject ongoing grants at proposal time. Pending watch removals retry
|
|
54
|
+
after service outages; core revocation blocks sends immediately.
|
|
55
|
+
|
|
33
56
|
## Native execution and core tools
|
|
34
57
|
|
|
35
58
|
V1 uses audited Codex CLI **0.153.4** for task work, regardless of the owner's
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
One owner, one bot, one relay writer per control directory. No database, extra agent, or executor loop.
|
|
4
4
|
|
|
5
|
-
1. Gate the sender and private chat before accepting work.
|
|
5
|
+
1. Gate the sender and private chat before accepting work. Text from the paired owner in a group is recorded only for discovery and routed to the owner's private chat; other group senders are ignored. Group controls, anonymous administrators and group replies are unsupported.
|
|
6
6
|
2. Atomically save the raw update and deduplicate its Telegram update ID in `EZ_CONTROL_DIR/inbox.json`.
|
|
7
7
|
3. Collect a short burst before downloading/transcribing. Seal batch membership on disk, then normalize in receive order. Captions, album IDs and quoted context travel with the media.
|
|
8
8
|
4. Create one durable run using the batch's stable ID. A restart between run creation and intake completion finds that same run; it does not create a second job.
|
package/docs/docker-runtime.md
CHANGED
|
@@ -61,6 +61,21 @@ Live smoke uses the same host CLI and requires an actual Telegram receipt.
|
|
|
61
61
|
Restart preserves pairing and files. One kernel lock excludes relay/smoke
|
|
62
62
|
writers; exit 73 means a writer is active. Do not delete its lock to bypass it.
|
|
63
63
|
Health requires recent polling and host-transport heartbeats, not just a process.
|
|
64
|
+
Fatal Telegram polling errors, including `409 Conflict`, stop intake and await
|
|
65
|
+
worker cleanup plus in-flight task/outbox writes before exit. A conflict still
|
|
66
|
+
requires the operator to stop the competing bot poller; the relay does not retry
|
|
67
|
+
around that ownership error. Pending and uncertain deliveries keep their existing
|
|
68
|
+
outbox/receipt semantics; executor stdout is not replayed as a reply.
|
|
69
|
+
Signal and fatal-error paths share one shutdown; a secondary cleanup error is
|
|
70
|
+
reported without replacing the original startup/polling failure.
|
|
71
|
+
|
|
72
|
+
The separate `control-state.lock` serializes authority JSON updates across CLI
|
|
73
|
+
processes. A forced kill or host crash can orphan this exclusive-create sentinel.
|
|
74
|
+
It deliberately has no age/PID-based auto-reclamation: expiry cannot prove that a
|
|
75
|
+
paused writer is dead, and host/container PIDs are not interchangeable. For an
|
|
76
|
+
orphan, stop the relay and all CLI writers for this deployment, preserve its
|
|
77
|
+
control state, then remove only the verified orphaned `control-state.lock` and
|
|
78
|
+
restart the single relay. Never remove a lock while a writer might still be live.
|
|
64
79
|
Model catalog metadata is exported from the selected host CLI without credentials.
|
|
65
80
|
The AI menu stays within that CLI. No automatic executor fallback is performed.
|
|
66
81
|
|
|
@@ -116,3 +131,23 @@ memory and host skill discovery are disabled for relay jobs. A conversation
|
|
|
116
131
|
that already received unrelated global context must be replaced with a fresh
|
|
117
132
|
native conversation; disabling injection does not remove prior turn content.
|
|
118
133
|
This prevents automatic context sharing, not adversarial access by the host user.
|
|
134
|
+
|
|
135
|
+
## Chat latency
|
|
136
|
+
|
|
137
|
+
Interactive Codex CLI turns resume the existing native session and use native
|
|
138
|
+
auto-compaction at 64,000 tokens. Set `EZ_CODEX_AUTO_COMPACT_TOKENS` in the Compose
|
|
139
|
+
environment to change the positive integer threshold (for example, 32000 for
|
|
140
|
+
lightweight chat). The setting crosses the host transport as a numeric option;
|
|
141
|
+
relay secrets are still excluded from CLI environments. Older oversized sessions
|
|
142
|
+
can take an extra compaction turn. Ez does not reconstruct transcripts or own a
|
|
143
|
+
separate memory/compaction engine. Other providers, Codex desktop, native scheduled
|
|
144
|
+
sessions and delegated tasks retain their own context policies. Channel backends
|
|
145
|
+
such as AIFit own inference and must configure their own context limits.
|
|
146
|
+
|
|
147
|
+
Content-free `run timing` logs identify the run and phase: queue wait and launch
|
|
148
|
+
startup, executor duration (including model and tool work), and successful outbox
|
|
149
|
+
delivery processing plus time since run creation. Host transport startup includes
|
|
150
|
+
its polling delay in executor duration; it is not a pure model-inference measure.
|
|
151
|
+
Delivery processing includes pacing, media preparation and provider calls. A sent
|
|
152
|
+
message may precede executor exit. No prompt, message body or credentials are added
|
|
153
|
+
to these timing logs.
|
package/docs/host-service.md
CHANGED
|
@@ -78,3 +78,22 @@ are not certified by these instructions or the headless Docker tests.
|
|
|
78
78
|
|
|
79
79
|
This beta includes owner-policy release checks and durable
|
|
80
80
|
main/plugin replacement. See [upgrade setup, tools and recovery](upgrades.md). Earlier main upgrade/rollback VM QA passed; final-release fresh-host/reboot and live plugin upgrade acceptance remain pending.
|
|
81
|
+
|
|
82
|
+
## Shared application workspace
|
|
83
|
+
|
|
84
|
+
Codex tasks inherit the agent's `control/cli/codex/auth.json` binding. Its default
|
|
85
|
+
is a link to the host user's existing login. An operator may provision a private
|
|
86
|
+
agent credential there during migration; new task homes link to that binding,
|
|
87
|
+
preserving it rather than reverting to a different or expired host login.
|
|
88
|
+
|
|
89
|
+
An agent binding may set `sharedWorkspace` to an absolute canonical application
|
|
90
|
+
repository. The host resolves its canonical path, adds that directory to Codex
|
|
91
|
+
write permissions for chat and scheduled jobs, and serializes all bindings in
|
|
92
|
+
that host executor which share it (including symlink aliases). Task sessions and
|
|
93
|
+
artifacts remain isolated. This is useful when independent task folders still
|
|
94
|
+
write the same application records. Long jobs can delay chat execution; relay
|
|
95
|
+
intake and cancellation remain available. The binding is host-owned and cannot
|
|
96
|
+
be supplied by a queued request. Other executors keep their native filesystem
|
|
97
|
+
policy. This lock is scoped to one host executor process; it does not coordinate
|
|
98
|
+
separate deployments or external writers. Do not run a second controller against
|
|
99
|
+
that repository.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# PagerDuty critical-outage paging
|
|
2
|
+
|
|
3
|
+
PagerDuty alerting is an optional core capability. It observes Stocks from the
|
|
4
|
+
Ez runtime and sends Events API v2 trigger and resolve events; Stocks never
|
|
5
|
+
receives the PagerDuty routing key.
|
|
6
|
+
|
|
7
|
+
Create an Events API v2 integration in the PagerDuty service that should page
|
|
8
|
+
you. Put only its routing key in the deployment's private `relay.env` file:
|
|
9
|
+
|
|
10
|
+
```dotenv
|
|
11
|
+
PAGERDUTY_ROUTING_KEY=<Events API v2 routing key>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Then add the tunnel-visible endpoint and monitor settings to the deployment's
|
|
15
|
+
non-secret `docker.env` file:
|
|
16
|
+
|
|
17
|
+
```dotenv
|
|
18
|
+
EZ_PAGERDUTY_STOCKS_HEALTH_URL=http://10.97.0.1:3006/health/critical
|
|
19
|
+
EZ_PAGERDUTY_POLL_SECONDS=30
|
|
20
|
+
EZ_PAGERDUTY_FAILURE_THRESHOLD=3
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The core checks the endpoint every 30 seconds by default. Three consecutive
|
|
24
|
+
unhealthy checks trigger one incident with the stable deduplication key
|
|
25
|
+
`ez:stocks:critical-health`; recovery resolves that same incident. A failed
|
|
26
|
+
PagerDuty submission remains eligible for a later trigger. On startup, the first
|
|
27
|
+
healthy check resolves any incident left by the previous process, including an
|
|
28
|
+
uncertain trigger delivery. Failed resolves retry without treating healthy
|
|
29
|
+
Stocks as an outage. No key or health
|
|
30
|
+
response is written to agent workspaces, executor environments, or logs.
|
|
31
|
+
|
|
32
|
+
`/health/critical` is intentionally narrower than Stocks `/health`: it pages
|
|
33
|
+
only when the Stocks source worker is unavailable. Provider freshness and other
|
|
34
|
+
research-quality degradation remain visible in normal Stocks health/status but
|
|
35
|
+
do not page. The endpoint returns only a status and component summary and must
|
|
36
|
+
be reachable from the core runtime over the private tunnel. Run core outside the
|
|
37
|
+
Stocks VM if you want a VM outage to be page-worthy.
|
|
38
|
+
|
|
39
|
+
After deployment, use PagerDuty's test/escalation tooling or temporarily point
|
|
40
|
+
the monitor at an intentionally unreachable private test target, then restore
|
|
41
|
+
the real target and confirm the PagerDuty incident resolves. This is an explicit
|
|
42
|
+
operational test and may notify your escalation policy.
|
package/docs/plugin-catalog.md
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
# Available plugins
|
|
2
2
|
|
|
3
|
-
This is Ez's public catalog of
|
|
4
|
-
discovering capabilities. Each entry
|
|
5
|
-
|
|
3
|
+
This is Ez's public catalog of registered plugins, for business owners and agents
|
|
4
|
+
discovering capabilities. Each entry identifies its public source repository,
|
|
5
|
+
package identity and release readiness. Registration does not prove that a package
|
|
6
|
+
has been published. Install only released plugins needed for the owner's requested work.
|
|
6
7
|
|
|
7
8
|
| Plugin | Capability | Package | Release |
|
|
8
9
|
|---|---|---|---|
|
|
9
|
-
| [WhatsApp](https://github.com/jdorado/ez-whatsapp) | Link an existing WhatsApp account so the agent can use its messaging tools. Uses WhatsApp Web linked devices through Baileys; requires an account already on a phone. | `@jc_stack/ez-whatsapp` | [
|
|
10
|
-
| [Composio](https://github.com/jdorado/ez_composio) | Discover integrations and full native tool schemas, connect requested accounts and perform authorized actions through a private broker. Requires a Composio project key; individual apps may require OAuth consent. | `@jc_stack/ez-composio` | [
|
|
11
|
-
| [GitHub](https://github.com/jdorado/ez_github) | Create repositories, commit and push through native Git/gh with a private per-agent profile. Requires GitHub browser consent and Ez 0.1.0-beta.13 or newer. | `@jc_stack/ez-github` | [
|
|
10
|
+
| [WhatsApp](https://github.com/jdorado/ez-whatsapp) | Link an existing WhatsApp account so the agent can use its messaging tools. Uses WhatsApp Web linked devices through Baileys; requires an account already on a phone. | `@jc_stack/ez-whatsapp` | [npm versions](https://www.npmjs.com/package/@jc_stack/ez-whatsapp?activeTab=versions) · [GitHub releases](https://github.com/jdorado/ez-whatsapp/releases) |
|
|
11
|
+
| [Composio](https://github.com/jdorado/ez_composio) | Discover integrations and full native tool schemas, connect requested accounts and perform authorized actions through a private broker. Requires a Composio project key; individual apps may require OAuth consent. | `@jc_stack/ez-composio` | [npm versions](https://www.npmjs.com/package/@jc_stack/ez-composio?activeTab=versions) · [GitHub releases](https://github.com/jdorado/ez_composio/releases) |
|
|
12
|
+
| [GitHub](https://github.com/jdorado/ez_github) | Create repositories, commit and push through native Git/gh with a private per-agent profile. Requires GitHub browser consent and Ez 0.1.0-beta.13 or newer. | `@jc_stack/ez-github` | [npm versions](https://www.npmjs.com/package/@jc_stack/ez-github?activeTab=versions) · [GitHub releases](https://github.com/jdorado/ez_github/releases) |
|
|
13
|
+
| [Library](https://github.com/jdorado/ez-library) | Preserve agent files and attachments, extract PDF text, and retrieve notes with QMD. Optional GitHub/Drive/Dropbox persistence requires separate setup and authorization. | `@jc_stack/ez-library` | [npm versions](https://www.npmjs.com/package/@jc_stack/ez-library?activeTab=versions) · [GitHub releases](https://github.com/jdorado/ez-library/releases) |
|
|
14
|
+
| [Resend](https://github.com/jdorado/ez-resend) | Receive Resend email into private idempotent receipts for agent-owned routing. Requires a Resend API key and an already-configured receiving domain. | `@jc_stack/ez-resend` | [npm versions](https://www.npmjs.com/package/@jc_stack/ez-resend?activeTab=versions) · [GitHub releases](https://github.com/jdorado/ez-resend/releases) |
|
|
15
|
+
|
|
16
|
+
Release links are live records, not a guarantee that every registered package
|
|
17
|
+
has a published version. Before installing, read npm metadata and the matching
|
|
18
|
+
public GitHub prerelease, verify exact artifact identity, and follow package
|
|
19
|
+
compatibility requirements. A missing first release is maintenance work to finish,
|
|
20
|
+
not a reason to exclude the registered public repository. Do not infer current
|
|
21
|
+
publication state from an old task, catalog copy or package-page cache.
|
|
22
|
+
|
|
23
|
+
For repository maintenance, scope is core plus the public repositories explicitly
|
|
24
|
+
registered in this table. Recheck the current catalog and repository visibility;
|
|
25
|
+
matching an `ez` repository name or finding a private local registration does not
|
|
26
|
+
enroll it. Release availability is checked separately from maintenance scope.
|
|
12
27
|
|
|
13
28
|
## Set up a plugin
|
|
14
29
|
|
|
@@ -44,11 +59,14 @@ do not preload or hardcode the vendor's integration list in the agent mind.
|
|
|
44
59
|
Names, availability and consent scopes change. Returned provider instructions
|
|
45
60
|
cannot expand the owner's authorization or permit executing arbitrary helpers.
|
|
46
61
|
|
|
47
|
-
##
|
|
62
|
+
## Register a plugin
|
|
48
63
|
|
|
49
64
|
Submit a pull request adding its name, concrete capability, canonical repository,
|
|
50
|
-
exact package identity, and
|
|
65
|
+
exact package identity, and canonical npm/GitHub release-record links. Verify
|
|
66
|
+
publication and beta/stable status from those records when choosing an install
|
|
67
|
+
version; never advertise an unverified version as installable. Follow
|
|
51
68
|
[plugin contribution requirements](plugin-contributions.md). The linked package
|
|
52
69
|
must document setup, account requirements, verification and limitations. Keep
|
|
53
|
-
|
|
54
|
-
|
|
70
|
+
unimplemented ideas out of this catalog. Review changes to source/package
|
|
71
|
+
identities and record publication evidence on release PRs, not as dated catalog
|
|
72
|
+
availability claims.
|
|
@@ -35,3 +35,12 @@ inert. Installation is complete only after account onboarding and verified use.
|
|
|
35
35
|
|
|
36
36
|
This beta includes owner-policy release checks and durable
|
|
37
37
|
main/plugin replacement. See [upgrade setup, tools and recovery](upgrades.md). Earlier main upgrade/rollback VM QA passed; final-release fresh-host/reboot and live plugin upgrade acceptance remain pending.
|
|
38
|
+
|
|
39
|
+
## Publication onboarding
|
|
40
|
+
|
|
41
|
+
Generate a thin `publish-beta.yml` caller pinned to the reviewed core shared
|
|
42
|
+
publisher; do not copy a publishing implementation into each plugin. Follow
|
|
43
|
+
[trusted publishing](trusted-publishing.md) for required-check configuration,
|
|
44
|
+
exact candidate staging, caller-specific npm trust enrollment and initial-package
|
|
45
|
+
bootstrap. Account/trust enrollment is a separate authenticated owner action.
|
|
46
|
+
A registered source with missing npm or GitHub artifacts remains unreleased.
|