@meffecta/agent 1.0.11 → 1.0.12

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.
@@ -32,7 +32,7 @@ REGION=europe-west1
32
32
  # several Google accounts and want this deployment pinned to one.
33
33
  # ACCOUNT=you@example.com
34
34
 
35
- # Optional. The service's TIMEZONE env var, which is what cron schedules are read in.
35
+ # Optional. The zone every job's `cron:` is read in. Defaults to UTC.
36
36
  # TIMEZONE=Europe/Stockholm
37
37
 
38
38
  # Optional. The runtime shape asserted on every rollout, so the deployed service
package/engine.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "engineTag": "1.0.11",
3
- "builtFrom": "c0f07973f25a4d8872a3e4dd28c44cd94f2e87a7"
2
+ "engineTag": "1.0.12",
3
+ "builtFrom": "222c28d7ab3961fc2512e630a6b41b60430c9558"
4
4
  }
package/lib/commands.js CHANGED
@@ -217,6 +217,11 @@ async function status() {
217
217
  }
218
218
  console.log(` revision ${svc.status?.latestReadyRevisionName ?? "?"}`);
219
219
  console.log(` image ${container.image}`);
220
+ // The address you paste into someone else's console. GA4, Search Console and Google Ads
221
+ // authenticate as this rather than with a token, so granting the agent a property means
222
+ // inviting this email — and it is read from the service rather than assembled from the
223
+ // project name, so it is what the agent actually runs as.
224
+ console.log(` acts as ${tpl.spec.serviceAccountName ?? "(the project's default compute account)"}`);
220
225
  console.log(
221
226
  ` shape min ${ann["autoscaling.knative.dev/minScale"] ?? "0"}, max ${
222
227
  ann["autoscaling.knative.dev/maxScale"] ?? "?"
package/lib/create-job.js CHANGED
@@ -230,7 +230,7 @@ export async function createJob(args) {
230
230
  .map((f) => f.replace(/\.md$/, ""))
231
231
  : [];
232
232
 
233
- const timezone = d.TIMEZONE ?? "Europe/Stockholm";
233
+ const timezone = d.TIMEZONE ?? "UTC";
234
234
  console.error(`Asking ${d.SERVICE} to write it — it can see your jobs, worlds and skills. This takes a minute.`);
235
235
  const params = new URLSearchParams({ prompt: buildPrompt(description, { timezone, existing }) });
236
236
  if (flags.model) {
@@ -63,8 +63,8 @@ const INTEGRATIONS = {
63
63
  gives: "query-google-marketing — traffic, the queries that bring it, campaign spend",
64
64
  needs: [
65
65
  "No token at all: these authenticate as the runtime service account, which means",
66
- "inviting it rather than minting anything. `meffecta-agent status` prints its address,",
67
- "or look for agent-runtime@<project>.iam.gserviceaccount.com.",
66
+ "inviting it rather than minting anything. `meffecta-agent status` prints the exact",
67
+ "address to invite, on its `acts as` line.",
68
68
  "",
69
69
  "Invite it as a Viewer on each property you want read: the GA4 property (Admin →",
70
70
  "Property access management), the Search Console property (Settings → Users and",
package/lib/resources.js CHANGED
@@ -210,6 +210,9 @@ export async function resources() {
210
210
  const note = explain[name] ?? `${display || "no description"} — not part of the agent set-up`;
211
211
  row(email === runtimeSa ? "✔" : explain[name] ? "✔" : "·", name, note, saWidth);
212
212
  }
213
+ console.log(` ${runtimeSa}`);
214
+ console.log(" is the address to invite on a GA4 property, Search Console or Google Ads —");
215
+ console.log(" those grant access to a login rather than to a token.");
213
216
  const held = (roles ?? "").split("\n").filter(Boolean);
214
217
  if (held.length) {
215
218
  console.log(` agent-runtime may, across the whole project: ${held.map((r) => leaf(r)).join(", ")}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meffecta/agent",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "description": "Set up and operate a Meffecta Agent deployment — a self-hosted Claude Code job runner.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -70,7 +70,7 @@ resolve_deployment() {
70
70
  # configure by editing a committed file.
71
71
  GHCR_IMAGE="${GHCR_IMAGE:-ghcr.io/meffecta/agent}"
72
72
  GHCR_PATH="${GHCR_IMAGE#*/}" # ghcr.io/meffecta/agent → meffecta/agent
73
- TIMEZONE="${TIMEZONE:-Europe/Stockholm}"
73
+ TIMEZONE="${TIMEZONE:-UTC}"
74
74
 
75
75
  # The runtime shape, asserted by deploy.sh on every rollout so the deployed service
76
76
  # matches this file rather than whatever was last done by hand in the console. Defaults
@@ -314,6 +314,13 @@ echo " the agent acts as, a bucket for its memory, a write-once bucket for the
314
314
  echo " trail, the queue that carries work back to the service, and the service itself —"
315
315
  echo " empty, waiting for an engine."
316
316
  echo ""
317
+ # The one address an operator has to type into someone else's console. Google Analytics,
318
+ # Search Console and Google Ads grant access to a login rather than to a token, so this is
319
+ # what gets invited. Printed on every run, not only the one that created it.
320
+ echo " The agent acts as:"
321
+ echo " ${RUNTIME_SA}"
322
+ echo " Invite that on a GA4 property, Search Console or Google Ads to let it read them."
323
+ echo ""
317
324
  echo " Next, from this directory:"
318
325
  echo ""
319
326
  echo " $(cmd set-env) GIT_REPO_URL=https://github.com/<owner>/<content-repo>.git"