sh3-core 0.15.0 → 0.15.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/dist/actions/ctx-actions.svelte.test.js +111 -0
- package/dist/actions/dispatcher.svelte.js +23 -2
- package/dist/actions/dispatcher.test.js +33 -0
- package/dist/actions/listActionsFromEntries.test.js +78 -0
- package/dist/actions/listActive.d.ts +2 -1
- package/dist/actions/listActive.js +43 -17
- package/dist/actions/listeners.d.ts +16 -0
- package/dist/actions/listeners.js +68 -14
- package/dist/actions/programmatic-dispatch.svelte.test.d.ts +1 -0
- package/dist/actions/programmatic-dispatch.svelte.test.js +98 -0
- package/dist/actions/types.d.ts +37 -0
- package/dist/api.d.ts +1 -1
- package/dist/app/store/verbs.js +4 -0
- package/dist/app-appearance/appearanceShard.svelte.js +19 -6
- package/dist/app-appearance/appearanceState.svelte.js +3 -3
- package/dist/host.js +2 -1
- package/dist/layouts-shard/LayoutSaveModal.svelte +145 -0
- package/dist/layouts-shard/LayoutSaveModal.svelte.d.ts +12 -0
- package/dist/layouts-shard/LayoutsSection.svelte +142 -0
- package/dist/layouts-shard/LayoutsSection.svelte.d.ts +3 -0
- package/dist/layouts-shard/filter.d.ts +3 -0
- package/dist/layouts-shard/filter.js +66 -0
- package/dist/layouts-shard/filter.test.d.ts +1 -0
- package/dist/layouts-shard/filter.test.js +123 -0
- package/dist/layouts-shard/index.d.ts +1 -0
- package/dist/layouts-shard/index.js +1 -0
- package/dist/layouts-shard/layoutsApi.d.ts +12 -0
- package/dist/layouts-shard/layoutsApi.js +41 -0
- package/dist/layouts-shard/layoutsApi.test.d.ts +1 -0
- package/dist/layouts-shard/layoutsApi.test.js +74 -0
- package/dist/layouts-shard/layoutsShard.svelte.d.ts +11 -0
- package/dist/layouts-shard/layoutsShard.svelte.js +231 -0
- package/dist/layouts-shard/layoutsShard.svelte.test.d.ts +1 -0
- package/dist/layouts-shard/layoutsShard.svelte.test.js +215 -0
- package/dist/layouts-shard/layoutsState.svelte.d.ts +9 -0
- package/dist/layouts-shard/layoutsState.svelte.js +50 -0
- package/dist/layouts-shard/layoutsState.test.d.ts +1 -0
- package/dist/layouts-shard/layoutsState.test.js +43 -0
- package/dist/layouts-shard/types.d.ts +21 -0
- package/dist/layouts-shard/types.js +6 -0
- package/dist/{app-appearance/AppAppearanceModal.svelte → overlays/EntityAppearanceModal.svelte} +36 -31
- package/dist/overlays/EntityAppearanceModal.svelte.d.ts +19 -0
- package/dist/overlays/EntityAppearanceModal.test.d.ts +1 -0
- package/dist/overlays/EntityAppearanceModal.test.js +57 -0
- package/dist/overlays/FloatFrame.svelte +149 -8
- package/dist/overlays/FloatFrame.svelte.d.ts +1 -1
- package/dist/overlays/FloatLayer.svelte +2 -2
- package/dist/overlays/float.d.ts +38 -1
- package/dist/overlays/float.js +82 -0
- package/dist/overlays/float.test.js +394 -0
- package/dist/overlays/floatMaximized.svelte.d.ts +4 -0
- package/dist/overlays/floatMaximized.svelte.js +30 -0
- package/dist/runtime/runVerb-shell.test.d.ts +1 -0
- package/dist/runtime/runVerb-shell.test.js +231 -0
- package/dist/sh3core-shard/ShellHome.svelte +3 -0
- package/dist/sh3core-shard/sh3coreShard.svelte.d.ts +7 -0
- package/dist/sh3core-shard/sh3coreShard.svelte.js +23 -0
- package/dist/shards/activate-runtime.test.js +24 -2
- package/dist/shards/activate.svelte.js +18 -4
- package/dist/shards/types.d.ts +44 -4
- package/dist/shell-shard/CommandLine.svelte +143 -0
- package/dist/shell-shard/CommandLine.svelte.d.ts +26 -0
- package/dist/shell-shard/CommandLine.svelte.test.d.ts +1 -0
- package/dist/shell-shard/CommandLine.svelte.test.js +43 -0
- package/dist/shell-shard/InputLine.svelte +17 -40
- package/dist/shell-shard/InputLine.svelte.d.ts +2 -0
- package/dist/shell-shard/ScrollbackView.svelte +10 -3
- package/dist/shell-shard/ScrollbackView.svelte.d.ts +1 -0
- package/dist/shell-shard/Terminal.svelte +94 -22
- package/dist/shell-shard/buffer-store.d.ts +15 -0
- package/dist/shell-shard/buffer-store.js +124 -0
- package/dist/shell-shard/buffer-store.svelte.test.d.ts +1 -0
- package/dist/shell-shard/buffer-store.svelte.test.js +107 -0
- package/dist/shell-shard/buffer-zone-state.svelte.d.ts +38 -0
- package/dist/shell-shard/buffer-zone-state.svelte.js +31 -0
- package/dist/shell-shard/contract.d.ts +7 -0
- package/dist/shell-shard/dispatch-custom.test.js +3 -1
- package/dist/shell-shard/dispatch-gating.test.js +6 -2
- package/dist/shell-shard/dispatch-invoke.test.js +10 -8
- package/dist/shell-shard/dispatch.d.ts +7 -2
- package/dist/shell-shard/dispatch.js +23 -27
- package/dist/shell-shard/display-cwd.d.ts +1 -0
- package/dist/shell-shard/display-cwd.js +27 -0
- package/dist/shell-shard/display-cwd.test.d.ts +1 -0
- package/dist/shell-shard/display-cwd.test.js +29 -0
- package/dist/shell-shard/entries/StatusEntry.svelte +2 -0
- package/dist/shell-shard/manifest.js +2 -1
- package/dist/shell-shard/manifest.test.d.ts +1 -0
- package/dist/shell-shard/manifest.test.js +8 -0
- package/dist/shell-shard/mode-buffer.svelte.d.ts +8 -0
- package/dist/shell-shard/mode-buffer.svelte.js +19 -0
- package/dist/shell-shard/mode-buffer.svelte.test.d.ts +1 -0
- package/dist/shell-shard/mode-buffer.svelte.test.js +25 -0
- package/dist/shell-shard/modes/builtin.js +2 -0
- package/dist/shell-shard/modes/types.d.ts +8 -0
- package/dist/shell-shard/protocol.d.ts +12 -6
- package/dist/shell-shard/replay.d.ts +3 -0
- package/dist/shell-shard/replay.js +44 -0
- package/dist/shell-shard/replay.svelte.test.d.ts +1 -0
- package/dist/shell-shard/replay.svelte.test.js +47 -0
- package/dist/shell-shard/rich-registry.d.ts +5 -0
- package/dist/shell-shard/rich-registry.js +25 -0
- package/dist/shell-shard/rich-registry.test.d.ts +1 -0
- package/dist/shell-shard/rich-registry.test.js +31 -0
- package/dist/shell-shard/scrollback.svelte.d.ts +2 -0
- package/dist/shell-shard/scrollback.svelte.js +23 -0
- package/dist/shell-shard/scrollback.svelte.test.d.ts +1 -0
- package/dist/shell-shard/scrollback.svelte.test.js +51 -0
- package/dist/shell-shard/session-client.svelte.d.ts +18 -2
- package/dist/shell-shard/session-client.svelte.js +21 -4
- package/dist/shell-shard/shellApi.d.ts +2 -1
- package/dist/shell-shard/shellApi.js +32 -3
- package/dist/shell-shard/shellApi.svelte.test.d.ts +1 -0
- package/dist/shell-shard/shellApi.svelte.test.js +59 -0
- package/dist/shell-shard/shellShard.svelte.js +11 -1
- package/dist/shell-shard/terminal-dispatch.test.js +3 -1
- package/dist/shell-shard/verbs/apps.js +9 -0
- package/dist/shell-shard/verbs/env.js +4 -0
- package/dist/shell-shard/verbs/help.js +9 -1
- package/dist/shell-shard/verbs/help.svelte.test.d.ts +1 -0
- package/dist/shell-shard/verbs/help.svelte.test.js +53 -0
- package/dist/shell-shard/verbs/history.js +8 -1
- package/dist/shell-shard/verbs/index.js +0 -8
- package/dist/shell-shard/verbs/shards.js +5 -0
- package/dist/shell-shard/verbs/views.js +9 -0
- package/dist/shell-shard/verbs/zones.js +9 -0
- package/dist/verbs/types.d.ts +9 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/app-appearance/AppAppearanceModal.svelte.d.ts +0 -8
- package/dist/shell-shard/verbs/cat.d.ts +0 -2
- package/dist/shell-shard/verbs/cat.js +0 -34
- package/dist/shell-shard/verbs/cd.test.js +0 -56
- package/dist/shell-shard/verbs/ls.d.ts +0 -2
- package/dist/shell-shard/verbs/ls.js +0 -29
- package/dist/shell-shard/verbs/ls.test.js +0 -49
- package/dist/shell-shard/verbs/session.d.ts +0 -4
- package/dist/shell-shard/verbs/session.js +0 -97
- /package/dist/{shell-shard/verbs/cd.test.d.ts → actions/ctx-actions.svelte.test.d.ts} +0 -0
- /package/dist/{shell-shard/verbs/ls.test.d.ts → actions/listActionsFromEntries.test.d.ts} +0 -0
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export const catVerb = {
|
|
2
|
-
name: 'cat',
|
|
3
|
-
summary: 'Read a file into the scrollback.',
|
|
4
|
-
async run(ctx, args) {
|
|
5
|
-
if (args.length === 0) {
|
|
6
|
-
ctx.scrollback.push({
|
|
7
|
-
kind: 'status',
|
|
8
|
-
text: 'cat: missing file argument',
|
|
9
|
-
level: 'error',
|
|
10
|
-
ts: Date.now(),
|
|
11
|
-
});
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
const path = args[0];
|
|
15
|
-
const target = ctx.session.cwd ? `${ctx.session.cwd}/${path}` : path;
|
|
16
|
-
try {
|
|
17
|
-
const text = await ctx.fs.read(target);
|
|
18
|
-
ctx.scrollback.push({
|
|
19
|
-
kind: 'text',
|
|
20
|
-
stream: 'stdout',
|
|
21
|
-
chunks: [text],
|
|
22
|
-
ts: Date.now(),
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
ctx.scrollback.push({
|
|
27
|
-
kind: 'status',
|
|
28
|
-
text: `cat: ${err.message}`,
|
|
29
|
-
level: 'error',
|
|
30
|
-
ts: Date.now(),
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
};
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { cdVerb } from './session';
|
|
3
|
-
function makeCtx(initialCwd, fsStat) {
|
|
4
|
-
const pushed = [];
|
|
5
|
-
const session = { cwd: initialCwd };
|
|
6
|
-
const ctx = {
|
|
7
|
-
shell: {},
|
|
8
|
-
scrollback: { push: (e) => pushed.push(e) },
|
|
9
|
-
session,
|
|
10
|
-
cwd: initialCwd,
|
|
11
|
-
fs: {
|
|
12
|
-
list: async () => [],
|
|
13
|
-
stat: fsStat,
|
|
14
|
-
read: async () => '',
|
|
15
|
-
},
|
|
16
|
-
dispatch: async () => { },
|
|
17
|
-
};
|
|
18
|
-
return { ctx, session, pushed };
|
|
19
|
-
}
|
|
20
|
-
describe('cd verb', () => {
|
|
21
|
-
it('updates session.cwd on successful dir stat', async () => {
|
|
22
|
-
const { ctx, session } = makeCtx('', async (_path) => ({
|
|
23
|
-
name: 'projects',
|
|
24
|
-
kind: 'dir',
|
|
25
|
-
size: 0,
|
|
26
|
-
mtime: 0,
|
|
27
|
-
}));
|
|
28
|
-
await cdVerb.run(ctx, ['projects']);
|
|
29
|
-
expect(session.cwd).toBe('projects');
|
|
30
|
-
});
|
|
31
|
-
it('pushes error when target is a file, not a directory', async () => {
|
|
32
|
-
const { ctx, session, pushed } = makeCtx('', async (_path) => ({
|
|
33
|
-
name: 'readme.txt',
|
|
34
|
-
kind: 'file',
|
|
35
|
-
size: 100,
|
|
36
|
-
mtime: 0,
|
|
37
|
-
}));
|
|
38
|
-
await cdVerb.run(ctx, ['readme.txt']);
|
|
39
|
-
expect(session.cwd).toBe('');
|
|
40
|
-
const entry = pushed[0];
|
|
41
|
-
expect(entry.kind).toBe('status');
|
|
42
|
-
expect(entry.level).toBe('error');
|
|
43
|
-
expect(entry.text).toMatch(/not a directory/);
|
|
44
|
-
});
|
|
45
|
-
it('pushes error when fs.stat throws', async () => {
|
|
46
|
-
const { ctx, session, pushed } = makeCtx('', async (_path) => {
|
|
47
|
-
throw new Error('no such file');
|
|
48
|
-
});
|
|
49
|
-
await cdVerb.run(ctx, ['nonexistent']);
|
|
50
|
-
expect(session.cwd).toBe('');
|
|
51
|
-
const entry = pushed[0];
|
|
52
|
-
expect(entry.kind).toBe('status');
|
|
53
|
-
expect(entry.level).toBe('error');
|
|
54
|
-
expect(entry.text).toMatch(/no such file/);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export const lsVerb = {
|
|
2
|
-
name: 'ls',
|
|
3
|
-
summary: 'List the current directory.',
|
|
4
|
-
async run(ctx) {
|
|
5
|
-
let entries;
|
|
6
|
-
try {
|
|
7
|
-
entries = await ctx.fs.list(ctx.session.cwd);
|
|
8
|
-
}
|
|
9
|
-
catch (err) {
|
|
10
|
-
ctx.scrollback.push({
|
|
11
|
-
kind: 'status',
|
|
12
|
-
text: `ls: ${err.message}`,
|
|
13
|
-
level: 'error',
|
|
14
|
-
ts: Date.now(),
|
|
15
|
-
});
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const lines = entries
|
|
19
|
-
.sort((a, b) => a.name.localeCompare(b.name))
|
|
20
|
-
.map((e) => (e.kind === 'dir' ? `${e.name}/` : e.name))
|
|
21
|
-
.join('\n');
|
|
22
|
-
ctx.scrollback.push({
|
|
23
|
-
kind: 'text',
|
|
24
|
-
stream: 'stdout',
|
|
25
|
-
chunks: [lines || '(empty)'],
|
|
26
|
-
ts: Date.now(),
|
|
27
|
-
});
|
|
28
|
-
},
|
|
29
|
-
};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { lsVerb } from './ls';
|
|
3
|
-
function makeCtx(cwd, fsList) {
|
|
4
|
-
const pushed = [];
|
|
5
|
-
const ctx = {
|
|
6
|
-
shell: {},
|
|
7
|
-
scrollback: { push: (e) => pushed.push(e) },
|
|
8
|
-
session: { cwd },
|
|
9
|
-
cwd,
|
|
10
|
-
fs: {
|
|
11
|
-
list: fsList,
|
|
12
|
-
stat: async () => ({ kind: 'dir', name: '', size: 0, mtime: 0 }),
|
|
13
|
-
read: async () => '',
|
|
14
|
-
},
|
|
15
|
-
dispatch: async () => { },
|
|
16
|
-
};
|
|
17
|
-
return { ctx, pushed };
|
|
18
|
-
}
|
|
19
|
-
describe('ls verb', () => {
|
|
20
|
-
it('lists entries sorted, dirs with trailing slash', async () => {
|
|
21
|
-
const { ctx, pushed } = makeCtx('', async () => [
|
|
22
|
-
{ name: 'zebra.txt', kind: 'file', size: 1, mtime: 0 },
|
|
23
|
-
{ name: 'apple', kind: 'dir', size: 0, mtime: 0 },
|
|
24
|
-
{ name: 'mango.txt', kind: 'file', size: 2, mtime: 0 },
|
|
25
|
-
]);
|
|
26
|
-
await lsVerb.run(ctx, []);
|
|
27
|
-
expect(pushed).toHaveLength(1);
|
|
28
|
-
const entry = pushed[0];
|
|
29
|
-
expect(entry.kind).toBe('text');
|
|
30
|
-
expect(entry.chunks[0]).toBe('apple/\nmango.txt\nzebra.txt');
|
|
31
|
-
});
|
|
32
|
-
it('shows (empty) for empty directory', async () => {
|
|
33
|
-
const { ctx, pushed } = makeCtx('', async () => []);
|
|
34
|
-
await lsVerb.run(ctx, []);
|
|
35
|
-
const entry = pushed[0];
|
|
36
|
-
expect(entry.kind).toBe('text');
|
|
37
|
-
expect(entry.chunks[0]).toBe('(empty)');
|
|
38
|
-
});
|
|
39
|
-
it('pushes status error when fs.list throws', async () => {
|
|
40
|
-
const { ctx, pushed } = makeCtx('', async () => {
|
|
41
|
-
throw new Error('permission denied');
|
|
42
|
-
});
|
|
43
|
-
await lsVerb.run(ctx, []);
|
|
44
|
-
const entry = pushed[0];
|
|
45
|
-
expect(entry.kind).toBe('status');
|
|
46
|
-
expect(entry.level).toBe('error');
|
|
47
|
-
expect(entry.text).toMatch(/permission denied/);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Session verbs: pwd, cd, whoami.
|
|
3
|
-
*
|
|
4
|
-
* cd validates the target path via ctx.fs.stat() then updates session.cwd
|
|
5
|
-
* locally. The server still owns the authoritative cwd for forwarded
|
|
6
|
-
* commands, but local verbs track it via session.cwd.
|
|
7
|
-
*
|
|
8
|
-
* envVerb lives in env.ts (separate Svelte import).
|
|
9
|
-
*/
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// Path helpers
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
function joinRel(cwd, input) {
|
|
14
|
-
if (input.startsWith('/'))
|
|
15
|
-
return normalizeRel(input.slice(1));
|
|
16
|
-
const parts = [...cwd.split('/').filter(Boolean), ...input.split('/')];
|
|
17
|
-
const stack = [];
|
|
18
|
-
for (const p of parts) {
|
|
19
|
-
if (p === '' || p === '.')
|
|
20
|
-
continue;
|
|
21
|
-
if (p === '..') {
|
|
22
|
-
stack.pop();
|
|
23
|
-
continue;
|
|
24
|
-
}
|
|
25
|
-
stack.push(p);
|
|
26
|
-
}
|
|
27
|
-
return stack.join('/');
|
|
28
|
-
}
|
|
29
|
-
function normalizeRel(s) {
|
|
30
|
-
return s.split('/').filter((p) => p && p !== '.').join('/');
|
|
31
|
-
}
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
// Verbs
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
export const pwdVerb = {
|
|
36
|
-
name: 'pwd',
|
|
37
|
-
summary: 'Show the current working directory.',
|
|
38
|
-
async run(ctx) {
|
|
39
|
-
const rel = ctx.session.cwd || '';
|
|
40
|
-
const display = rel.startsWith('/') ? rel : `/${rel}`;
|
|
41
|
-
ctx.scrollback.push({
|
|
42
|
-
kind: 'text',
|
|
43
|
-
stream: 'stdout',
|
|
44
|
-
chunks: [display + '\n'],
|
|
45
|
-
ts: Date.now(),
|
|
46
|
-
});
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
export const cdVerb = {
|
|
50
|
-
name: 'cd',
|
|
51
|
-
summary: 'Change the session working directory.',
|
|
52
|
-
async run(ctx, args) {
|
|
53
|
-
var _a;
|
|
54
|
-
const target = (_a = args[0]) !== null && _a !== void 0 ? _a : '';
|
|
55
|
-
if (target === '') {
|
|
56
|
-
ctx.session.cwd = '';
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const base = ctx.session.cwd;
|
|
60
|
-
const candidate = joinRel(base, target);
|
|
61
|
-
try {
|
|
62
|
-
const s = await ctx.fs.stat(candidate);
|
|
63
|
-
if (s.kind !== 'dir') {
|
|
64
|
-
ctx.scrollback.push({
|
|
65
|
-
kind: 'status',
|
|
66
|
-
text: `cd: not a directory: ${target}`,
|
|
67
|
-
level: 'error',
|
|
68
|
-
ts: Date.now(),
|
|
69
|
-
});
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
ctx.scrollback.push({
|
|
75
|
-
kind: 'status',
|
|
76
|
-
text: `cd: ${err.message}`,
|
|
77
|
-
level: 'error',
|
|
78
|
-
ts: Date.now(),
|
|
79
|
-
});
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
ctx.session.cwd = candidate;
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
export const whoamiVerb = {
|
|
86
|
-
name: 'whoami',
|
|
87
|
-
summary: 'Show the current admin user and session info.',
|
|
88
|
-
async run(ctx) {
|
|
89
|
-
const me = ctx.shell.whoAmI();
|
|
90
|
-
ctx.scrollback.push({
|
|
91
|
-
kind: 'text',
|
|
92
|
-
stream: 'stdout',
|
|
93
|
-
chunks: [`${me.userId}${me.admin ? ' (admin)' : ''}\n`],
|
|
94
|
-
ts: Date.now(),
|
|
95
|
-
});
|
|
96
|
-
},
|
|
97
|
-
};
|
|
File without changes
|
|
File without changes
|