@onepointfour-packs/flaredeck-agent 0.1.0 → 0.2.1
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/dist/agent.d.ts +16 -0
- package/dist/agent.js +38 -1
- package/dist/agent.js.map +1 -1
- package/dist/approval.js +39 -1
- package/dist/approval.js.map +1 -1
- package/dist/browser.d.ts +19 -0
- package/dist/browser.js +261 -0
- package/dist/browser.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/desperation.d.ts +24 -0
- package/dist/desperation.js +64 -0
- package/dist/desperation.js.map +1 -0
- package/dist/engine-antigravity.d.ts +7 -0
- package/dist/engine-antigravity.js +280 -32
- package/dist/engine-antigravity.js.map +1 -1
- package/dist/engine.d.ts +28 -0
- package/dist/engine.js.map +1 -1
- package/dist/env.d.ts +5 -1
- package/dist/env.js +19 -1
- package/dist/env.js.map +1 -1
- package/dist/environment.d.ts +87 -2
- package/dist/environment.js +213 -11
- package/dist/environment.js.map +1 -1
- package/dist/flaredeck-proxy.d.ts +47 -1
- package/dist/flaredeck-proxy.js +120 -3
- package/dist/flaredeck-proxy.js.map +1 -1
- package/dist/gitguard.d.ts +6 -0
- package/dist/gitguard.js +30 -1
- package/dist/gitguard.js.map +1 -1
- package/dist/github.d.ts +23 -1
- package/dist/github.js +105 -28
- package/dist/github.js.map +1 -1
- package/dist/journal.d.ts +23 -0
- package/dist/journal.js +142 -0
- package/dist/journal.js.map +1 -0
- package/dist/localmcp.d.ts +50 -0
- package/dist/localmcp.js +229 -0
- package/dist/localmcp.js.map +1 -0
- package/dist/main.js +13 -1
- package/dist/main.js.map +1 -1
- package/dist/permissions.d.ts +17 -0
- package/dist/permissions.js +38 -1
- package/dist/permissions.js.map +1 -1
- package/dist/runs.js +3 -2
- package/dist/runs.js.map +1 -1
- package/dist/sandbox.d.ts +34 -0
- package/dist/sandbox.js +122 -2
- package/dist/sandbox.js.map +1 -1
- package/dist/schedules.d.ts +1 -1
- package/dist/schedules.js +3 -2
- package/dist/schedules.js.map +1 -1
- package/dist/serve.js +461 -39
- package/dist/serve.js.map +1 -1
- package/dist/setup.d.ts +1 -0
- package/dist/setup.js +99 -0
- package/dist/setup.js.map +1 -0
- package/dist/stream.d.ts +1 -0
- package/dist/team.d.ts +1 -1
- package/dist/team.js +3 -2
- package/dist/team.js.map +1 -1
- package/dist/ui.d.ts +2 -0
- package/dist/ui.js +34 -39
- package/dist/ui.js.map +1 -1
- package/dist/updater-python.d.ts +19 -0
- package/dist/updater-python.js +149 -0
- package/dist/updater-python.js.map +1 -0
- package/dist/workspace.d.ts +2 -0
- package/dist/workspace.js +1 -1
- package/dist/workspace.js.map +1 -1
- package/dist/worktree.d.ts +39 -1
- package/dist/worktree.js +147 -4
- package/dist/worktree.js.map +1 -1
- package/package.json +3 -2
- package/python/sidecar.py +209 -7
package/dist/agent.d.ts
CHANGED
|
@@ -16,6 +16,22 @@ import { type Decider } from './permissions.js';
|
|
|
16
16
|
* to look up — and `get-outstanding` is named explicitly so the first thing it does is find its
|
|
17
17
|
* own work rather than wait to be handed some.
|
|
18
18
|
*/
|
|
19
|
+
/**
|
|
20
|
+
* How to write, when an agent is asked to be terse.
|
|
21
|
+
*
|
|
22
|
+
* Adapted rather than copied: the original is a chat style with its own commands, and most of
|
|
23
|
+
* what an agent writes is NOT chat. A card comment, an agent note and a commit message are read
|
|
24
|
+
* later by somebody deciding whether to trust the work — those stay plain prose, which is also
|
|
25
|
+
* what the original says about anything persisted outside the conversation. What this trims is
|
|
26
|
+
* the narration: the running commentary nobody re-reads, which is billed, fills the pane and
|
|
27
|
+
* crowds the journal.
|
|
28
|
+
*/
|
|
29
|
+
export declare const TERSE_BRIEF: string;
|
|
30
|
+
/**
|
|
31
|
+
* The standing brief, built once so both engines use the same words. The Claude engine appends
|
|
32
|
+
* it to its system prompt; the Gemini engine is handed it as system_instructions.
|
|
33
|
+
*/
|
|
34
|
+
export declare function standingBrief(isLead: boolean, style?: string): string;
|
|
19
35
|
export declare const AGENT_BRIEF: string;
|
|
20
36
|
/** In-process tool sets, mounted only when the caller has a use for them. */
|
|
21
37
|
export type ToolSet = {
|
package/dist/agent.js
CHANGED
|
@@ -20,6 +20,43 @@ import { LEAD_BRIEF } from './team.js';
|
|
|
20
20
|
* to look up — and `get-outstanding` is named explicitly so the first thing it does is find its
|
|
21
21
|
* own work rather than wait to be handed some.
|
|
22
22
|
*/
|
|
23
|
+
/**
|
|
24
|
+
* How to write, when an agent is asked to be terse.
|
|
25
|
+
*
|
|
26
|
+
* Adapted rather than copied: the original is a chat style with its own commands, and most of
|
|
27
|
+
* what an agent writes is NOT chat. A card comment, an agent note and a commit message are read
|
|
28
|
+
* later by somebody deciding whether to trust the work — those stay plain prose, which is also
|
|
29
|
+
* what the original says about anything persisted outside the conversation. What this trims is
|
|
30
|
+
* the narration: the running commentary nobody re-reads, which is billed, fills the pane and
|
|
31
|
+
* crowds the journal.
|
|
32
|
+
*/
|
|
33
|
+
export const TERSE_BRIEF = [
|
|
34
|
+
'',
|
|
35
|
+
'HOW TO WRITE',
|
|
36
|
+
'',
|
|
37
|
+
'Nobody is watching this terminal, so there is nobody to be polite to. Answer first, then the',
|
|
38
|
+
'reason, then what you are doing next. No greeting, no recap, no "I will now", no',
|
|
39
|
+
'just/really/basically/simply. One idea per sentence. Short words.',
|
|
40
|
+
'',
|
|
41
|
+
'Terse is a voice, not broken grammar, and accuracy outranks brevity every time:',
|
|
42
|
+
' · never drop not, never, no, only or except — a lost negation costs more than every word saved',
|
|
43
|
+
' · code, commands, paths, numbers and error text are quoted exactly, never shortened',
|
|
44
|
+
' · a sentence with two readings gets written out in full instead',
|
|
45
|
+
'',
|
|
46
|
+
'This applies to what you SAY while working. It does not apply to anything that outlives the',
|
|
47
|
+
'turn — a card comment, an agent note, a commit message, a pull request. Those are read later',
|
|
48
|
+
'by somebody deciding whether to trust your work, and they are written as clear plain prose.',
|
|
49
|
+
'Nor does it apply when you are warning about something irreversible, or asking a question: say',
|
|
50
|
+
'those in full sentences so the answer comes back right the first time.',
|
|
51
|
+
].join('\n');
|
|
52
|
+
/**
|
|
53
|
+
* The standing brief, built once so both engines use the same words. The Claude engine appends
|
|
54
|
+
* it to its system prompt; the Gemini engine is handed it as system_instructions.
|
|
55
|
+
*/
|
|
56
|
+
export function standingBrief(isLead, style) {
|
|
57
|
+
const base = isLead ? `${AGENT_BRIEF}\n${LEAD_BRIEF}` : AGENT_BRIEF;
|
|
58
|
+
return style === 'terse' ? `${base}\n${TERSE_BRIEF}` : base;
|
|
59
|
+
}
|
|
23
60
|
export const AGENT_BRIEF = [
|
|
24
61
|
'You are a FlareDeck agent running unattended on your own machine, with your own FlareDeck',
|
|
25
62
|
'account. Nobody is watching this terminal.',
|
|
@@ -114,7 +151,7 @@ guard) {
|
|
|
114
151
|
systemPrompt: {
|
|
115
152
|
type: 'preset',
|
|
116
153
|
preset: 'claude_code',
|
|
117
|
-
append: team
|
|
154
|
+
append: standingBrief(!!team, config.style ?? process.env['FLAREDECK_AGENT_STYLE']),
|
|
118
155
|
},
|
|
119
156
|
cwd: config.repo,
|
|
120
157
|
// Run on the Claude subscription, never on metered API billing. The SDK prefers
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/approval.js
CHANGED
|
@@ -103,17 +103,55 @@ onReviewed) {
|
|
|
103
103
|
// on — the request is now with a person — so a lead's review and a person's answer are two
|
|
104
104
|
// events on one wait, not two waits.
|
|
105
105
|
let timer;
|
|
106
|
+
let lapse;
|
|
106
107
|
const final = await new Promise((resolve) => {
|
|
107
|
-
const done = (d) => {
|
|
108
|
+
const done = (d) => {
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
clearTimeout(lapse);
|
|
111
|
+
waiting.delete(token);
|
|
112
|
+
signal.removeEventListener('abort', onAbort);
|
|
113
|
+
resolve(d);
|
|
114
|
+
};
|
|
108
115
|
const onAbort = () => done(null);
|
|
116
|
+
let endorsed = false;
|
|
109
117
|
waiting.set(token, (d) => {
|
|
110
118
|
if (d.outcome === 'endorsed') {
|
|
119
|
+
endorsed = true;
|
|
120
|
+
clearTimeout(lapse);
|
|
111
121
|
onReviewed?.(d);
|
|
112
122
|
return;
|
|
113
123
|
} // keep waiting
|
|
114
124
|
done(d);
|
|
115
125
|
});
|
|
116
126
|
signal.addEventListener('abort', onAbort, { once: true });
|
|
127
|
+
/**
|
|
128
|
+
* A lead that does not answer must not hold the request to its death.
|
|
129
|
+
*
|
|
130
|
+
* Only the lead is notified while a review is pending — deliberately, so nobody approves
|
|
131
|
+
* something over the lead's head. But a lead can be a person's session rather than a
|
|
132
|
+
* daemon, running twice a day, and then "only the lead" means "nobody" until the whole
|
|
133
|
+
* request expires and the agent is refused for want of an answer it never had a chance to
|
|
134
|
+
* get. Half the window, then the people who can approve are asked as well. The lead keeps
|
|
135
|
+
* first refusal; it just stops being the only door.
|
|
136
|
+
*/
|
|
137
|
+
if (route.review_by) {
|
|
138
|
+
lapse = setTimeout(() => {
|
|
139
|
+
if (endorsed || signal.aborted)
|
|
140
|
+
return;
|
|
141
|
+
void deck
|
|
142
|
+
.comment(card, `Still waiting on a review from your lead after ${Math.round(minutes / 2)} minutes, so this is now ` +
|
|
143
|
+
`open to anyone who can approve it. The request is unchanged:\n\n**${request.description}**\n\n` +
|
|
144
|
+
`Reply \`approve ${request.request_id}\` or \`deny ${request.request_id}\`.`, {
|
|
145
|
+
request_id: request.request_id,
|
|
146
|
+
tool_name: request.tool_name,
|
|
147
|
+
description: request.description,
|
|
148
|
+
input_preview: request.input_preview,
|
|
149
|
+
expires_in_seconds: Math.round((timeoutMs / 2) / 1000),
|
|
150
|
+
...(route.approvers?.length ? { approvers: route.approvers } : {}),
|
|
151
|
+
})
|
|
152
|
+
.catch(() => { });
|
|
153
|
+
}, timeoutMs / 2);
|
|
154
|
+
}
|
|
117
155
|
timer = setTimeout(() => done(null), timeoutMs);
|
|
118
156
|
});
|
|
119
157
|
if (final) {
|
package/dist/approval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkC1C,kEAAkE;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAWlD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;AAExD,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,6FAA6F;IAC7F,MAAM,CAAC,GAAG,uDAAuD,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAuB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEvF;;;;;;GAMG;AACH,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAC7C,MAAM,QAAQ,GAAG,GAAG,EAAE,CACpB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAE5E,sEAAsE;AACtE,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;;;;;;;GAQG;AACH,MAAM,MAAM,GAAG,mJAAmJ,CAAC;AAEnK,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEnF,MAAM,SAAS,GAAG,CAAC,KAA8B,EAAU,EAAE;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnF,+FAA+F;IAC/F,4FAA4F;IAC5F,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC;IAC9C,6EAA6E;IAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,GAAG,IAAI,OAAO,IAAI,CAAC,MAAM,GAAG,aAAa,yBAAyB,IAAI,EAAE,CAAC;AAClF,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAe,EACf,IAAY,EACZ,SAAS,GAAG,mBAAmB;AAC/B,iGAAiG;AACjG,QAAsD,EAAE;AACxD,2FAA2F;AAC3F,WAAyE,GAAG,EAAE,GAAE,CAAC;AACjF,8EAA8E;AAC9E,UAAiC;IAEjC,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/C,MAAM,OAAO,GAAsB;YACjC,UAAU,EAAE,QAAQ,EAAE;YACtB,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;YACtC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC;SAChC,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;QAE/C,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,2FAA2F;YAC3F,qFAAqF;YACrF,4FAA4F;YAC5F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;gBACzF,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBAChD,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC,CAAC;YACH,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,4FAA4F;YAC5F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,MAAM,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;QACrG,CAAC;QAED,2FAA2F;QAC3F,2FAA2F;QAC3F,qCAAqC;QACrC,IAAI,KAAgD,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;YAC1D,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EnvContract } from './environment.js';
|
|
2
|
+
export declare const BROWSER_TOOL_NAMES: string[];
|
|
3
|
+
/** What this page is, independent of where it happens to be today. See the note on this module. */
|
|
4
|
+
export declare function siteIdentity(repo: string, part: string): string;
|
|
5
|
+
export type BrowserDeps = {
|
|
6
|
+
/** The repository this card is in — half of the stable identity. */
|
|
7
|
+
repo: string;
|
|
8
|
+
/** Addresses the environment reported, so the agent names a part rather than a port. */
|
|
9
|
+
endpoints: () => Record<string, string>;
|
|
10
|
+
/** Credentials the project published, so nobody types a password into a model. */
|
|
11
|
+
contract: () => EnvContract | undefined;
|
|
12
|
+
/** Where a screenshot should land so the agent can attach it to a card. */
|
|
13
|
+
cwd: string;
|
|
14
|
+
onNote: (text: string) => void;
|
|
15
|
+
};
|
|
16
|
+
export declare function browserTools(deps: BrowserDeps): {
|
|
17
|
+
server: unknown;
|
|
18
|
+
toolNames: string[];
|
|
19
|
+
};
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser testing, built in.
|
|
3
|
+
*
|
|
4
|
+
* An agent that cannot see the thing it changed writes "verified by reading the code", which is
|
|
5
|
+
* not verification. Driving a browser is the obvious answer and has always been the expensive
|
|
6
|
+
* one: installing something, finding a port, writing selectors against markup nobody wrote, and
|
|
7
|
+
* paying for a page of HTML on every look.
|
|
8
|
+
*
|
|
9
|
+
* Four decisions make it cheap:
|
|
10
|
+
*
|
|
11
|
+
* · The page is read as an ACCESSIBILITY SNAPSHOT, not as the DOM. Playwright emits a compact
|
|
12
|
+
* tree of roles and names — the same thing a screen reader would say — which is a fraction of
|
|
13
|
+
* the tokens and, more importantly, is what a person would describe. Nothing here traverses
|
|
14
|
+
* the DOM; that work was already done properly upstream.
|
|
15
|
+
* · Elements are addressed by ROLE AND NAME, never by selector. `button "Save"` is stable across
|
|
16
|
+
* a rewrite of the markup, and an agent can read it out of the snapshot it was just given.
|
|
17
|
+
* · What a session learns is written down and handed to the next one, keyed by the part of the
|
|
18
|
+
* PROJECT rather than by URL. Every worktree runs on a different port, so a URL-keyed memory
|
|
19
|
+
* is empty on every card; `HrGoat/ui` is the same place on Tuesday as it was on Monday.
|
|
20
|
+
* · The signed-in session is saved the same way, so the second card does not sign in at all.
|
|
21
|
+
*
|
|
22
|
+
* The agent supplies the judgement — what to look at, whether it is right. This supplies the eyes
|
|
23
|
+
* and hands, and remembers.
|
|
24
|
+
*/
|
|
25
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
26
|
+
import { dirname, join } from 'node:path';
|
|
27
|
+
import { z } from 'zod';
|
|
28
|
+
import { tool } from '@anthropic-ai/claude-agent-sdk';
|
|
29
|
+
import { sdkServer } from './localmcp.js';
|
|
30
|
+
import { configDir } from './config.js';
|
|
31
|
+
export const BROWSER_TOOL_NAMES = [
|
|
32
|
+
'mcp__browser__open_page',
|
|
33
|
+
'mcp__browser__look',
|
|
34
|
+
'mcp__browser__click',
|
|
35
|
+
'mcp__browser__fill',
|
|
36
|
+
'mcp__browser__screenshot',
|
|
37
|
+
'mcp__browser__remember',
|
|
38
|
+
];
|
|
39
|
+
/** How much of a snapshot is worth sending. A page that needs more than this needs narrowing. */
|
|
40
|
+
const SNAPSHOT_CAP = 6000;
|
|
41
|
+
const memoryDir = () => {
|
|
42
|
+
const d = join(configDir(), 'browser');
|
|
43
|
+
try {
|
|
44
|
+
mkdirSync(d, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
catch { /* reported where it is used */ }
|
|
47
|
+
return d;
|
|
48
|
+
};
|
|
49
|
+
const safe = (s) => s.replace(/[^A-Za-z0-9._-]/g, '_');
|
|
50
|
+
const memoryFile = (site) => join(memoryDir(), `${safe(site)}.json`);
|
|
51
|
+
const sessionFile = (site) => join(memoryDir(), `${safe(site)}.session.json`);
|
|
52
|
+
function loadMemory(site) {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(readFileSync(memoryFile(site), 'utf8'));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { recipes: {} };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function saveMemory(site, m) {
|
|
61
|
+
try {
|
|
62
|
+
writeFileSync(memoryFile(site), JSON.stringify(m, null, 2));
|
|
63
|
+
}
|
|
64
|
+
catch { /* not worth failing for */ }
|
|
65
|
+
}
|
|
66
|
+
/** What this page is, independent of where it happens to be today. See the note on this module. */
|
|
67
|
+
export function siteIdentity(repo, part) {
|
|
68
|
+
return `${repo.split('/').pop() || repo}/${part || 'ui'}`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fetch the browser Playwright expects. Once per machine, and never asked of the agent: an
|
|
72
|
+
* instruction to run an installer is setup, and the point of this is that there is none.
|
|
73
|
+
*/
|
|
74
|
+
async function installChromium() {
|
|
75
|
+
const { execFile } = await import('node:child_process');
|
|
76
|
+
const { fileURLToPath } = await import('node:url');
|
|
77
|
+
const cli = join(dirname(fileURLToPath(import.meta.url)), '..', 'node_modules', 'playwright-core', 'cli.js');
|
|
78
|
+
if (!existsSync(cli))
|
|
79
|
+
return false;
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
execFile(process.execPath, [cli, 'install', 'chromium-headless-shell'], { timeout: 10 * 60_000 }, (err) => resolve(!err));
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export function browserTools(deps) {
|
|
85
|
+
let live = null;
|
|
86
|
+
const closeQuietly = async () => {
|
|
87
|
+
try {
|
|
88
|
+
await live?.browser?.close();
|
|
89
|
+
}
|
|
90
|
+
catch { /* going away anyway */ }
|
|
91
|
+
live = null;
|
|
92
|
+
};
|
|
93
|
+
const say = (text, isError = false) => ({
|
|
94
|
+
content: [{ type: 'text', text }],
|
|
95
|
+
...(isError ? { isError: true } : {}),
|
|
96
|
+
});
|
|
97
|
+
/** The snapshot, trimmed. Everything an agent needs to act is a role and a name. */
|
|
98
|
+
const describe = async (page) => {
|
|
99
|
+
let tree = '';
|
|
100
|
+
try {
|
|
101
|
+
tree = await page.locator('body').ariaSnapshot({ timeout: 5000 });
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
return `(could not read the page: ${e instanceof Error ? e.message : String(e)})`;
|
|
105
|
+
}
|
|
106
|
+
return tree.length > SNAPSHOT_CAP
|
|
107
|
+
? `${tree.slice(0, SNAPSHOT_CAP)}\n… (trimmed — narrow what you are looking at)`
|
|
108
|
+
: tree;
|
|
109
|
+
};
|
|
110
|
+
const needPage = () => {
|
|
111
|
+
if (!live)
|
|
112
|
+
throw new Error('No page is open. Call open_page first.');
|
|
113
|
+
return live;
|
|
114
|
+
};
|
|
115
|
+
const server = sdkServer({
|
|
116
|
+
name: 'browser',
|
|
117
|
+
version: '1.0.0',
|
|
118
|
+
tools: [
|
|
119
|
+
tool('open_page', 'Open a page in a real browser against THIS card\'s own environment. Name a part the ' +
|
|
120
|
+
'environment reported (for example "ui") rather than a port — several worktrees run at ' +
|
|
121
|
+
'once and the ports differ. Returns what is on the page, and anything earlier sessions ' +
|
|
122
|
+
'learned about this project.', {
|
|
123
|
+
part: z.string().optional().describe('Which part of the environment, e.g. "ui". Defaults to the first one.'),
|
|
124
|
+
path: z.string().optional().describe('A path on that part, e.g. "/admin/learning".'),
|
|
125
|
+
}, async (args) => {
|
|
126
|
+
const { part, path } = args;
|
|
127
|
+
const ends = deps.endpoints();
|
|
128
|
+
const name = part || (ends['ui'] ? 'ui' : Object.keys(ends)[0] ?? '');
|
|
129
|
+
const base = ends[name];
|
|
130
|
+
if (!base) {
|
|
131
|
+
return say(`This environment reported no part called "${name}". It has: ` +
|
|
132
|
+
`${Object.keys(ends).join(', ') || '(nothing — the project is not running)'}.`, true);
|
|
133
|
+
}
|
|
134
|
+
const site = siteIdentity(deps.repo, name);
|
|
135
|
+
const memory = loadMemory(site);
|
|
136
|
+
await closeQuietly();
|
|
137
|
+
const { chromium } = await import('playwright-core');
|
|
138
|
+
let browser;
|
|
139
|
+
try {
|
|
140
|
+
browser = await chromium.launch({ headless: true });
|
|
141
|
+
}
|
|
142
|
+
catch (first) {
|
|
143
|
+
// No browser on this machine yet, or Playwright moved to a newer build than the one
|
|
144
|
+
// cached. Fetch it rather than telling the agent to — "zero setup" means the agent
|
|
145
|
+
// never installs anything, and an instruction to run an installer is setup.
|
|
146
|
+
if (!/executable doesn't exist|please run.*install/i.test(String(first))) {
|
|
147
|
+
return say(`Could not start a browser: ${first instanceof Error ? first.message : String(first)}`, true);
|
|
148
|
+
}
|
|
149
|
+
deps.onNote('browser: fetching Chromium (first use on this machine)');
|
|
150
|
+
const ok = await installChromium();
|
|
151
|
+
if (!ok) {
|
|
152
|
+
return say('This machine has no browser and it could not be fetched. Say so on the card — ' +
|
|
153
|
+
'do not try to install anything yourself.', true);
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
browser = await chromium.launch({ headless: true });
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
return say(`Browser still will not start: ${e instanceof Error ? e.message : String(e)}`, true);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// A session saved by an earlier card, so this one does not sign in again.
|
|
163
|
+
const saved = existsSync(sessionFile(site)) ? sessionFile(site) : undefined;
|
|
164
|
+
const context = await browser.newContext(saved ? { storageState: saved } : {});
|
|
165
|
+
const page = await context.newPage();
|
|
166
|
+
const url = `${base.replace(/\/+$/, '')}${path ? (path.startsWith('/') ? path : `/${path}`) : ''}`;
|
|
167
|
+
try {
|
|
168
|
+
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30_000 });
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
await closeQuietly();
|
|
172
|
+
return say(`Could not open ${url}: ${e instanceof Error ? e.message : String(e)}`, true);
|
|
173
|
+
}
|
|
174
|
+
live = { browser, context, page, site };
|
|
175
|
+
deps.onNote(`browser: ${url}${saved ? ' (signed in from an earlier session)' : ''}`);
|
|
176
|
+
const creds = Object.entries(deps.contract()?.credentials ?? {})
|
|
177
|
+
.map(([who, v]) => typeof v === 'string' ? ` · ${who}: ${v}` : ` · ${who}: ${v.username ?? ''} / ${v.password ?? ''}`)
|
|
178
|
+
.join('\n');
|
|
179
|
+
const learned = Object.entries(memory.recipes)
|
|
180
|
+
.map(([about, how]) => ` · ${about}: ${how}`).join('\n');
|
|
181
|
+
return say(`Open at ${url}${saved ? ', already signed in from an earlier session' : ''}.\n\n` +
|
|
182
|
+
`${await describe(page)}\n` +
|
|
183
|
+
(learned ? `\nWhat earlier sessions learned about ${site}:\n${learned}\n` : '') +
|
|
184
|
+
(!saved && creds ? `\nSign-ins this project published:\n${creds}\n` : ''));
|
|
185
|
+
}),
|
|
186
|
+
tool('look', 'What is on the page now. Use after an action to see what changed.', {}, async () => say(await describe(needPage().page))),
|
|
187
|
+
tool('click', 'Click something by what it IS, as the page describes it — a role and its name, taken ' +
|
|
188
|
+
'from the snapshot you were given. Never a CSS selector.', {
|
|
189
|
+
role: z.string().describe('The role, e.g. "button", "link", "checkbox".'),
|
|
190
|
+
name: z.string().describe('Its accessible name, e.g. "Save", exactly as the snapshot shows it.'),
|
|
191
|
+
}, async (args) => {
|
|
192
|
+
const { role, name } = args;
|
|
193
|
+
const { page } = needPage();
|
|
194
|
+
try {
|
|
195
|
+
await page.getByRole(role, { name, exact: false }).first().click({ timeout: 10_000 });
|
|
196
|
+
}
|
|
197
|
+
catch (e) {
|
|
198
|
+
return say(`Could not click ${role} "${name}": ${e instanceof Error ? e.message.split('\n')[0] : String(e)}\n\n` +
|
|
199
|
+
`What is actually on the page:\n${await describe(page)}`, true);
|
|
200
|
+
}
|
|
201
|
+
await page.waitForLoadState('domcontentloaded', { timeout: 10_000 }).catch(() => { });
|
|
202
|
+
return say(`Clicked ${role} "${name}".\n\n${await describe(page)}`);
|
|
203
|
+
}),
|
|
204
|
+
tool('fill', 'Type into a field, named the way the page describes it.', {
|
|
205
|
+
name: z.string().describe('The field\'s label or accessible name.'),
|
|
206
|
+
text: z.string().describe('What to type.'),
|
|
207
|
+
}, async (args) => {
|
|
208
|
+
const { name, text } = args;
|
|
209
|
+
const { page } = needPage();
|
|
210
|
+
try {
|
|
211
|
+
await page.getByLabel(name, { exact: false }).first().fill(text, { timeout: 10_000 });
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
try {
|
|
215
|
+
await page.getByRole('textbox', { name, exact: false }).first().fill(text, { timeout: 10_000 });
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
return say(`Could not fill "${name}": ${e instanceof Error ? e.message.split('\n')[0] : String(e)}\n\n` +
|
|
219
|
+
`What is actually on the page:\n${await describe(page)}`, true);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return say(`Typed into "${name}".`);
|
|
223
|
+
}),
|
|
224
|
+
tool('screenshot', 'Take a picture of the page, saved in your checkout so you can attach it to the card. ' +
|
|
225
|
+
'Use this when a card asks for evidence of something visual.', { name: z.string().describe('A short file name, e.g. "region-one-person".') }, async (args) => {
|
|
226
|
+
const { page } = needPage();
|
|
227
|
+
const file = join(deps.cwd, `${safe(String(args.name))}.png`);
|
|
228
|
+
try {
|
|
229
|
+
await page.screenshot({ path: file, fullPage: true });
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
return say(`Could not take it: ${e instanceof Error ? e.message : String(e)}`, true);
|
|
233
|
+
}
|
|
234
|
+
return say(`Saved ${file}. Attach it to the card with add-card-attachment.`);
|
|
235
|
+
}),
|
|
236
|
+
tool('remember', 'Write down something you worked out about this project that the next session would ' +
|
|
237
|
+
'otherwise work out again — how to sign in, where a screen lives, what a control is ' +
|
|
238
|
+
'called. Kept per project, not per card, so it survives this worktree.', {
|
|
239
|
+
about: z.string().describe('What it is about, e.g. "sign in" or "learning setup guide".'),
|
|
240
|
+
how: z.string().describe('What you learned, in a line.'),
|
|
241
|
+
}, async (args) => {
|
|
242
|
+
const { about, how } = args;
|
|
243
|
+
const site = live?.site ?? siteIdentity(deps.repo, 'ui');
|
|
244
|
+
const memory = loadMemory(site);
|
|
245
|
+
memory.recipes[about.trim().toLowerCase()] = how.trim();
|
|
246
|
+
saveMemory(site, memory);
|
|
247
|
+
// Signed in once, signed in for every card after this.
|
|
248
|
+
if (live) {
|
|
249
|
+
try {
|
|
250
|
+
await live.context.storageState({ path: sessionFile(site) });
|
|
251
|
+
}
|
|
252
|
+
catch { /* best effort */ }
|
|
253
|
+
}
|
|
254
|
+
deps.onNote(`browser: remembered "${about.trim()}" for ${site}`);
|
|
255
|
+
return say(`Noted against ${site}. The next session on this project gets it.`);
|
|
256
|
+
}),
|
|
257
|
+
],
|
|
258
|
+
});
|
|
259
|
+
return { server, toolNames: BROWSER_TOOL_NAMES };
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -19,6 +19,17 @@ export type Config = {
|
|
|
19
19
|
* folder grants nothing — and empty or absent means every repo found there.
|
|
20
20
|
*/
|
|
21
21
|
repos?: string[];
|
|
22
|
+
/**
|
|
23
|
+
* Git-ignored files a project needs in order to RUN, carried into each card's worktree.
|
|
24
|
+
*
|
|
25
|
+
* A worktree holds tracked files only, so a local .env or a hand-written start script for this
|
|
26
|
+
* machine is simply absent from it — and a project that needs one cannot start there. Paths are
|
|
27
|
+
* relative to the checkout.
|
|
28
|
+
*
|
|
29
|
+
* Machine-local on purpose: these files are local to this box, so the list of them would be
|
|
30
|
+
* wrong in the repository, where it would apply to everyone else's.
|
|
31
|
+
*/
|
|
32
|
+
worktreeLocalFiles?: string[];
|
|
22
33
|
/**
|
|
23
34
|
* Which model actually runs a turn. Per-repo, so one machine can run some agents on Claude and
|
|
24
35
|
* some on Gemini and compare them on the same board. `FLAREDECK_AGENT_ENGINE` overrides it for
|
|
@@ -26,6 +37,12 @@ export type Config = {
|
|
|
26
37
|
* back. Absent means claude.
|
|
27
38
|
*/
|
|
28
39
|
engine?: 'claude' | 'antigravity';
|
|
40
|
+
/**
|
|
41
|
+
* How the agent WRITES. 'terse' strips ceremony from its narration — an unattended agent has
|
|
42
|
+
* nobody to be polite to, and every word is billed and read. Absent means its normal voice.
|
|
43
|
+
* `FLAREDECK_AGENT_STYLE` overrides it for one run.
|
|
44
|
+
*/
|
|
45
|
+
style?: 'terse';
|
|
29
46
|
/** MCP server name registered with the Claude CLI — also the `mcp__<name>__` tool prefix. */
|
|
30
47
|
mcpServerName: string;
|
|
31
48
|
mcpUrl: string;
|
|
@@ -86,6 +103,7 @@ export declare const DEFAULTS: {
|
|
|
86
103
|
readonly mcpUrl: "https://mcp.flaredeck.app/mcp";
|
|
87
104
|
readonly agentServiceUrl: "https://flaredeck-agent-861259873190.us-central1.run.app";
|
|
88
105
|
};
|
|
106
|
+
export declare const configDir: () => string;
|
|
89
107
|
/**
|
|
90
108
|
* Config per REPO, not per machine.
|
|
91
109
|
*
|
package/dist/config.js
CHANGED
|
@@ -6,7 +6,7 @@ export const DEFAULTS = {
|
|
|
6
6
|
mcpUrl: 'https://mcp.flaredeck.app/mcp',
|
|
7
7
|
agentServiceUrl: 'https://flaredeck-agent-861259873190.us-central1.run.app',
|
|
8
8
|
};
|
|
9
|
-
const configDir = () => join(process.env['XDG_CONFIG_HOME'] || join(homedir(), '.config'), 'flaredeck-agent');
|
|
9
|
+
export const configDir = () => join(process.env['XDG_CONFIG_HOME'] || join(homedir(), '.config'), 'flaredeck-agent');
|
|
10
10
|
/** A readable, collision-free file name for a checkout path. */
|
|
11
11
|
const slug = (repo) => repo.replace(/\/+$/, '').replace(/[^\w.-]+/g, '-').replace(/^-+/, '').slice(-90) || 'default';
|
|
12
12
|
/**
|
|
@@ -28,6 +28,7 @@ export function loadConfig(repo = process.cwd()) {
|
|
|
28
28
|
return {
|
|
29
29
|
repo: raw.repo ?? process.cwd(),
|
|
30
30
|
...(raw.repos?.length ? { repos: raw.repos } : {}),
|
|
31
|
+
...(raw.worktreeLocalFiles?.length ? { worktreeLocalFiles: raw.worktreeLocalFiles } : {}),
|
|
31
32
|
mcpServerName: raw.mcpServerName ?? DEFAULTS.mcpServerName,
|
|
32
33
|
mcpUrl: raw.mcpUrl ?? DEFAULTS.mcpUrl,
|
|
33
34
|
...(raw.tenantId ? { tenantId: raw.tenantId } : {}),
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noticing when an agent has stopped working and started struggling.
|
|
3
|
+
*
|
|
4
|
+
* A turn went: refused for reading outside its workspace, so it read the same place through
|
|
5
|
+
* `node -e` instead; refused for `git push`, so it looked for `push_branch` on PATH, then as a
|
|
6
|
+
* git alias, then under every parent directory. None of that was the work. It was an agent
|
|
7
|
+
* routing around the harness because the harness had told it to do something it could not do —
|
|
8
|
+
* and it would have carried on until the turn ran out.
|
|
9
|
+
*
|
|
10
|
+
* The harness can see this without a model. It knows every refusal and every command. Three
|
|
11
|
+
* refusals in one turn, or the same command four times, is not a bad patch of luck: it is an
|
|
12
|
+
* agent that needs to stop and say so. Its job is meant to be easy — change the code, check the
|
|
13
|
+
* change. Anything else is the harness's problem to fix, not the agent's to work around.
|
|
14
|
+
*/
|
|
15
|
+
/** Said to the agent when it has clearly started fighting the tools. */
|
|
16
|
+
export declare const STEP_BACK: string;
|
|
17
|
+
export type Watcher = {
|
|
18
|
+
/** Feed every tool line. Returns what to tell the agent, once, when it has gone far enough. */
|
|
19
|
+
saw: (line: string) => string | null;
|
|
20
|
+
/** True once it has been told — the caller stops the turn if it keeps going. */
|
|
21
|
+
warned: () => boolean;
|
|
22
|
+
refusals: () => number;
|
|
23
|
+
};
|
|
24
|
+
export declare function watchForDesperation(refusalsAllowed?: number, repeatsAllowed?: number): Watcher;
|