patchwork-os 0.2.0-beta.8.canary.73 → 0.2.0-beta.8.canary.74
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.
|
@@ -22,11 +22,24 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import type { Recipe } from "./schema.js";
|
|
24
24
|
/**
|
|
25
|
-
* Tool-
|
|
25
|
+
* Tool-namespace → connector id (matching the IDs returned by
|
|
26
26
|
* `/connections` — see src/connectors/gmail.ts handleConnectionsList).
|
|
27
27
|
* Both `google-calendar` and the dashboard's `googleCalendar` spelling
|
|
28
28
|
* are accepted on the caller side; this map is authoritative for the
|
|
29
29
|
* bridge.
|
|
30
|
+
*
|
|
31
|
+
* Keys are BARE namespace names (no separator). The matcher accepts BOTH
|
|
32
|
+
* dot-form (`slack.post_message`) and underscore-form (`slack_post_message`)
|
|
33
|
+
* tool IDs. Real registry tools use dot-form
|
|
34
|
+
* (e.g. `src/recipes/tools/slack.ts` registers `slack.post_message`); the
|
|
35
|
+
* previous map keyed by `slack_` etc. silently failed every YAML recipe
|
|
36
|
+
* install because `tool.startsWith("slack_")` never matched `slack.post_message`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const TOOL_NAMESPACE_TO_CONNECTOR: Record<string, string>;
|
|
39
|
+
/**
|
|
40
|
+
* @deprecated Use `TOOL_NAMESPACE_TO_CONNECTOR` instead. Kept as a thin
|
|
41
|
+
* alias derived from the canonical map so legacy callers (and the
|
|
42
|
+
* underscore-suffix tool-name shape) keep working until they migrate.
|
|
30
43
|
*/
|
|
31
44
|
export declare const TOOL_PREFIX_TO_CONNECTOR: Record<string, string>;
|
|
32
45
|
/**
|
|
@@ -1,31 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tool-
|
|
2
|
+
* Tool-namespace → connector id (matching the IDs returned by
|
|
3
3
|
* `/connections` — see src/connectors/gmail.ts handleConnectionsList).
|
|
4
4
|
* Both `google-calendar` and the dashboard's `googleCalendar` spelling
|
|
5
5
|
* are accepted on the caller side; this map is authoritative for the
|
|
6
6
|
* bridge.
|
|
7
|
+
*
|
|
8
|
+
* Keys are BARE namespace names (no separator). The matcher accepts BOTH
|
|
9
|
+
* dot-form (`slack.post_message`) and underscore-form (`slack_post_message`)
|
|
10
|
+
* tool IDs. Real registry tools use dot-form
|
|
11
|
+
* (e.g. `src/recipes/tools/slack.ts` registers `slack.post_message`); the
|
|
12
|
+
* previous map keyed by `slack_` etc. silently failed every YAML recipe
|
|
13
|
+
* install because `tool.startsWith("slack_")` never matched `slack.post_message`.
|
|
7
14
|
*/
|
|
8
|
-
export const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
15
|
+
export const TOOL_NAMESPACE_TO_CONNECTOR = {
|
|
16
|
+
slack: "slack",
|
|
17
|
+
github: "github",
|
|
18
|
+
jira: "jira",
|
|
19
|
+
linear: "linear",
|
|
20
|
+
gmail: "gmail",
|
|
21
|
+
calendar: "google-calendar",
|
|
22
|
+
drive: "google-drive",
|
|
23
|
+
intercom: "intercom",
|
|
24
|
+
hubspot: "hubspot",
|
|
25
|
+
datadog: "datadog",
|
|
26
|
+
stripe: "stripe",
|
|
27
|
+
sentry: "sentry",
|
|
28
|
+
zendesk: "zendesk",
|
|
29
|
+
asana: "asana",
|
|
30
|
+
notion: "notion",
|
|
31
|
+
confluence: "confluence",
|
|
32
|
+
discord: "discord",
|
|
33
|
+
gitlab: "gitlab",
|
|
34
|
+
pagerduty: "pagerduty",
|
|
28
35
|
};
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated Use `TOOL_NAMESPACE_TO_CONNECTOR` instead. Kept as a thin
|
|
38
|
+
* alias derived from the canonical map so legacy callers (and the
|
|
39
|
+
* underscore-suffix tool-name shape) keep working until they migrate.
|
|
40
|
+
*/
|
|
41
|
+
export const TOOL_PREFIX_TO_CONNECTOR = Object.fromEntries(Object.entries(TOOL_NAMESPACE_TO_CONNECTOR).map(([ns, connector]) => [
|
|
42
|
+
`${ns}_`,
|
|
43
|
+
connector,
|
|
44
|
+
]));
|
|
45
|
+
/**
|
|
46
|
+
* Extract the namespace prefix from a registered tool ID. Tool IDs land
|
|
47
|
+
* in either `namespace.tool_name` (the canonical dot-form used by every
|
|
48
|
+
* registry entry today — see `src/recipes/tools/*.ts`) or the older
|
|
49
|
+
* `namespace_tool_name` underscore-form some tests use. Either form
|
|
50
|
+
* resolves to the bare namespace, lowercased.
|
|
51
|
+
*/
|
|
52
|
+
function extractNamespace(toolId) {
|
|
53
|
+
const m = toolId.match(/^([a-z][a-z0-9-]*)[_.]/i);
|
|
54
|
+
return m?.[1]?.toLowerCase();
|
|
55
|
+
}
|
|
29
56
|
function toolsOfStep(step) {
|
|
30
57
|
// agent: false steps carry a single `tool` field. agent: true steps
|
|
31
58
|
// optionally list permitted tools in `tools[]`. Other shapes (nested
|
|
@@ -44,13 +71,8 @@ function toolsOfStep(step) {
|
|
|
44
71
|
* source map is small and stable, so caching this avoids regex churn
|
|
45
72
|
* inside the per-step loop.
|
|
46
73
|
*/
|
|
47
|
-
const PROMPT_PREFIX_PATTERNS = Object.entries(
|
|
48
|
-
|
|
49
|
-
// `slack_post_message` the underscore is part of the literal we look
|
|
50
|
-
// for, but when an agent prompt is more conversational ("post to slack
|
|
51
|
-
// using slack.post_message"), we want to match the prefix without the
|
|
52
|
-
// separator too.
|
|
53
|
-
prefix: prefix.replace(/_$/, ""),
|
|
74
|
+
const PROMPT_PREFIX_PATTERNS = Object.entries(TOOL_NAMESPACE_TO_CONNECTOR).map(([prefix, connector]) => ({
|
|
75
|
+
prefix,
|
|
54
76
|
connector,
|
|
55
77
|
}));
|
|
56
78
|
/**
|
|
@@ -100,11 +122,15 @@ export function detectRequiredConnectors(recipe) {
|
|
|
100
122
|
const required = new Set();
|
|
101
123
|
for (const step of recipe.steps) {
|
|
102
124
|
// Explicit `tool` / `tools[]` fields (canonical detection path).
|
|
125
|
+
// Pull the namespace out of the tool ID — works for both dot-form
|
|
126
|
+
// (the registry's canonical `slack.post_message`) and the legacy
|
|
127
|
+
// underscore-form some tests use (`slack_post_message`).
|
|
103
128
|
for (const tool of toolsOfStep(step)) {
|
|
104
|
-
|
|
105
|
-
|
|
129
|
+
const ns = extractNamespace(tool);
|
|
130
|
+
if (ns) {
|
|
131
|
+
const connector = TOOL_NAMESPACE_TO_CONNECTOR[ns];
|
|
132
|
+
if (connector)
|
|
106
133
|
required.add(connector);
|
|
107
|
-
}
|
|
108
134
|
}
|
|
109
135
|
}
|
|
110
136
|
// Prompt body scan for agent-mode steps — catches recipes that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectorPreflight.js","sourceRoot":"","sources":["../../src/recipes/connectorPreflight.ts"],"names":[],"mappings":"AAwBA
|
|
1
|
+
{"version":3,"file":"connectorPreflight.js","sourceRoot":"","sources":["../../src/recipes/connectorPreflight.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "patchwork-os",
|
|
3
|
-
"version": "0.2.0-beta.8.canary.
|
|
3
|
+
"version": "0.2.0-beta.8.canary.74",
|
|
4
4
|
"description": "Your personal AI runtime, local-first. Patchwork OS gives any AI model a consistent set of tools, YAML recipes, a delegation policy with approval queue, and a durable trace memory — all on your machine, all under your policy.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|