@open-everywhere/create 0.7.0 → 0.8.0

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.
Files changed (34) hide show
  1. package/README.md +5 -3
  2. package/package.json +3 -3
  3. package/src/steps/build-deploy.ts +2 -2
  4. package/template/.dockerignore +35 -0
  5. package/template/AGENTS.md +7 -0
  6. package/template/Dockerfile +60 -0
  7. package/template/README.md +13 -0
  8. package/template/agent/agent.ts +25 -8
  9. package/template/agent/instructions.md +6 -0
  10. package/template/agent/lib/register-config.ts +5 -1
  11. package/template/agent/memory/config/domains/org.ts +2 -2
  12. package/template/agent/model/models.ts +17 -0
  13. package/template/agent/model/stacks.ts +23 -6
  14. package/template/agent/settings/settings.ts +21 -2
  15. package/template/agent/spend/model-pricing.ts +3 -1
  16. package/template/claude/skills/quickstart-open-everywhere/SKILL.md +96 -9
  17. package/template/claude/skills/upgrade-open-everywhere/SKILL.md +16 -3
  18. package/template/deploy/egress-proxy/Dockerfile +30 -0
  19. package/template/deploy/egress-proxy/control/acl.ts +228 -0
  20. package/template/deploy/egress-proxy/control/handlers.ts +174 -0
  21. package/template/deploy/egress-proxy/control/helper.cjs +108 -0
  22. package/template/deploy/egress-proxy/control/server.ts +122 -0
  23. package/template/deploy/egress-proxy/entrypoint.sh +62 -0
  24. package/template/deploy/egress-proxy/gen-ca.sh +42 -0
  25. package/template/deploy/egress-proxy/install-ca.sh +39 -0
  26. package/template/deploy/egress-proxy/squid.conf +93 -0
  27. package/template/deploy/egress-proxy/tier-b.conf +42 -0
  28. package/template/docker-compose.yml +135 -0
  29. package/template/gitignore +4 -0
  30. package/template/package.json +4 -3
  31. package/template/roster.lock.json +9 -1
  32. package/template/scripts/goldens/roster-plan.txt +8 -0
  33. package/template/scripts/model-config-check.ts +81 -0
  34. package/template/scripts/ops-mcp.ts +1 -1
@@ -10,14 +10,15 @@
10
10
  "postinstall": "oe-eve-patch",
11
11
  "oe:build": "oe build",
12
12
  "predev": "oe build",
13
- "dev": "eve dev",
13
+ "dev": "EVE_TELEMETRY_DISABLED=1 eve dev",
14
14
  "prebuild": "oe build",
15
- "build": "eve build",
15
+ "build": "EVE_TELEMETRY_DISABLED=1 eve build",
16
16
  "prestart": "oe build",
17
- "start": "eve start",
17
+ "start": "EVE_TELEMETRY_DISABLED=1 eve start",
18
18
  "pretypecheck": "oe build",
19
19
  "typecheck": "tsc --noEmit -p tsconfig.json",
20
20
  "check": "create-open-everywhere --check",
21
+ "check:model-config": "node --import tsx scripts/model-config-check.ts",
21
22
  "ops": "node --import tsx scripts/ops-mcp.ts",
22
23
  "env:pipe": "node scripts/env-pipe.mjs"
23
24
  },
@@ -53,10 +53,13 @@
53
53
  "hook/native-input-audit": "mounted",
54
54
  "hook/own-account-ask": "mounted",
55
55
  "hook/personal-watch-enroll": "mounted",
56
+ "hook/question-ledger": "mounted",
56
57
  "hook/requester-identity": "mounted",
57
58
  "hook/requester-messages": "mounted",
58
59
  "hook/routine-outcome": "mounted",
60
+ "hook/routine-report-reply": "mounted",
59
61
  "hook/routine-silence": "mounted",
62
+ "hook/routine-test-run": "mounted",
60
63
  "hook/session-park": "mounted",
61
64
  "hook/spawn-taint": "mounted",
62
65
  "hook/spend": "mounted",
@@ -68,6 +71,7 @@
68
71
  "hook/wake-turn-start": "mounted",
69
72
  "hook/window-routing": "mounted",
70
73
  "schedule/audit-export": "mounted",
74
+ "schedule/cover-recap": "mounted",
71
75
  "schedule/directory-sync": "mounted",
72
76
  "schedule/dispatch": "mounted",
73
77
  "schedule/dream-mode3": "mounted",
@@ -107,6 +111,7 @@
107
111
  "tool/delete_skill": "mounted",
108
112
  "tool/describe_image": "mounted",
109
113
  "tool/dm_person": "mounted",
114
+ "tool/doing_for_me": "mounted",
110
115
  "tool/edit_reply": "mounted",
111
116
  "tool/edit_routine": "mounted",
112
117
  "tool/enable_routine": "mounted",
@@ -175,12 +180,15 @@
175
180
  "tool/spend_report": "mounted",
176
181
  "tool/stand_down": "mounted",
177
182
  "tool/subscribe_pr": "mounted",
183
+ "tool/test_routine": "mounted",
178
184
  "tool/unlink_identity": "mounted",
185
+ "tool/update_list": "mounted",
179
186
  "tool/update_status": "mounted",
180
187
  "tool/usage_report": "mounted",
181
188
  "tool/waiting_on_me": "mounted",
182
189
  "tool/walk_pr": "mounted",
183
- "tool/work": "mounted"
190
+ "tool/work": "mounted",
191
+ "tool/write_canvas": "mounted"
184
192
  }
185
193
  },
186
194
  "@open-everywhere/provider-github": {
@@ -38,10 +38,13 @@ agent/hooks/memory.ts mounted @open-everywhere/core
38
38
  agent/hooks/native-input-audit.ts mounted @open-everywhere/core
39
39
  agent/hooks/own-account-ask.ts mounted @open-everywhere/core
40
40
  agent/hooks/personal-watch-enroll.ts mounted @open-everywhere/core
41
+ agent/hooks/question-ledger.ts mounted @open-everywhere/core
41
42
  agent/hooks/requester-identity.ts mounted @open-everywhere/core
42
43
  agent/hooks/requester-messages.ts mounted @open-everywhere/core
43
44
  agent/hooks/routine-outcome.ts mounted @open-everywhere/core
45
+ agent/hooks/routine-report-reply.ts mounted @open-everywhere/core
44
46
  agent/hooks/routine-silence.ts mounted @open-everywhere/core
47
+ agent/hooks/routine-test-run.ts mounted @open-everywhere/core
45
48
  agent/hooks/sandbox-lifecycle.ts mounted @open-everywhere/adapters
46
49
  agent/hooks/session-park.ts mounted @open-everywhere/core
47
50
  agent/hooks/spawn-taint.ts mounted @open-everywhere/core
@@ -55,6 +58,7 @@ agent/hooks/wake-turn-start.ts mounted @open-everywhere/core
55
58
  agent/hooks/window-routing.ts mounted @open-everywhere/core
56
59
  agent/lib/providers.generated.ts providers slack,notion,github
57
60
  agent/schedules/audit-export.ts mounted @open-everywhere/core
61
+ agent/schedules/cover-recap.ts mounted @open-everywhere/core
58
62
  agent/schedules/directory-sync.ts mounted @open-everywhere/core
59
63
  agent/schedules/dispatch.ts mounted @open-everywhere/core
60
64
  agent/schedules/dream-mode3.ts mounted @open-everywhere/core
@@ -96,6 +100,7 @@ agent/tools/delegate_to_agent.ts mounted @open-everywhere/core
96
100
  agent/tools/delete_skill.ts mounted @open-everywhere/core
97
101
  agent/tools/describe_image.ts mounted @open-everywhere/core
98
102
  agent/tools/dm_person.ts mounted @open-everywhere/core
103
+ agent/tools/doing_for_me.ts mounted @open-everywhere/core
99
104
  agent/tools/edit_reply.ts mounted @open-everywhere/core
100
105
  agent/tools/edit_routine.ts mounted @open-everywhere/core
101
106
  agent/tools/enable_routine.ts mounted @open-everywhere/core
@@ -169,11 +174,14 @@ agent/tools/spawn_thread_session.ts mounted @open-everywhere/core
169
174
  agent/tools/spend_report.ts mounted @open-everywhere/core
170
175
  agent/tools/stand_down.ts mounted @open-everywhere/core
171
176
  agent/tools/subscribe_pr.ts mounted @open-everywhere/core
177
+ agent/tools/test_routine.ts mounted @open-everywhere/core
172
178
  agent/tools/unlink_identity.ts mounted @open-everywhere/core
179
+ agent/tools/update_list.ts mounted @open-everywhere/core
173
180
  agent/tools/update_status.ts mounted @open-everywhere/core
174
181
  agent/tools/usage_report.ts mounted @open-everywhere/core
175
182
  agent/tools/waiting_on_me.ts mounted @open-everywhere/core
176
183
  agent/tools/walk_pr.ts mounted @open-everywhere/core
177
184
  agent/tools/web_fetch.ts framework-disabled
178
185
  agent/tools/work.ts mounted @open-everywhere/core
186
+ agent/tools/write_canvas.ts mounted @open-everywhere/core
179
187
  agent/tools/write_file.ts framework-disabled
@@ -0,0 +1,81 @@
1
+ // THE LIVE MODEL CONFIG CHECK — `npm run check:model-config` (OPE-2556).
2
+ //
3
+ // npm run check:model-config check this app's resolved models against its models.targets and models.dataPolicy
4
+ // npm run check:model-config -- --json the same, as one JSON object
5
+ //
6
+ // It loads the app's own config (settings, stack, domains, roles), lists the models the deployment can resolve (the stack
7
+ // roles, the gateway transcription routes, the domain and role routes, models.force, and each declared subagent's
8
+ // bare model id on the target it goes through), and
9
+ // reads the gateway's PUBLIC `/v1/models/<id>/endpoints` for each one. A `models.dataPolicy` row or a `providers.only`
10
+ // row that no provider can meet is named, for example "region eu: no provider for deepseek/deepseek-v4-flash-0731".
11
+ // Run it BEFORE a deploy that changes either setting: under such a row every call of that model fails closed.
12
+ //
13
+ // 🔴 TWO COPIES, ONE TEXT (OPE-2563). The repository runs this file, and the scaffold template ships the same bytes
14
+ // at the same app-relative path, so a scaffolded app runs the check before its first deploy and the setup skill
15
+ // names one command in both homes. `test:scaffold` refuses a copy that drifts.
16
+ //
17
+ // It needs the network and no credential: the endpoints read is unauthenticated. So it is NOT in the `npm test` chain.
18
+ // The same check runs on a deployment, in the `model-route` row of `GET /eve/v1/oe/status` (adapters gateway-probe.ts),
19
+ // which `npx @open-everywhere/create --check --host <url>` reports.
20
+ //
21
+ // A bare model id that no stack role names goes through the primary role's target (OPE-2566). The check names each
22
+ // such id, so a subagent that would leave its role's target is visible before a deploy.
23
+ //
24
+ // Exit: 0 when every demand can be served or a part is unknown (printed), 1 when a demand cannot be served, or when a
25
+ // role names a target other than `gateway` and the app does not register its roles for bare ids.
26
+
27
+ import { getConfig } from "@open-everywhere/core/agent/access/config.js";
28
+ import { getSettings } from "@open-everywhere/core/agent/settings/settings.js";
29
+ import { modelTargetFor, resolvableModels } from "@open-everywhere/core/agent/model/targets.js";
30
+ import { bareModelFallbacks, bareModelRoutes, bareModelRoutesUnregistered, bareModelVia } from "@open-everywhere/core/agent/model/bare-model-via.js";
31
+ import { declaredSubagentModels } from "@open-everywhere/core/agent/ops/sovereignty-facts.js";
32
+ import { importAppModule, resolveAppRoot } from "@open-everywhere/core/agent/scaffold/app-root.js";
33
+ import { checkModelConfig, configCheckSummary } from "@open-everywhere/adapters/agent/model/model-config-check.js";
34
+ import { targetBaseUrl } from "@open-everywhere/adapters/agent/model/target-url.js";
35
+
36
+ // The deployer's app config loads from the app root (`OE_APP_ROOT`, else the directory npm ran in — OPE-2195).
37
+ const APP_ROOT = resolveAppRoot();
38
+ await importAppModule("agent/lib/register-config.ts", APP_ROOT);
39
+ const { MODELS, TRANSCRIPTION_ROLE } = await importAppModule<typeof import("../agent/model/models.js")>("agent/model/models.ts", APP_ROOT);
40
+
41
+ const settings = getSettings().models;
42
+ // The gateway transcription routes carry the `gateway` target's rows too, so they are checked with the roles.
43
+ const transcription = [TRANSCRIPTION_ROLE.primary, TRANSCRIPTION_ROLE.fallback].flatMap((r) => (r?.via === "gateway" ? [{ id: r.id }] : []));
44
+ // A declared subagent's bare id is checked on the target it goes through: its role's, else the primary role's.
45
+ const routes = bareModelRoutes(Object.values(MODELS));
46
+ // The app's `agent/model/models.ts` registers the roles at load (the import above ran it). An app scaffolded before
47
+ // 0.8.0 does not, so at run time every bare id still goes through `gateway`, whatever this check computes.
48
+ // That matters only when a role names a target other than `gateway`: then a bare id leaves the role's target.
49
+ const unregisteredLeak = bareModelRoutesUnregistered(routes);
50
+ const declared = (await declaredSubagentModels(APP_ROOT)) ?? [];
51
+ // A subagent whose module did not load has an unknown model: it is named, and the check cannot read it.
52
+ const unloaded = declared.filter((b) => b.id === undefined).map((b) => b.where);
53
+ const subagents = declared.flatMap((b) => (b.id === undefined ? [] : [{ where: b.where, id: b.id }]));
54
+ const bare = subagents.map((b) => ({ id: b.id, via: bareModelVia(b.id, routes).via }));
55
+ const fallbacks = bareModelFallbacks(subagents, routes);
56
+ const models = resolvableModels([...Object.values(MODELS), ...transcription, ...bare], getConfig().loadDomains(), getConfig().loadRoles?.() ?? [], settings.force);
57
+ const result = await checkModelConfig({
58
+ models,
59
+ targets: settings.targets,
60
+ policy: settings.dataPolicy,
61
+ baseUrlFor: (via) => targetBaseUrl(via, modelTargetFor(via, settings.targets)),
62
+ timeoutMs: 15_000,
63
+ });
64
+
65
+ if (process.argv.includes("--json")) {
66
+ console.log(JSON.stringify({ met: result.met, checked: result.checked, models, findings: result.findings, bareRoutesUnregistered: unregisteredLeak, bareDefaultVia: routes.fallback, bareFallbacks: fallbacks, unloadedSubagents: unloaded }, null, 2));
67
+ } else {
68
+ console.log(configCheckSummary(result));
69
+ for (const f of result.findings) console.log(` ${f.met === "no" ? "✗" : "?"} ${f.detail}`);
70
+ if (unregisteredLeak) {
71
+ console.log(" ✗ agent/model/models.ts does not call registerBareModelRoutes, so every bare id goes via gateway, not the targets below. Add the line from the 0.8.0 template.");
72
+ }
73
+ // Every declared subagent, with the target its bare id goes through; then the target of any other bare id.
74
+ for (const b of subagents) {
75
+ const r = bareModelVia(b.id, routes);
76
+ console.log(r.source === "role" ? ` · ${b.where}: via ${r.via}, its role's target` : ` · ${b.where}: no role names ${b.id}, so it goes via ${r.via}, the primary role's target`);
77
+ }
78
+ for (const w of unloaded) console.log(` ? ${w}: model unknown, its module did not load, so it was not checked`);
79
+ console.log(` · any other bare id (eve evaluate()): via ${routes.fallback}, the primary role's target`);
80
+ }
81
+ process.exit(result.met === "no" || unregisteredLeak ? 1 : 0);
@@ -47,5 +47,5 @@ registerSurfaceTrustPreflight();
47
47
  const server = buildOpsServer();
48
48
  await server.connect(new StdioServerTransport());
49
49
  process.stderr.write(
50
- "open-everywhere-ops MCP server ready on stdio (preflight · surface_manifest · surface_app_package · scaffold_env · scaffold_credential_key · secret_set/list/rm)\n",
50
+ "open-everywhere-ops MCP server ready on stdio (preflight · surface_manifest · surface_app_package · surface_app_create · scaffold_env · scaffold_credential_key · secret_set/list/rm)\n",
51
51
  );