@crowdedkingdoms/crowdy-dsh 0.2.0-dev.1 → 0.2.0-dev.2
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/THIRD_PARTY_NOTICES.md +226 -0
- package/dist/dsh-web/BUILD.json +3 -3
- package/dist/dsh-web/preview/vfs-image.tar.gz +0 -0
- package/lib/attachments/crowdy-attachment-store.js +200 -0
- package/lib/attachments/crowdy-attachment-store.js.map +1 -0
- package/lib/bridge/client.js +161 -0
- package/lib/bridge/client.js.map +1 -0
- package/lib/bridge/index.js +155 -0
- package/lib/bridge/index.js.map +1 -0
- package/lib/bridge/protocol.js +30 -0
- package/lib/bridge/protocol.js.map +1 -0
- package/lib/crowdy/client.js +247 -0
- package/lib/crowdy/client.js.map +1 -0
- package/lib/crowdy/config.js +95 -0
- package/lib/crowdy/config.js.map +1 -0
- package/lib/crowdy/github-layout.js +97 -0
- package/lib/crowdy/github-layout.js.map +1 -0
- package/lib/crowdy/paths.js +145 -0
- package/lib/crowdy/paths.js.map +1 -0
- package/lib/crowdy/project-store.js +223 -0
- package/lib/crowdy/project-store.js.map +1 -0
- package/lib/fs/crowdy-file-system.js +621 -0
- package/lib/fs/crowdy-file-system.js.map +1 -0
- package/lib/fs/scratch-store.js +61 -0
- package/lib/fs/scratch-store.js.map +1 -0
- package/lib/index.js +15 -0
- package/lib/index.js.map +1 -0
- package/lib/persist/index.js +199 -0
- package/lib/persist/index.js.map +1 -0
- package/lib/scripts/probe.js +59 -0
- package/lib/scripts/probe.js.map +1 -0
- package/lib/sdk-index/catalog.js +237 -0
- package/lib/sdk-index/catalog.js.map +1 -0
- package/lib/sdk-index/index.js +10 -0
- package/lib/sdk-index/index.js.map +1 -0
- package/lib/sdk-index/parse-sdk.js +131 -0
- package/lib/sdk-index/parse-sdk.js.map +1 -0
- package/lib/sdk-index/plugin.js +90 -0
- package/lib/sdk-index/plugin.js.map +1 -0
- package/lib/sdk-index/snapshot.js +215 -0
- package/lib/sdk-index/snapshot.js.map +1 -0
- package/lib/search/glob-match.js +114 -0
- package/lib/search/glob-match.js.map +1 -0
- package/lib/search/search-tools.js +414 -0
- package/lib/search/search-tools.js.map +1 -0
- package/lib/tools/index.js +344 -0
- package/lib/tools/index.js.map +1 -0
- package/lib/types/attachments/crowdy-attachment-store.d.ts +45 -0
- package/lib/types/attachments/crowdy-attachment-store.d.ts.map +1 -0
- package/lib/types/attachments/crowdy-attachment-store.test.d.ts.map +1 -0
- package/lib/types/bridge/client.d.ts +57 -0
- package/lib/types/bridge/client.d.ts.map +1 -0
- package/lib/types/bridge/client.test.d.ts.map +1 -0
- package/lib/types/bridge/index.d.ts +66 -0
- package/lib/types/bridge/index.d.ts.map +1 -0
- package/lib/types/bridge/protocol.d.ts +242 -0
- package/lib/types/bridge/protocol.d.ts.map +1 -0
- package/lib/types/crowdy/client.d.ts +126 -0
- package/lib/types/crowdy/client.d.ts.map +1 -0
- package/lib/types/crowdy/client.test.d.ts.map +1 -0
- package/lib/types/crowdy/config.d.ts +60 -0
- package/lib/types/crowdy/config.d.ts.map +1 -0
- package/lib/types/crowdy/github-layout.d.ts +36 -0
- package/lib/types/crowdy/github-layout.d.ts.map +1 -0
- package/lib/types/crowdy/paths.d.ts +89 -0
- package/lib/types/crowdy/paths.d.ts.map +1 -0
- package/lib/types/crowdy/project-store.d.ts +84 -0
- package/lib/types/crowdy/project-store.d.ts.map +1 -0
- package/lib/types/crowdy/project-store.test.d.ts.map +1 -0
- package/lib/types/fs/crowdy-file-system.d.ts +173 -0
- package/lib/types/fs/crowdy-file-system.d.ts.map +1 -0
- package/lib/types/fs/crowdy-file-system.test.d.ts.map +1 -0
- package/lib/types/fs/scratch-store.d.ts +31 -0
- package/lib/types/fs/scratch-store.d.ts.map +1 -0
- package/lib/types/index.d.ts +19 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/persist/index.d.ts +85 -0
- package/lib/types/persist/index.d.ts.map +1 -0
- package/lib/types/scripts/probe.d.ts +9 -0
- package/lib/types/scripts/probe.d.ts.map +1 -0
- package/lib/types/sdk-index/catalog.d.ts +39 -0
- package/lib/types/sdk-index/catalog.d.ts.map +1 -0
- package/lib/types/sdk-index/catalog.test.d.ts.map +1 -0
- package/lib/types/sdk-index/index.d.ts +13 -0
- package/lib/types/sdk-index/index.d.ts.map +1 -0
- package/lib/types/sdk-index/parse-sdk.d.ts +25 -0
- package/lib/types/sdk-index/parse-sdk.d.ts.map +1 -0
- package/lib/types/sdk-index/plugin.d.ts +26 -0
- package/lib/types/sdk-index/plugin.d.ts.map +1 -0
- package/lib/types/sdk-index/snapshot.d.ts +11 -0
- package/lib/types/sdk-index/snapshot.d.ts.map +1 -0
- package/lib/types/search/glob-match.d.ts +31 -0
- package/lib/types/search/glob-match.d.ts.map +1 -0
- package/lib/types/search/glob-match.test.d.ts.map +1 -0
- package/lib/types/search/search-tools.d.ts +81 -0
- package/lib/types/search/search-tools.d.ts.map +1 -0
- package/lib/types/search/search-tools.test.d.ts.map +1 -0
- package/lib/types/tools/index.d.ts +27 -0
- package/lib/types/tools/index.d.ts.map +1 -0
- package/lib/types/vendor/crowdyjs-sdk.d.ts +17 -0
- package/lib/types/vendor/crowdyjs-sdk.d.ts.map +1 -0
- package/lib/vendor/crowdyjs-sdk.js +18338 -0
- package/lib/vendor/crowdyjs-sdk.js.map +1 -0
- package/lib/vendor/crowdyjs-sdk.version.json +5 -0
- package/package.json +151 -38
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull public `pub fn` entries out of `crowdy-compute-sdk` source.
|
|
3
|
+
*
|
|
4
|
+
* The crate is one file. Crate-root helpers (`log`, `state_get`, …) live
|
|
5
|
+
* above `pub mod api`; typed host wrappers live inside it. `impl` methods
|
|
6
|
+
* (Predicate::new) are skipped — they are not callable as `crowdy::api::*`.
|
|
7
|
+
*
|
|
8
|
+
* @module @crowdy/dsh-cockpit/sdk-index
|
|
9
|
+
*/
|
|
10
|
+
function foldWs(text) {
|
|
11
|
+
return text.replace(/\s+/gu, ' ').trim();
|
|
12
|
+
}
|
|
13
|
+
function firstDocLine(source, fnIndex) {
|
|
14
|
+
const before = source.slice(0, fnIndex);
|
|
15
|
+
const lines = before.split('\n');
|
|
16
|
+
const docs = [];
|
|
17
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
18
|
+
const line = lines[i] ?? '';
|
|
19
|
+
if (/^\s*$/u.test(line) || /^\s*#\[/u.test(line))
|
|
20
|
+
continue;
|
|
21
|
+
const doc = line.match(/^\s*\/\/\/\s?(.*)$/u);
|
|
22
|
+
if (doc) {
|
|
23
|
+
docs.unshift((doc[1] ?? '').trim());
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
return docs[0] ?? '';
|
|
29
|
+
}
|
|
30
|
+
function sliceSignature(source, start) {
|
|
31
|
+
const open = source.indexOf('(', start);
|
|
32
|
+
if (open < 0)
|
|
33
|
+
return null;
|
|
34
|
+
let depth = 0;
|
|
35
|
+
let i = open;
|
|
36
|
+
for (; i < source.length; i += 1) {
|
|
37
|
+
const ch = source[i];
|
|
38
|
+
if (ch === '(')
|
|
39
|
+
depth += 1;
|
|
40
|
+
else if (ch === ')') {
|
|
41
|
+
depth -= 1;
|
|
42
|
+
if (depth === 0)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (depth !== 0)
|
|
47
|
+
return null;
|
|
48
|
+
const after = source.slice(i + 1);
|
|
49
|
+
const ret = after.match(/^\s*(->\s*[^={]+)?/u);
|
|
50
|
+
const retText = ret?.[1] ? ` ${foldWs(ret[1])}` : '';
|
|
51
|
+
const head = foldWs(source.slice(start, i + 1));
|
|
52
|
+
return `${head}${retText}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse crate-root and `pub mod api` functions from one `lib.rs`.
|
|
56
|
+
*/
|
|
57
|
+
export function parseCrowdyComputeSdk(source) {
|
|
58
|
+
const apiMatch = source.match(/^pub mod api \{/mu);
|
|
59
|
+
const apiStart = apiMatch?.index ?? source.length;
|
|
60
|
+
const afterApi = source.slice(apiStart);
|
|
61
|
+
const apiOpen = afterApi.indexOf('{');
|
|
62
|
+
let apiEnd = source.length;
|
|
63
|
+
if (apiOpen >= 0) {
|
|
64
|
+
let depth = 0;
|
|
65
|
+
for (let i = apiStart + apiOpen; i < source.length; i += 1) {
|
|
66
|
+
const ch = source[i];
|
|
67
|
+
if (ch === '{')
|
|
68
|
+
depth += 1;
|
|
69
|
+
else if (ch === '}') {
|
|
70
|
+
depth -= 1;
|
|
71
|
+
if (depth === 0) {
|
|
72
|
+
apiEnd = i;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const crateRegion = source.slice(0, apiStart);
|
|
79
|
+
const apiRegion = unwrapModBody(source.slice(apiStart, apiEnd));
|
|
80
|
+
return [
|
|
81
|
+
...collectFns(crateRegion, 'crate'),
|
|
82
|
+
...collectFns(apiRegion, 'api'),
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
/** Drop the outer `pub mod api { ... }` so nested fns sit at depth 0. */
|
|
86
|
+
function unwrapModBody(region) {
|
|
87
|
+
const open = region.indexOf('{');
|
|
88
|
+
if (open < 0)
|
|
89
|
+
return region;
|
|
90
|
+
const close = region.lastIndexOf('}');
|
|
91
|
+
return region.slice(open + 1, close >= 0 ? close : undefined);
|
|
92
|
+
}
|
|
93
|
+
function collectFns(region, module) {
|
|
94
|
+
const entries = [];
|
|
95
|
+
const seen = new Set();
|
|
96
|
+
const lines = region.split('\n');
|
|
97
|
+
let offset = 0;
|
|
98
|
+
let depth = 0;
|
|
99
|
+
let implAt = null;
|
|
100
|
+
for (const line of lines) {
|
|
101
|
+
if (implAt === null && /^\s*impl\b/u.test(line))
|
|
102
|
+
implAt = depth;
|
|
103
|
+
const fn = line.match(/^\s*pub fn ([A-Za-z_][A-Za-z0-9_]*)\s*\(/u);
|
|
104
|
+
if (fn && implAt === null && depth === 0) {
|
|
105
|
+
const name = fn[1];
|
|
106
|
+
if (name && !seen.has(name)) {
|
|
107
|
+
const local = region.indexOf(line, offset);
|
|
108
|
+
const sig = sliceSignature(region, local);
|
|
109
|
+
if (sig) {
|
|
110
|
+
seen.add(name);
|
|
111
|
+
entries.push({
|
|
112
|
+
name,
|
|
113
|
+
module,
|
|
114
|
+
signature: sig.replace(/^pub\s+/u, ''),
|
|
115
|
+
doc: firstDocLine(region, local),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
depth += (line.match(/\{/gu) ?? []).length - (line.match(/\}/gu) ?? []).length;
|
|
121
|
+
if (implAt !== null && depth <= implAt)
|
|
122
|
+
implAt = null;
|
|
123
|
+
offset += line.length + 1;
|
|
124
|
+
}
|
|
125
|
+
return entries;
|
|
126
|
+
}
|
|
127
|
+
/** Path used when rustc / the seed names a function. */
|
|
128
|
+
export function qualifiedName(entry) {
|
|
129
|
+
return entry.module === 'api' ? `crowdy::api::${entry.name}` : `crowdy::${entry.name}`;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=parse-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-sdk.js","sourceRoot":"","sources":["../../src/sdk-index/parse-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cordis plugin: inject the closed-world crowdy-compute-sdk index and a
|
|
3
|
+
* `sdk_lookup` tool.
|
|
4
|
+
*
|
|
5
|
+
* The Studio project does not contain the SDK crate, so grep/read cannot
|
|
6
|
+
* discover `crowdy::api::*`. This plugin is the swappable source of truth:
|
|
7
|
+
* disable the row and the agent loses the index; point `sdkSourcePath` at a
|
|
8
|
+
* newer `lib.rs` and the prompt rebuilds without a Studio seed change.
|
|
9
|
+
*
|
|
10
|
+
* @module @crowdy/dsh-cockpit/sdk-index
|
|
11
|
+
*/
|
|
12
|
+
import { readFile } from 'node:fs/promises';
|
|
13
|
+
import z from '@deepseek-ai/schemastery';
|
|
14
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
15
|
+
import { formatLookup, formatSdkPrompt, lookupSdkName } from './catalog.js';
|
|
16
|
+
import { parseCrowdyComputeSdk } from './parse-sdk.js';
|
|
17
|
+
import { SDK_SNAPSHOT, SDK_SNAPSHOT_VERSION } from './snapshot.js';
|
|
18
|
+
/** Cordis plugin name used by loader diagnostics. */
|
|
19
|
+
export const name = 'sdk-index-crowdy';
|
|
20
|
+
export const inject = ['tools', 'systemPrompt'];
|
|
21
|
+
export const Config = z
|
|
22
|
+
.object({
|
|
23
|
+
sdkSourcePath: z.string(),
|
|
24
|
+
})
|
|
25
|
+
.default({ sdkSourcePath: '' });
|
|
26
|
+
async function loadCatalog(config) {
|
|
27
|
+
const path = config.sdkSourcePath?.trim();
|
|
28
|
+
if (!path) {
|
|
29
|
+
return { catalog: SDK_SNAPSHOT, source: `snapshot ${SDK_SNAPSHOT_VERSION}` };
|
|
30
|
+
}
|
|
31
|
+
const text = await readFile(path, 'utf8');
|
|
32
|
+
const catalog = parseCrowdyComputeSdk(text);
|
|
33
|
+
if (catalog.length === 0) {
|
|
34
|
+
throw new Error(`sdk-index-crowdy: parsed no pub fn entries from ${path}`);
|
|
35
|
+
}
|
|
36
|
+
return { catalog, source: path };
|
|
37
|
+
}
|
|
38
|
+
export async function apply(ctx, config = {}) {
|
|
39
|
+
const { catalog, source } = await loadCatalog(config ?? {});
|
|
40
|
+
const systemPrompt = ctx.systemPrompt;
|
|
41
|
+
systemPrompt.section({
|
|
42
|
+
name: 'sdk-index',
|
|
43
|
+
order: 90,
|
|
44
|
+
text: `${formatSdkPrompt(catalog)}\n\n(index source: ${source})`,
|
|
45
|
+
});
|
|
46
|
+
const lookup = defineTool({
|
|
47
|
+
name: 'sdk_lookup',
|
|
48
|
+
description: 'Look up a crowdy / crowdy::api function name in the closed-world SDK ' +
|
|
49
|
+
'index. Use this when rustc says cannot find function X, or before ' +
|
|
50
|
+
'writing a new host call. Returns the real signature or the nearest ' +
|
|
51
|
+
'listed functions — never invent a name. Omit `name` to dump the index.',
|
|
52
|
+
parameters: {
|
|
53
|
+
name: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Function name rustc could not find, with or without a crowdy:: / ' +
|
|
56
|
+
'crowdy::api:: prefix (e.g. "emit", "voxel_set"). Empty dumps the index.',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
output: {
|
|
60
|
+
schema: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
additionalProperties: false,
|
|
63
|
+
properties: {
|
|
64
|
+
text: { type: 'string', required: true },
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
render: (_args, value) => [{ type: 'text', text: value.text }],
|
|
68
|
+
},
|
|
69
|
+
async execute(args) {
|
|
70
|
+
const query = typeof args.name === 'string' ? args.name.trim() : '';
|
|
71
|
+
if (!query) {
|
|
72
|
+
return { text: formatSdkPrompt(catalog) };
|
|
73
|
+
}
|
|
74
|
+
return { text: formatLookup(lookupSdkName(catalog, query)) };
|
|
75
|
+
},
|
|
76
|
+
presentCall: (args) => ({
|
|
77
|
+
card: 'generic',
|
|
78
|
+
title: args.name ? `SDK lookup ${args.name}` : 'SDK index',
|
|
79
|
+
kind: 'search',
|
|
80
|
+
rawInput: typeof args.name === 'string' ? args.name : '',
|
|
81
|
+
}),
|
|
82
|
+
presentResult: (_args, result) => {
|
|
83
|
+
if (result.isError)
|
|
84
|
+
return undefined;
|
|
85
|
+
return undefined;
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
ctx.tools.register(lookup);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/sdk-index/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendored crowdy-compute-sdk 0.1.5 catalog.
|
|
3
|
+
*
|
|
4
|
+
* The cockpit must not import the CK API repository at runtime. When the SDK crate
|
|
5
|
+
* source is available, `parseCrowdyComputeSdk` can rebuild this list; tests
|
|
6
|
+
* compare the two so a bump without a snapshot update fails loudly.
|
|
7
|
+
*/
|
|
8
|
+
export const SDK_SNAPSHOT_VERSION = '0.1.5';
|
|
9
|
+
export const SDK_SNAPSHOT = [
|
|
10
|
+
{
|
|
11
|
+
name: 'log',
|
|
12
|
+
module: 'crate',
|
|
13
|
+
signature: 'fn log(level: u32, msg: &str)',
|
|
14
|
+
doc: '',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'now_ms',
|
|
18
|
+
module: 'crate',
|
|
19
|
+
signature: 'fn now_ms() -> u64',
|
|
20
|
+
doc: '',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'state_get',
|
|
24
|
+
module: 'crate',
|
|
25
|
+
signature: 'fn state_get() -> Vec<u8>',
|
|
26
|
+
doc: "Read the module's durable state blob (empty vec when unset).",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'state_set',
|
|
30
|
+
module: 'crate',
|
|
31
|
+
signature: 'fn state_set(bytes: &[u8]) -> bool',
|
|
32
|
+
doc: "Replace the module's durable state blob. Returns false when over the cap.",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'random_bytes',
|
|
36
|
+
module: 'crate',
|
|
37
|
+
signature: 'fn random_bytes(len: usize) -> Vec<u8>',
|
|
38
|
+
doc: "Host-seeded random bytes (via the deterministic WASI stub).",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'pack_return',
|
|
42
|
+
module: 'crate',
|
|
43
|
+
signature: 'fn pack_return(bytes: Vec<u8>) -> u64',
|
|
44
|
+
doc: 'Leak `bytes` and pack its (ptr, len) into the u64 return convention.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'host_call',
|
|
48
|
+
module: 'crate',
|
|
49
|
+
signature: 'fn host_call(fn_name: &str, args: serde_json::Value) -> Result<serde_json::Value, HostError>',
|
|
50
|
+
doc: 'Call a host API function with JSON args; returns the `data` payload.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'container_create',
|
|
54
|
+
module: 'api',
|
|
55
|
+
signature: 'fn container_create(type_name: &str, session_id: Option<&str>, properties: Value) -> Result<Value, HostError>',
|
|
56
|
+
doc: '',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'container_create_for',
|
|
60
|
+
module: 'api',
|
|
61
|
+
signature: 'fn container_create_for(type_name: &str, display_name: &str, session_id: Option<&str>, owner_user_id: Option<&str>, properties: Value) -> Result<Value, HostError>',
|
|
62
|
+
doc: 'Create a container with explicit display name / owner. The module is a',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'container_get',
|
|
66
|
+
module: 'api',
|
|
67
|
+
signature: 'fn container_get(container_id: &str) -> Result<Value, HostError>',
|
|
68
|
+
doc: '',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'container_get_batch',
|
|
72
|
+
module: 'api',
|
|
73
|
+
signature: 'fn container_get_batch(container_ids: &[&str]) -> Result<Value, HostError>',
|
|
74
|
+
doc: 'Batched container_get: up to 32 ids -> [{container, properties}] in',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'containers_list',
|
|
78
|
+
module: 'api',
|
|
79
|
+
signature: 'fn containers_list(type_name: Option<&str>, session_id: Option<&str>) -> Result<Value, HostError>',
|
|
80
|
+
doc: '',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'containers_list_where',
|
|
84
|
+
module: 'api',
|
|
85
|
+
signature: 'fn containers_list_where(type_name: Option<&str>, session_id: Option<&str>, wher: &[Predicate], limit: Option<u32>, offset: Option<u32>) -> Result<Value, HostError>',
|
|
86
|
+
doc: 'Filtered/paged container list: up to 8 AND-combined property',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'container_delete',
|
|
90
|
+
module: 'api',
|
|
91
|
+
signature: 'fn container_delete(container_id: &str) -> Result<Value, HostError>',
|
|
92
|
+
doc: '',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'property_set',
|
|
96
|
+
module: 'api',
|
|
97
|
+
signature: 'fn property_set(container_id: &str, key: &str, value_type: &str, value: Value) -> Result<Value, HostError>',
|
|
98
|
+
doc: '',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'model_invoke',
|
|
102
|
+
module: 'api',
|
|
103
|
+
signature: 'fn model_invoke(function_name: &str, self_container_id: &str, params: Value, session_id: Option<&str>, caller_user_id: Option<&str>) -> Result<Value, HostError>',
|
|
104
|
+
doc: 'Invoke an autonomous-invocable Model function transactionally from a',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'model_invoke_with_world',
|
|
108
|
+
module: 'api',
|
|
109
|
+
signature: 'fn model_invoke_with_world(function_name: &str, self_container_id: &str, params: Value, session_id: Option<&str>, caller_user_id: Option<&str>, world_writes: &[WorldWrite]) -> Result<Value, HostError>',
|
|
110
|
+
doc: '`model_invoke` with atomic world writes: the voxel writes and the',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'edge_add',
|
|
114
|
+
module: 'api',
|
|
115
|
+
signature: 'fn edge_add(from_container_id: &str, to_container_id: &str, relationship_type: &str) -> Result<Value, HostError>',
|
|
116
|
+
doc: '',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'edge_delete',
|
|
120
|
+
module: 'api',
|
|
121
|
+
signature: 'fn edge_delete(from_container_id: &str, to_container_id: &str, relationship_type: &str) -> Result<Value, HostError>',
|
|
122
|
+
doc: '',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'sessions_list',
|
|
126
|
+
module: 'api',
|
|
127
|
+
signature: 'fn sessions_list(status: Option<&str>) -> Result<Value, HostError>',
|
|
128
|
+
doc: '',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: 'user_state_get',
|
|
132
|
+
module: 'api',
|
|
133
|
+
signature: 'fn user_state_get(user_id: &str) -> Result<Value, HostError>',
|
|
134
|
+
doc: '',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: 'user_state_set',
|
|
138
|
+
module: 'api',
|
|
139
|
+
signature: 'fn user_state_set(user_id: &str, state_base64: &str) -> Result<Value, HostError>',
|
|
140
|
+
doc: 'state is base64-encoded bytes.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: 'avatar_state_get',
|
|
144
|
+
module: 'api',
|
|
145
|
+
signature: 'fn avatar_state_get(avatar_id: &str) -> Result<Value, HostError>',
|
|
146
|
+
doc: '',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: 'grid_state_get',
|
|
150
|
+
module: 'api',
|
|
151
|
+
signature: 'fn grid_state_get(grid_id: &str) -> Result<Value, HostError>',
|
|
152
|
+
doc: '',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'grid_state_set',
|
|
156
|
+
module: 'api',
|
|
157
|
+
signature: 'fn grid_state_set(grid_id: &str, state_base64: &str) -> Result<Value, HostError>',
|
|
158
|
+
doc: '',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: 'chunk_get',
|
|
162
|
+
module: 'api',
|
|
163
|
+
signature: 'fn chunk_get(x: i64, y: i64, z: i64) -> Result<Value, HostError>',
|
|
164
|
+
doc: '',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'voxels_list',
|
|
168
|
+
module: 'api',
|
|
169
|
+
signature: 'fn voxels_list(x: i64, y: i64, z: i64) -> Result<Value, HostError>',
|
|
170
|
+
doc: 'List the voxels recorded in one chunk (capped host-side; voxelType +',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: 'actors_list',
|
|
174
|
+
module: 'api',
|
|
175
|
+
signature: 'fn actors_list(x: i64, y: i64, z: i64) -> Result<Value, HostError>',
|
|
176
|
+
doc: '',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: 'actors_list_radius',
|
|
180
|
+
module: 'api',
|
|
181
|
+
signature: 'fn actors_list_radius(x: i64, y: i64, z: i64, radius_xz: u8, radius_y: u8) -> Result<Value, HostError>',
|
|
182
|
+
doc: 'Actors in a chunk box around (x,y,z): radiusXz clamped to 3, radiusY',
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: 'voxel_set',
|
|
186
|
+
module: 'api',
|
|
187
|
+
signature: 'fn voxel_set(chunk: (i64, i64, i64), voxel: (u8, u8, u8), voxel_type: i32, state_base64: Option<&str>) -> Result<Value, HostError>',
|
|
188
|
+
doc: '',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: 'grid_permission_check',
|
|
192
|
+
module: 'api',
|
|
193
|
+
signature: 'fn grid_permission_check(user_id: &str, grid_id: &str, permission_key: &str) -> Result<bool, HostError>',
|
|
194
|
+
doc: '',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: 'emit_spatial',
|
|
198
|
+
module: 'api',
|
|
199
|
+
signature: 'fn emit_spatial(kind: &str, chunk: (i64, i64, i64), uuid_hex: &str, payload_base64: &str, distance: u8, decay: u8) -> Result<Value, HostError>',
|
|
200
|
+
doc: 'kind: "actor" | "voxel" | "client_event" | "server_event" (host maps to',
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: 'emit_channel',
|
|
204
|
+
module: 'api',
|
|
205
|
+
signature: 'fn emit_channel(channel_id: &str, payload_base64: &str) -> Result<Value, HostError>',
|
|
206
|
+
doc: '',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: 'emit_event',
|
|
210
|
+
module: 'api',
|
|
211
|
+
signature: 'fn emit_event(name: &str, payload: Value) -> Result<Value, HostError>',
|
|
212
|
+
doc: 'Emit a compute event other modules (or this one) can subscribe to via',
|
|
213
|
+
},
|
|
214
|
+
];
|
|
215
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/sdk-index/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal glob matching for the Crowdy search tools.
|
|
3
|
+
*
|
|
4
|
+
* The stock `glob`/`grep` tools hand patterns to ripgrep; the Crowdy project
|
|
5
|
+
* lives behind a GraphQL API, so matching happens in memory instead. This
|
|
6
|
+
* module implements the subset of rg's glob syntax the tools document:
|
|
7
|
+
* `*` (within a segment), `?`, `**` (across segments), `[...]` classes, and
|
|
8
|
+
* `{a,b}` alternation. Following rg, a pattern with no `/` matches the
|
|
9
|
+
* BASENAME at any depth, and a pattern with a separator anchors to the whole
|
|
10
|
+
* relative path.
|
|
11
|
+
*
|
|
12
|
+
* @module @crowdy/dsh-cockpit/search/glob-match
|
|
13
|
+
*/
|
|
14
|
+
const REGEX_SPECIALS = new Set(['.', '+', '^', '$', '(', ')', '|', '\\']);
|
|
15
|
+
/** Thrown for a pattern the converter cannot interpret (e.g. unclosed brace). */
|
|
16
|
+
export class GlobSyntaxError extends Error {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Translate one glob into a regex source fragment (no anchors).
|
|
20
|
+
* Recursion only happens for `{...}` alternation branches.
|
|
21
|
+
*/
|
|
22
|
+
function toRegexSource(pattern) {
|
|
23
|
+
let out = '';
|
|
24
|
+
let i = 0;
|
|
25
|
+
while (i < pattern.length) {
|
|
26
|
+
const char = pattern.charAt(i);
|
|
27
|
+
if (char === '*') {
|
|
28
|
+
if (pattern[i + 1] === '*') {
|
|
29
|
+
// `**/` may match zero segments, so `**/*.rs` also matches `main.rs`.
|
|
30
|
+
if (pattern[i + 2] === '/') {
|
|
31
|
+
out += '(?:[^/]+/)*';
|
|
32
|
+
i += 3;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
out += '.*';
|
|
36
|
+
i += 2;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
out += '[^/]*';
|
|
41
|
+
i += 1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (char === '?') {
|
|
45
|
+
out += '[^/]';
|
|
46
|
+
i += 1;
|
|
47
|
+
}
|
|
48
|
+
else if (char === '[') {
|
|
49
|
+
const close = pattern.indexOf(']', i + 2); // a class is never empty
|
|
50
|
+
if (close === -1)
|
|
51
|
+
throw new GlobSyntaxError(`unclosed "[" in glob: ${pattern}`);
|
|
52
|
+
let body = pattern.slice(i + 1, close);
|
|
53
|
+
if (body.startsWith('!') || body.startsWith('^'))
|
|
54
|
+
body = `^${body.slice(1)}`;
|
|
55
|
+
// Escape only what could break out of a character class.
|
|
56
|
+
body = body.replace(/[\\\]]/g, (m) => `\\${m}`);
|
|
57
|
+
out += `[${body}]`;
|
|
58
|
+
i = close + 1;
|
|
59
|
+
}
|
|
60
|
+
else if (char === '{') {
|
|
61
|
+
let depth = 1;
|
|
62
|
+
let j = i + 1;
|
|
63
|
+
const branches = [];
|
|
64
|
+
let start = j;
|
|
65
|
+
while (j < pattern.length && depth > 0) {
|
|
66
|
+
const c = pattern[j];
|
|
67
|
+
if (c === '{')
|
|
68
|
+
depth += 1;
|
|
69
|
+
else if (c === '}') {
|
|
70
|
+
depth -= 1;
|
|
71
|
+
if (depth === 0)
|
|
72
|
+
branches.push(pattern.slice(start, j));
|
|
73
|
+
}
|
|
74
|
+
else if (c === ',' && depth === 1) {
|
|
75
|
+
branches.push(pattern.slice(start, j));
|
|
76
|
+
start = j + 1;
|
|
77
|
+
}
|
|
78
|
+
j += 1;
|
|
79
|
+
}
|
|
80
|
+
if (depth !== 0)
|
|
81
|
+
throw new GlobSyntaxError(`unclosed "{" in glob: ${pattern}`);
|
|
82
|
+
out += `(?:${branches.map(toRegexSource).join('|')})`;
|
|
83
|
+
i = j;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
out += REGEX_SPECIALS.has(char) ? `\\${char}` : char;
|
|
87
|
+
i += 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Compile one glob to an anchored RegExp over a `/`-separated relative path.
|
|
94
|
+
* @throws {GlobSyntaxError} for an uninterpretable pattern.
|
|
95
|
+
*/
|
|
96
|
+
export function globToRegExp(pattern) {
|
|
97
|
+
return new RegExp(`^${toRegexSource(pattern)}$`);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Whether a project-relative path matches one glob, following rg's rule: a
|
|
101
|
+
* pattern with no `/` tests the basename at any depth; a pattern with a
|
|
102
|
+
* separator tests the whole relative path.
|
|
103
|
+
*
|
|
104
|
+
* @param relativePath - `/`-separated path relative to the search root.
|
|
105
|
+
* @param pattern - the glob to test.
|
|
106
|
+
*/
|
|
107
|
+
export function globMatches(relativePath, pattern) {
|
|
108
|
+
const anchored = pattern.includes('/');
|
|
109
|
+
const subject = anchored
|
|
110
|
+
? relativePath
|
|
111
|
+
: relativePath.slice(relativePath.lastIndexOf('/') + 1);
|
|
112
|
+
return globToRegExp(pattern).test(subject);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=glob-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob-match.js","sourceRoot":"","sources":["../../src/search/glob-match.ts"],"names":[],"mappings":"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"}
|