@abyssinia-labs/wake-convex 0.1.0 → 0.3.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.
- package/README.md +6 -5
- package/dist/client/index.d.ts +61 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +23 -2
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +4 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +55 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/runs.d.ts +36 -0
- package/dist/component/runs.d.ts.map +1 -0
- package/dist/component/runs.js +38 -0
- package/dist/component/runs.js.map +1 -0
- package/dist/component/schema.d.ts +37 -1
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +11 -0
- package/dist/component/schema.js.map +1 -1
- package/dist/component/shape.d.ts +5 -0
- package/dist/component/shape.d.ts.map +1 -1
- package/dist/component/shape.js +6 -0
- package/dist/component/shape.js.map +1 -1
- package/dist/component/summonses.d.ts +14 -0
- package/dist/component/summonses.d.ts.map +1 -1
- package/dist/component/summonses.js +3 -25
- package/dist/component/summonses.js.map +1 -1
- package/dist/component/views.d.ts +90 -0
- package/dist/component/views.d.ts.map +1 -0
- package/dist/component/views.js +40 -0
- package/dist/component/views.js.map +1 -0
- package/dist/component/wire.d.ts +14 -0
- package/dist/component/wire.d.ts.map +1 -1
- package/dist/component/wire.js +37 -1
- package/dist/component/wire.js.map +1 -1
- package/package.json +1 -1
- package/src/client/index.ts +24 -2
- package/src/component/_generated/api.ts +4 -0
- package/src/component/_generated/component.ts +55 -0
- package/src/component/runs.ts +36 -0
- package/src/component/schema.ts +11 -0
- package/src/component/shape.ts +8 -0
- package/src/component/summonses.ts +3 -26
- package/src/component/views.ts +42 -0
- package/src/component/wire.ts +36 -1
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
import { v } from "convex/values";
|
|
6
6
|
import { internal } from "./_generated/api.js";
|
|
7
7
|
import { internalMutation, mutation, query } from "./_generated/server.js";
|
|
8
|
-
import {
|
|
8
|
+
import { target } from "./schema.js";
|
|
9
9
|
import { checkSummons } from "./shape.js";
|
|
10
|
+
import { summonsView, viewOf } from "./views.js";
|
|
10
11
|
/** The spec's "nothing has claimed it in thirty minutes". */
|
|
11
12
|
export const UNCLAIMED_MS = 30 * 60_000;
|
|
12
13
|
const LIVE = ["asking", "open", "claimed"];
|
|
@@ -114,18 +115,6 @@ export const settle = mutation({
|
|
|
114
115
|
return ended;
|
|
115
116
|
},
|
|
116
117
|
});
|
|
117
|
-
const summonsView = v.object({
|
|
118
|
-
id: v.string(),
|
|
119
|
-
agent: v.string(),
|
|
120
|
-
owner: v.string(),
|
|
121
|
-
askedBy: v.string(),
|
|
122
|
-
kind: v.string(),
|
|
123
|
-
state,
|
|
124
|
-
at: v.number(),
|
|
125
|
-
updatedAt: v.number(),
|
|
126
|
-
reason: v.optional(v.string()),
|
|
127
|
-
unclaimed: v.boolean(),
|
|
128
|
-
});
|
|
129
118
|
/** Each agent's latest summons about `subject`, for the host to show where it was made. */
|
|
130
119
|
export const forSubject = query({
|
|
131
120
|
args: { subject: v.string() },
|
|
@@ -141,18 +130,7 @@ export const forSubject = query({
|
|
|
141
130
|
if (!seen || row.updatedAt > seen.updatedAt)
|
|
142
131
|
latest.set(row.agent, row);
|
|
143
132
|
}
|
|
144
|
-
return [...latest.values()].map(
|
|
145
|
-
id: row._id,
|
|
146
|
-
agent: row.agent,
|
|
147
|
-
owner: row.owner,
|
|
148
|
-
askedBy: row.askedBy,
|
|
149
|
-
kind: row.kind,
|
|
150
|
-
state: row.state,
|
|
151
|
-
at: row.at,
|
|
152
|
-
updatedAt: row.updatedAt,
|
|
153
|
-
...(row.reason === undefined ? {} : { reason: row.reason }),
|
|
154
|
-
unclaimed: row.state === "open" && row.noticedAt !== undefined,
|
|
155
|
-
}));
|
|
133
|
+
return [...latest.values()].map(viewOf);
|
|
156
134
|
},
|
|
157
135
|
});
|
|
158
136
|
/** Half an hour after it opened: if nothing has claimed it, it says so (`unclaimed`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summonses.js","sourceRoot":"","sources":["../../src/component/summonses.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,wEAAwE;AACxE,kEAAkE;AAClE,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAoB,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"summonses.js","sourceRoot":"","sources":["../../src/component/summonses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Doc } from "./_generated/dataModel.js";
|
|
2
|
+
export declare const summonsView: import("convex/values").VObject<{
|
|
3
|
+
agent: string;
|
|
4
|
+
askedBy: string;
|
|
5
|
+
at: number;
|
|
6
|
+
id: string;
|
|
7
|
+
kind: string;
|
|
8
|
+
owner: string;
|
|
9
|
+
reason?: string | undefined;
|
|
10
|
+
run?: {
|
|
11
|
+
machine: string;
|
|
12
|
+
name: string;
|
|
13
|
+
session?: string | undefined;
|
|
14
|
+
startedAt: number;
|
|
15
|
+
tool: "claude" | "codex" | "cursor";
|
|
16
|
+
} | undefined;
|
|
17
|
+
scope?: string | undefined;
|
|
18
|
+
state: "asking" | "claimed" | "done" | "dropped" | "failed" | "open";
|
|
19
|
+
subject: string;
|
|
20
|
+
target: {
|
|
21
|
+
kind: string;
|
|
22
|
+
ref: string;
|
|
23
|
+
url: string;
|
|
24
|
+
};
|
|
25
|
+
unclaimed: boolean;
|
|
26
|
+
updatedAt: number;
|
|
27
|
+
}, {
|
|
28
|
+
id: import("convex/values").VString<string, "required">;
|
|
29
|
+
agent: import("convex/values").VString<string, "required">;
|
|
30
|
+
owner: import("convex/values").VString<string, "required">;
|
|
31
|
+
askedBy: import("convex/values").VString<string, "required">;
|
|
32
|
+
scope: import("convex/values").VString<string | undefined, "optional">;
|
|
33
|
+
subject: import("convex/values").VString<string, "required">;
|
|
34
|
+
kind: import("convex/values").VString<string, "required">;
|
|
35
|
+
target: import("convex/values").VObject<{
|
|
36
|
+
kind: string;
|
|
37
|
+
ref: string;
|
|
38
|
+
url: string;
|
|
39
|
+
}, {
|
|
40
|
+
kind: import("convex/values").VString<string, "required">;
|
|
41
|
+
ref: import("convex/values").VString<string, "required">;
|
|
42
|
+
url: import("convex/values").VString<string, "required">;
|
|
43
|
+
}, "required", "kind" | "ref" | "url">;
|
|
44
|
+
state: import("convex/values").VUnion<"asking" | "claimed" | "done" | "dropped" | "failed" | "open", [import("convex/values").VLiteral<"asking", "required">, import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"claimed", "required">, import("convex/values").VLiteral<"done", "required">, import("convex/values").VLiteral<"failed", "required">, import("convex/values").VLiteral<"dropped", "required">], "required", never>;
|
|
45
|
+
at: import("convex/values").VFloat64<number, "required">;
|
|
46
|
+
updatedAt: import("convex/values").VFloat64<number, "required">;
|
|
47
|
+
reason: import("convex/values").VString<string | undefined, "optional">;
|
|
48
|
+
unclaimed: import("convex/values").VBoolean<boolean, "required">;
|
|
49
|
+
/** Its run once Wake said it started. `session` is the owner's to see. */
|
|
50
|
+
run: import("convex/values").VObject<{
|
|
51
|
+
machine: string;
|
|
52
|
+
name: string;
|
|
53
|
+
session?: string | undefined;
|
|
54
|
+
startedAt: number;
|
|
55
|
+
tool: "claude" | "codex" | "cursor";
|
|
56
|
+
} | undefined, {
|
|
57
|
+
name: import("convex/values").VString<string, "required">;
|
|
58
|
+
tool: import("convex/values").VUnion<"claude" | "codex" | "cursor", [import("convex/values").VLiteral<"claude", "required">, import("convex/values").VLiteral<"codex", "required">, import("convex/values").VLiteral<"cursor", "required">], "required", never>;
|
|
59
|
+
session: import("convex/values").VString<string | undefined, "optional">;
|
|
60
|
+
machine: import("convex/values").VString<string, "required">;
|
|
61
|
+
startedAt: import("convex/values").VFloat64<number, "required">;
|
|
62
|
+
}, "optional", "machine" | "name" | "session" | "startedAt" | "tool">;
|
|
63
|
+
}, "required", "agent" | "askedBy" | "at" | "id" | "kind" | "owner" | "reason" | "run" | "run.machine" | "run.name" | "run.session" | "run.startedAt" | "run.tool" | "scope" | "state" | "subject" | "target" | "target.kind" | "target.ref" | "target.url" | "unclaimed" | "updatedAt">;
|
|
64
|
+
export declare function viewOf(row: Doc<"summonses">): {
|
|
65
|
+
id: import("convex/values").GenericId<"summonses">;
|
|
66
|
+
agent: string;
|
|
67
|
+
owner: string;
|
|
68
|
+
askedBy: string;
|
|
69
|
+
scope?: string | undefined;
|
|
70
|
+
subject: string;
|
|
71
|
+
kind: string;
|
|
72
|
+
target: {
|
|
73
|
+
kind: string;
|
|
74
|
+
ref: string;
|
|
75
|
+
url: string;
|
|
76
|
+
};
|
|
77
|
+
state: "asking" | "claimed" | "done" | "dropped" | "failed" | "open";
|
|
78
|
+
at: number;
|
|
79
|
+
updatedAt: number;
|
|
80
|
+
reason?: string | undefined;
|
|
81
|
+
unclaimed: boolean;
|
|
82
|
+
run?: {
|
|
83
|
+
machine: string;
|
|
84
|
+
name: string;
|
|
85
|
+
session?: string | undefined;
|
|
86
|
+
startedAt: number;
|
|
87
|
+
tool: "claude" | "codex" | "cursor";
|
|
88
|
+
} | undefined;
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/component/views.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAGrD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IActB,0EAA0E;;;;;;;;;;;;;;wRAE1E,CAAC;AAEH,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAiB3C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// A summons as the host reads it back: the same shape from `forSubject`
|
|
2
|
+
// (where it was made) and `runs.forOwner` (what a person's agents did).
|
|
3
|
+
import { v } from "convex/values";
|
|
4
|
+
import { run, state, target } from "./schema.js";
|
|
5
|
+
export const summonsView = v.object({
|
|
6
|
+
id: v.string(),
|
|
7
|
+
agent: v.string(),
|
|
8
|
+
owner: v.string(),
|
|
9
|
+
askedBy: v.string(),
|
|
10
|
+
scope: v.optional(v.string()),
|
|
11
|
+
subject: v.string(),
|
|
12
|
+
kind: v.string(),
|
|
13
|
+
target,
|
|
14
|
+
state,
|
|
15
|
+
at: v.number(),
|
|
16
|
+
updatedAt: v.number(),
|
|
17
|
+
reason: v.optional(v.string()),
|
|
18
|
+
unclaimed: v.boolean(),
|
|
19
|
+
/** Its run once Wake said it started. `session` is the owner's to see. */
|
|
20
|
+
run: v.optional(run),
|
|
21
|
+
});
|
|
22
|
+
export function viewOf(row) {
|
|
23
|
+
return {
|
|
24
|
+
id: row._id,
|
|
25
|
+
agent: row.agent,
|
|
26
|
+
owner: row.owner,
|
|
27
|
+
askedBy: row.askedBy,
|
|
28
|
+
...(row.scope === undefined ? {} : { scope: row.scope }),
|
|
29
|
+
subject: row.subject,
|
|
30
|
+
kind: row.kind,
|
|
31
|
+
target: row.target,
|
|
32
|
+
state: row.state,
|
|
33
|
+
at: row.at,
|
|
34
|
+
updatedAt: row.updatedAt,
|
|
35
|
+
...(row.reason === undefined ? {} : { reason: row.reason }),
|
|
36
|
+
unclaimed: row.state === "open" && row.noticedAt !== undefined,
|
|
37
|
+
...(row.run === undefined ? {} : { run: row.run }),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/component/views.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,wEAAwE;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM;IACN,KAAK;IACL,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,0EAA0E;IAC1E,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,UAAU,MAAM,CAAC,GAAqB;IAC1C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,GAAG;QACX,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QACxD,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3D,SAAS,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;QAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;KACnD,CAAC;AACJ,CAAC"}
|
package/dist/component/wire.d.ts
CHANGED
|
@@ -28,6 +28,20 @@ export declare const claim: import("convex/server").RegisteredMutation<"public",
|
|
|
28
28
|
prompt: string;
|
|
29
29
|
};
|
|
30
30
|
}>>;
|
|
31
|
+
/**
|
|
32
|
+
* wake:started: the agent is running, under a name people see and the
|
|
33
|
+
* session its owner resumes. A later call for the same run replaces the
|
|
34
|
+
* first (the session id of Codex and Cursor comes after they start).
|
|
35
|
+
*/
|
|
36
|
+
export declare const started: import("convex/server").RegisteredMutation<"public", {
|
|
37
|
+
id: string;
|
|
38
|
+
key: string;
|
|
39
|
+
run: {
|
|
40
|
+
name: string;
|
|
41
|
+
session?: string | undefined;
|
|
42
|
+
tool: "claude" | "codex" | "cursor";
|
|
43
|
+
};
|
|
44
|
+
}, Promise<null>>;
|
|
31
45
|
/** wake:finish: what became of a run this place claimed. */
|
|
32
46
|
export declare const finish: import("convex/server").RegisteredMutation<"public", {
|
|
33
47
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/component/wire.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/component/wire.ts"],"names":[],"mappings":"AAmCA,+EAA+E;AAC/E,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;KAkBlB,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,KAAK;;;;;;;;;QAoB0B,MAAM;;GAEhD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;;;iBA2BlB,CAAC;AAEH,4DAA4D;AAC5D,eAAO,MAAM,MAAM;;;;;iBAwBjB,CAAC"}
|
package/dist/component/wire.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { ConvexError, v } from "convex/values";
|
|
6
6
|
import { mutation, query } from "./_generated/server.js";
|
|
7
7
|
import { hashSecret, KEY_SHAPE } from "./keys.js";
|
|
8
|
-
import { target } from "./schema.js";
|
|
8
|
+
import { target, tool } from "./schema.js";
|
|
9
|
+
import { isRunReport } from "./shape.js";
|
|
9
10
|
/** Oldest first, at most this many: Wake runs two at a time. */
|
|
10
11
|
const PENDING_LIMIT = 50;
|
|
11
12
|
async function placeOf(ctx, key) {
|
|
@@ -70,6 +71,41 @@ export const claim = mutation({
|
|
|
70
71
|
return { claimed: true, run: { prompt: row.prompt } };
|
|
71
72
|
},
|
|
72
73
|
});
|
|
74
|
+
/**
|
|
75
|
+
* wake:started: the agent is running, under a name people see and the
|
|
76
|
+
* session its owner resumes. A later call for the same run replaces the
|
|
77
|
+
* first (the session id of Codex and Cursor comes after they start).
|
|
78
|
+
*/
|
|
79
|
+
export const started = mutation({
|
|
80
|
+
args: {
|
|
81
|
+
key: v.string(),
|
|
82
|
+
id: v.string(),
|
|
83
|
+
run: v.object({ name: v.string(), tool, session: v.optional(v.string()) }),
|
|
84
|
+
},
|
|
85
|
+
returns: v.null(),
|
|
86
|
+
handler: async (ctx, args) => {
|
|
87
|
+
const place = await placeOf(ctx, args.key);
|
|
88
|
+
const id = ctx.db.normalizeId("summonses", args.id);
|
|
89
|
+
const row = id ? await ctx.db.get(id) : null;
|
|
90
|
+
if (!row || row.place !== place._id || row.state !== "claimed")
|
|
91
|
+
return null;
|
|
92
|
+
if (!isRunReport(args.run))
|
|
93
|
+
return null;
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
await ctx.db.patch(row._id, {
|
|
96
|
+
run: {
|
|
97
|
+
name: args.run.name,
|
|
98
|
+
tool: args.run.tool,
|
|
99
|
+
...(args.run.session === undefined ? {} : { session: args.run.session }),
|
|
100
|
+
machine: place.machine,
|
|
101
|
+
startedAt: row.run?.startedAt ?? now,
|
|
102
|
+
},
|
|
103
|
+
updatedAt: now,
|
|
104
|
+
});
|
|
105
|
+
await ctx.db.patch(place._id, { lastSeenAt: now });
|
|
106
|
+
return null;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
73
109
|
/** wake:finish: what became of a run this place claimed. */
|
|
74
110
|
export const finish = mutation({
|
|
75
111
|
args: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/component/wire.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,0EAA0E;AAC1E,2EAA2E;AAC3E,0DAA0D;AAC1D,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAoB,QAAQ,EAAiB,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/component/wire.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,0EAA0E;AAC1E,2EAA2E;AAC3E,0DAA0D;AAC1D,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAoB,QAAQ,EAAiB,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,gEAAgE;AAChE,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,KAAK,UAAU,OAAO,CAAC,GAA2B,EAAE,GAAW;IAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE;SACvB,KAAK,CAAC,QAAQ,CAAC;SACf,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;SACzD,MAAM,EAAE,CAAC;IACZ,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;QAAE,MAAM,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM;IACN,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACf,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;IAC3B,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IAChC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE;aACtB,KAAK,CAAC,WAAW,CAAC;aAClB,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;aAClF,IAAI,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,GAAG;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,EAAE,EAAE,GAAG,CAAC,EAAE;SACX,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC,CAAC;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IACzC,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAC7E,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CACxC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM;YAC3D,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAC1B,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,KAAK,CAAC,GAAG;YAChB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IACjE,CAAC;CACF,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE;QACJ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;KAC3E;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAC1B,GAAG,EAAE;gBACH,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;gBACnB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;gBACnB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxE,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,IAAI,GAAG;aACrC;YACD,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH,4DAA4D;AAC5D,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC7B,IAAI,EAAE;QACJ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,gFAAgF;QAChF,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAC1B,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,GAAG;YACd,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/client/index.ts
CHANGED
|
@@ -120,6 +120,15 @@ export class Wake {
|
|
|
120
120
|
return await ctx.runQuery(this.component.summonses.forSubject, { subject });
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
/**
|
|
124
|
+
* What a person's agents were asked and did, newest first, without the
|
|
125
|
+
* dropped: for a runs list outside the comments. Check the caller is
|
|
126
|
+
* `owner` first; `session` in each `run` is theirs alone.
|
|
127
|
+
*/
|
|
128
|
+
async forOwner(ctx: RunQuery, o: { owner: string; scope?: string; limit?: number }) {
|
|
129
|
+
return await ctx.runQuery(this.component.runs.forOwner, o);
|
|
130
|
+
}
|
|
131
|
+
|
|
123
132
|
/** An agent's paired machines. */
|
|
124
133
|
async places(ctx: RunQuery, agent: string) {
|
|
125
134
|
return await ctx.runQuery(this.component.places.list, { agent });
|
|
@@ -145,9 +154,10 @@ export class Wake {
|
|
|
145
154
|
}
|
|
146
155
|
|
|
147
156
|
/**
|
|
148
|
-
* wake:pending, wake:claim and wake:finish, for the host's
|
|
157
|
+
* wake:pending, wake:claim, wake:started and wake:finish, for the host's
|
|
158
|
+
* `convex/wake.ts`:
|
|
149
159
|
*
|
|
150
|
-
* export const { pending, claim, finish } = exposeApi(components.wake, { app: "acme" });
|
|
160
|
+
* export const { pending, claim, started, finish } = exposeApi(components.wake, { app: "acme" });
|
|
151
161
|
*
|
|
152
162
|
* They take no auth: the place key is the credential (the spec), and the
|
|
153
163
|
* component checks it.
|
|
@@ -164,6 +174,18 @@ export function exposeApi(component: ComponentApi, options: WakeOptions) {
|
|
|
164
174
|
args: { key: v.string(), id: v.string() },
|
|
165
175
|
handler: async (ctx, args) => await ctx.runMutation(component.wire.claim, args),
|
|
166
176
|
}),
|
|
177
|
+
started: mutationGeneric({
|
|
178
|
+
args: {
|
|
179
|
+
key: v.string(),
|
|
180
|
+
id: v.string(),
|
|
181
|
+
run: v.object({
|
|
182
|
+
name: v.string(),
|
|
183
|
+
tool: v.union(v.literal("claude"), v.literal("codex"), v.literal("cursor")),
|
|
184
|
+
session: v.optional(v.string()),
|
|
185
|
+
}),
|
|
186
|
+
},
|
|
187
|
+
handler: async (ctx, args) => await ctx.runMutation(component.wire.started, args),
|
|
188
|
+
}),
|
|
167
189
|
finish: mutationGeneric({
|
|
168
190
|
args: {
|
|
169
191
|
key: v.string(),
|
|
@@ -10,9 +10,11 @@
|
|
|
10
10
|
|
|
11
11
|
import type * as keys from "../keys.js";
|
|
12
12
|
import type * as places from "../places.js";
|
|
13
|
+
import type * as runs from "../runs.js";
|
|
13
14
|
import type * as scopes from "../scopes.js";
|
|
14
15
|
import type * as shape from "../shape.js";
|
|
15
16
|
import type * as summonses from "../summonses.js";
|
|
17
|
+
import type * as views from "../views.js";
|
|
16
18
|
import type * as wire from "../wire.js";
|
|
17
19
|
|
|
18
20
|
import type {
|
|
@@ -25,9 +27,11 @@ import { anyApi, componentsGeneric } from "convex/server";
|
|
|
25
27
|
const fullApi: ApiFromModules<{
|
|
26
28
|
keys: typeof keys;
|
|
27
29
|
places: typeof places;
|
|
30
|
+
runs: typeof runs;
|
|
28
31
|
scopes: typeof scopes;
|
|
29
32
|
shape: typeof shape;
|
|
30
33
|
summonses: typeof summonses;
|
|
34
|
+
views: typeof views;
|
|
31
35
|
wire: typeof wire;
|
|
32
36
|
}> = anyApi as any;
|
|
33
37
|
|
|
@@ -91,6 +91,36 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
91
91
|
Name
|
|
92
92
|
>;
|
|
93
93
|
};
|
|
94
|
+
runs: {
|
|
95
|
+
forOwner: FunctionReference<
|
|
96
|
+
"query",
|
|
97
|
+
"internal",
|
|
98
|
+
{ limit?: number; owner: string; scope?: string },
|
|
99
|
+
Array<{
|
|
100
|
+
agent: string;
|
|
101
|
+
askedBy: string;
|
|
102
|
+
at: number;
|
|
103
|
+
id: string;
|
|
104
|
+
kind: string;
|
|
105
|
+
owner: string;
|
|
106
|
+
reason?: string;
|
|
107
|
+
run?: {
|
|
108
|
+
machine: string;
|
|
109
|
+
name: string;
|
|
110
|
+
session?: string;
|
|
111
|
+
startedAt: number;
|
|
112
|
+
tool: "claude" | "codex" | "cursor";
|
|
113
|
+
};
|
|
114
|
+
scope?: string;
|
|
115
|
+
state: "asking" | "open" | "claimed" | "done" | "failed" | "dropped";
|
|
116
|
+
subject: string;
|
|
117
|
+
target: { kind: string; ref: string; url: string };
|
|
118
|
+
unclaimed: boolean;
|
|
119
|
+
updatedAt: number;
|
|
120
|
+
}>,
|
|
121
|
+
Name
|
|
122
|
+
>;
|
|
123
|
+
};
|
|
94
124
|
scopes: {
|
|
95
125
|
deleteScope: FunctionReference<
|
|
96
126
|
"mutation",
|
|
@@ -120,7 +150,17 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
120
150
|
kind: string;
|
|
121
151
|
owner: string;
|
|
122
152
|
reason?: string;
|
|
153
|
+
run?: {
|
|
154
|
+
machine: string;
|
|
155
|
+
name: string;
|
|
156
|
+
session?: string;
|
|
157
|
+
startedAt: number;
|
|
158
|
+
tool: "claude" | "codex" | "cursor";
|
|
159
|
+
};
|
|
160
|
+
scope?: string;
|
|
123
161
|
state: "asking" | "open" | "claimed" | "done" | "failed" | "dropped";
|
|
162
|
+
subject: string;
|
|
163
|
+
target: { kind: string; ref: string; url: string };
|
|
124
164
|
unclaimed: boolean;
|
|
125
165
|
updatedAt: number;
|
|
126
166
|
}>,
|
|
@@ -193,5 +233,20 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
|
193
233
|
}>,
|
|
194
234
|
Name
|
|
195
235
|
>;
|
|
236
|
+
started: FunctionReference<
|
|
237
|
+
"mutation",
|
|
238
|
+
"internal",
|
|
239
|
+
{
|
|
240
|
+
id: string;
|
|
241
|
+
key: string;
|
|
242
|
+
run: {
|
|
243
|
+
name: string;
|
|
244
|
+
session?: string;
|
|
245
|
+
tool: "claude" | "codex" | "cursor";
|
|
246
|
+
};
|
|
247
|
+
},
|
|
248
|
+
null,
|
|
249
|
+
Name
|
|
250
|
+
>;
|
|
196
251
|
};
|
|
197
252
|
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// What a person's agents were asked and did, newest first, across every
|
|
2
|
+
// subject: for a host's own "runs" list (a top bar, later a phone), where a
|
|
3
|
+
// run's name, state and session sit outside the comment that asked.
|
|
4
|
+
import { v } from "convex/values";
|
|
5
|
+
import { query } from "./_generated/server.js";
|
|
6
|
+
import { summonsView, viewOf } from "./views.js";
|
|
7
|
+
|
|
8
|
+
const MOST = 50;
|
|
9
|
+
/** Rows read at most, so a person with many dropped or other-scope summonses costs a bounded read. */
|
|
10
|
+
const SCAN = 500;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The owner's latest summonses, newest change first, at most `limit` (50),
|
|
14
|
+
* in one scope when given. Dropped ones are left out: nothing ran. The
|
|
15
|
+
* host checks the caller is `owner` first.
|
|
16
|
+
*/
|
|
17
|
+
export const forOwner = query({
|
|
18
|
+
args: { owner: v.string(), scope: v.optional(v.string()), limit: v.optional(v.number()) },
|
|
19
|
+
returns: v.array(summonsView),
|
|
20
|
+
handler: async (ctx, args) => {
|
|
21
|
+
const limit = Math.max(1, Math.min(args.limit ?? 20, MOST));
|
|
22
|
+
const out = [];
|
|
23
|
+
const rows = await ctx.db
|
|
24
|
+
.query("summonses")
|
|
25
|
+
.withIndex("by_owner_updated", (q) => q.eq("owner", args.owner))
|
|
26
|
+
.order("desc")
|
|
27
|
+
.take(SCAN);
|
|
28
|
+
for (const row of rows) {
|
|
29
|
+
if (row.state === "dropped") continue;
|
|
30
|
+
if (args.scope !== undefined && row.scope !== args.scope) continue;
|
|
31
|
+
out.push(viewOf(row));
|
|
32
|
+
if (out.length >= limit) break;
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
},
|
|
36
|
+
});
|
package/src/component/schema.ts
CHANGED
|
@@ -14,6 +14,14 @@ export const state = v.union(
|
|
|
14
14
|
v.literal("dropped"),
|
|
15
15
|
);
|
|
16
16
|
export const target = v.object({ kind: v.string(), ref: v.string(), url: v.string() });
|
|
17
|
+
/** What `wake:started` says about a claimed summons's run. */
|
|
18
|
+
export const run = v.object({
|
|
19
|
+
name: v.string(),
|
|
20
|
+
tool,
|
|
21
|
+
session: v.optional(v.string()),
|
|
22
|
+
machine: v.string(),
|
|
23
|
+
startedAt: v.number(),
|
|
24
|
+
});
|
|
17
25
|
|
|
18
26
|
export default defineSchema({
|
|
19
27
|
// Wake on one machine, paired to one agent. Its key is kept as a hash.
|
|
@@ -71,10 +79,13 @@ export default defineSchema({
|
|
|
71
79
|
noticedAt: v.optional(v.number()),
|
|
72
80
|
place: v.optional(v.id("places")),
|
|
73
81
|
claimedAt: v.optional(v.number()),
|
|
82
|
+
/** Its run, once Wake says the agent is running (`wake:started`). */
|
|
83
|
+
run: v.optional(run),
|
|
74
84
|
finishedAt: v.optional(v.number()),
|
|
75
85
|
})
|
|
76
86
|
.index("by_subject_agent", ["subject", "agent", "state"])
|
|
77
87
|
.index("by_agent_state", ["agent", "state", "at"])
|
|
78
88
|
.index("by_owner_state", ["owner", "state", "at"])
|
|
89
|
+
.index("by_owner_updated", ["owner", "updatedAt"])
|
|
79
90
|
.index("by_scope", ["scope"]),
|
|
80
91
|
});
|
package/src/component/shape.ts
CHANGED
|
@@ -55,3 +55,11 @@ export function checkSummons(s: SummonsShape): void {
|
|
|
55
55
|
if (s.branch !== undefined && !isBranch(s.branch)) bad("branch");
|
|
56
56
|
if (s.prompt.trim() === "" || s.prompt.length > MAX_PROMPT) bad("prompt");
|
|
57
57
|
}
|
|
58
|
+
|
|
59
|
+
const RUN_NAME = /^[a-z]{1,16}-[a-z]{1,16}$/;
|
|
60
|
+
const SESSION = /^[A-Za-z0-9_-]{1,128}$/;
|
|
61
|
+
|
|
62
|
+
/** `wake:started`'s rules: a call that breaks one is ignored, not stored. */
|
|
63
|
+
export function isRunReport(r: { name: string; session?: string }): boolean {
|
|
64
|
+
return RUN_NAME.test(r.name) && (r.session === undefined || SESSION.test(r.session));
|
|
65
|
+
}
|
|
@@ -6,8 +6,9 @@ import { v } from "convex/values";
|
|
|
6
6
|
import { internal } from "./_generated/api.js";
|
|
7
7
|
import type { Doc, Id } from "./_generated/dataModel.js";
|
|
8
8
|
import { internalMutation, type MutationCtx, mutation, query } from "./_generated/server.js";
|
|
9
|
-
import {
|
|
9
|
+
import { target } from "./schema.js";
|
|
10
10
|
import { checkSummons } from "./shape.js";
|
|
11
|
+
import { summonsView, viewOf } from "./views.js";
|
|
11
12
|
|
|
12
13
|
/** The spec's "nothing has claimed it in thirty minutes". */
|
|
13
14
|
export const UNCLAIMED_MS = 30 * 60_000;
|
|
@@ -123,19 +124,6 @@ export const settle = mutation({
|
|
|
123
124
|
},
|
|
124
125
|
});
|
|
125
126
|
|
|
126
|
-
const summonsView = v.object({
|
|
127
|
-
id: v.string(),
|
|
128
|
-
agent: v.string(),
|
|
129
|
-
owner: v.string(),
|
|
130
|
-
askedBy: v.string(),
|
|
131
|
-
kind: v.string(),
|
|
132
|
-
state,
|
|
133
|
-
at: v.number(),
|
|
134
|
-
updatedAt: v.number(),
|
|
135
|
-
reason: v.optional(v.string()),
|
|
136
|
-
unclaimed: v.boolean(),
|
|
137
|
-
});
|
|
138
|
-
|
|
139
127
|
/** Each agent's latest summons about `subject`, for the host to show where it was made. */
|
|
140
128
|
export const forSubject = query({
|
|
141
129
|
args: { subject: v.string() },
|
|
@@ -150,18 +138,7 @@ export const forSubject = query({
|
|
|
150
138
|
const seen = latest.get(row.agent);
|
|
151
139
|
if (!seen || row.updatedAt > seen.updatedAt) latest.set(row.agent, row);
|
|
152
140
|
}
|
|
153
|
-
return [...latest.values()].map(
|
|
154
|
-
id: row._id,
|
|
155
|
-
agent: row.agent,
|
|
156
|
-
owner: row.owner,
|
|
157
|
-
askedBy: row.askedBy,
|
|
158
|
-
kind: row.kind,
|
|
159
|
-
state: row.state,
|
|
160
|
-
at: row.at,
|
|
161
|
-
updatedAt: row.updatedAt,
|
|
162
|
-
...(row.reason === undefined ? {} : { reason: row.reason }),
|
|
163
|
-
unclaimed: row.state === "open" && row.noticedAt !== undefined,
|
|
164
|
-
}));
|
|
141
|
+
return [...latest.values()].map(viewOf);
|
|
165
142
|
},
|
|
166
143
|
});
|
|
167
144
|
|