aimeat 1.33.2 → 1.34.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/dist/locales/en.json +388 -14
- package/dist/locales/fi.json +388 -14
- package/dist/public/cortex-bundled/aimeat-charts.js +3 -3
- package/dist/public/cortex-bundled/aimeat-charts.yaml +3 -3
- package/dist/public/cortex-bundled/aimeat-i18n.js +123 -0
- package/dist/public/cortex-bundled/aimeat-i18n.yaml +64 -0
- package/dist/public/css/views/landing.css +2 -0
- package/dist/public/css/views/secretary.css +412 -2
- package/dist/public/js/services/apps.js +4 -2
- package/dist/public/js/services/memory.js +9 -3
- package/dist/public/js/services/offers.js +1 -1
- package/dist/public/js/services/organisms.js +49 -17
- package/dist/public/js/services/secretary-helpers.js +262 -17
- package/dist/public/js/services/secretary-policy.js +1 -0
- package/dist/public/js/services/secretary-rules.js +70 -0
- package/dist/public/js/theme.js +20 -0
- package/dist/public/lib/VENDORED-STYLING.md +31 -0
- package/dist/public/lib/aimeat-daisyui-bridge.css +48 -0
- package/dist/public/lib/chartjs@4.js +14 -0
- package/dist/public/lib/daisyui@5.css +7 -0
- package/dist/public/lib/tailwindcss@4.js +8 -0
- package/dist/public/llms-template.txt +9 -6
- package/dist/public/showroom.html +104 -0
- package/dist/public/showroom.js +247 -0
- package/dist/public/spa.html +18 -16
- package/dist/public/views/aimeat-os.js +3 -2
- package/dist/public/views/landing.js +50 -6
- package/dist/public/views/profile/agents/agent-card.js +7 -0
- package/dist/public/views/profile/agents/state-detector.js +6 -0
- package/dist/public/views/profile/agents/tab-integration.js +6 -0
- package/dist/public/views/profile/apps-tab.js +46 -0
- package/dist/public/views/profile/extensions-tab.js +4 -0
- package/dist/public/views/profile/inbox-tab.js +1 -1
- package/dist/public/views/profile/landing-page.js +8 -3
- package/dist/public/views/profile/memory-tab.js +37 -6
- package/dist/public/views/profile/organisms/home.js +32 -0
- package/dist/public/views/profile/organisms/workspace-list.js +36 -5
- package/dist/public/views/profile/organisms/workspace.js +29 -4
- package/dist/public/views/profile/organisms-tab.js +61 -8
- package/dist/public/views/secretary/calendar.js +327 -0
- package/dist/public/views/secretary/cards-reach.js +16 -17
- package/dist/public/views/secretary/cards.js +173 -66
- package/dist/public/views/secretary/dashboard.js +551 -0
- package/dist/public/views/secretary/quality.js +156 -0
- package/dist/public/views/secretary/use-autonomy.js +17 -2
- package/dist/public/views/secretary/use-freshness.js +50 -0
- package/dist/public/views/secretary/use-intake.js +23 -4
- package/dist/public/views/secretary/use-layout.js +122 -0
- package/dist/public/views/secretary/use-quick-actions.js +98 -0
- package/dist/public/views/secretary/use-specialists.js +103 -0
- package/dist/public/views/secretary/use-triggers.js +159 -0
- package/dist/public/views/secretary/use-whats-next.js +340 -0
- package/dist/public/views/secretary/workflow-design.js +112 -0
- package/dist/public/views/secretary.js +663 -39
- package/dist/scripts/check-no-max-tokens.d.ts +2 -0
- package/dist/scripts/check-no-max-tokens.d.ts.map +1 -0
- package/dist/scripts/check-no-max-tokens.js +71 -0
- package/dist/scripts/check-no-max-tokens.js.map +1 -0
- package/dist/src/data/aimeat-iam-package.d.ts +25 -0
- package/dist/src/data/aimeat-iam-package.d.ts.map +1 -0
- package/dist/src/data/aimeat-iam-package.js +312 -0
- package/dist/src/data/aimeat-iam-package.js.map +1 -0
- package/dist/src/data/aimeat-marketplace-package.d.ts +25 -0
- package/dist/src/data/aimeat-marketplace-package.d.ts.map +1 -0
- package/dist/src/data/aimeat-marketplace-package.js +231 -0
- package/dist/src/data/aimeat-marketplace-package.js.map +1 -0
- package/dist/src/data/app-templates.d.ts +48 -0
- package/dist/src/data/app-templates.d.ts.map +1 -0
- package/dist/src/data/app-templates.js +856 -0
- package/dist/src/data/app-templates.js.map +1 -0
- package/dist/src/data/example-packages.d.ts.map +1 -1
- package/dist/src/data/example-packages.js +3 -1
- package/dist/src/data/example-packages.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +380 -5
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/generated/prisma-postgres/edge.js +10 -3
- package/dist/src/generated/prisma-postgres/index-browser.js +7 -0
- package/dist/src/generated/prisma-postgres/index.d.ts +205 -2
- package/dist/src/generated/prisma-postgres/index.js +10 -3
- package/dist/src/generated/prisma-postgres/package.json +1 -1
- package/dist/src/generated/prisma-postgres/schema.prisma +23 -13
- package/dist/src/generated/prisma-postgres/wasm.js +10 -3
- package/dist/src/mcp/annotations.d.ts.map +1 -1
- package/dist/src/mcp/annotations.js +1 -0
- package/dist/src/mcp/annotations.js.map +1 -1
- package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions.js +16 -1
- package/dist/src/mcp/catalog/definitions.js.map +1 -1
- package/dist/src/mcp/catalog/surfaces.js +3 -3
- package/dist/src/mcp/catalog/surfaces.js.map +1 -1
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +11 -0
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/organisms.d.ts.map +1 -1
- package/dist/src/mcp/organisms.js +48 -8
- package/dist/src/mcp/organisms.js.map +1 -1
- package/dist/src/mcp/workspaces.d.ts.map +1 -1
- package/dist/src/mcp/workspaces.js +6 -4
- package/dist/src/mcp/workspaces.js.map +1 -1
- package/dist/src/models/offer-schemas.d.ts +8 -8
- package/dist/src/routes/ai.d.ts +8 -4
- package/dist/src/routes/ai.d.ts.map +1 -1
- package/dist/src/routes/ai.js +38 -14
- package/dist/src/routes/ai.js.map +1 -1
- package/dist/src/routes/app-grants.d.ts +2 -0
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +7 -1
- package/dist/src/routes/app-grants.js.map +1 -1
- package/dist/src/routes/app-templates.d.ts +16 -0
- package/dist/src/routes/app-templates.d.ts.map +1 -0
- package/dist/src/routes/app-templates.js +40 -0
- package/dist/src/routes/app-templates.js.map +1 -0
- package/dist/src/routes/apps.d.ts.map +1 -1
- package/dist/src/routes/apps.js +55 -5
- package/dist/src/routes/apps.js.map +1 -1
- package/dist/src/routes/auth.d.ts +3 -0
- package/dist/src/routes/auth.d.ts.map +1 -1
- package/dist/src/routes/auth.js +9 -4
- package/dist/src/routes/auth.js.map +1 -1
- package/dist/src/routes/bootstrap.d.ts.map +1 -1
- package/dist/src/routes/bootstrap.js +1 -0
- package/dist/src/routes/bootstrap.js.map +1 -1
- package/dist/src/routes/generator.d.ts.map +1 -1
- package/dist/src/routes/generator.js +3 -2
- package/dist/src/routes/generator.js.map +1 -1
- package/dist/src/routes/lib-ai.d.ts +0 -1
- package/dist/src/routes/lib-ai.d.ts.map +1 -1
- package/dist/src/routes/lib-ai.js +13 -6
- package/dist/src/routes/lib-ai.js.map +1 -1
- package/dist/src/routes/lib-header.d.ts +2 -0
- package/dist/src/routes/lib-header.d.ts.map +1 -1
- package/dist/src/routes/lib-header.js +7 -16
- package/dist/src/routes/lib-header.js.map +1 -1
- package/dist/src/routes/lib-markdown.d.ts +18 -0
- package/dist/src/routes/lib-markdown.d.ts.map +1 -0
- package/dist/src/routes/lib-markdown.js +236 -0
- package/dist/src/routes/lib-markdown.js.map +1 -0
- package/dist/src/routes/libs.d.ts +22 -0
- package/dist/src/routes/libs.d.ts.map +1 -1
- package/dist/src/routes/libs.js +133 -10
- package/dist/src/routes/libs.js.map +1 -1
- package/dist/src/routes/memory.d.ts.map +1 -1
- package/dist/src/routes/memory.js +21 -2
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/openrouter.d.ts +4 -0
- package/dist/src/routes/openrouter.d.ts.map +1 -1
- package/dist/src/routes/openrouter.js +17 -0
- package/dist/src/routes/openrouter.js.map +1 -1
- package/dist/src/routes/organisms.d.ts.map +1 -1
- package/dist/src/routes/organisms.js +107 -7
- package/dist/src/routes/organisms.js.map +1 -1
- package/dist/src/routes/portal.d.ts +9 -0
- package/dist/src/routes/portal.d.ts.map +1 -1
- package/dist/src/routes/portal.js +1 -1
- package/dist/src/routes/portal.js.map +1 -1
- package/dist/src/routes/public-stats.d.ts +3 -0
- package/dist/src/routes/public-stats.d.ts.map +1 -1
- package/dist/src/routes/public-stats.js +9 -2
- package/dist/src/routes/public-stats.js.map +1 -1
- package/dist/src/routes/secretary.d.ts +29 -0
- package/dist/src/routes/secretary.d.ts.map +1 -0
- package/dist/src/routes/secretary.js +220 -0
- package/dist/src/routes/secretary.js.map +1 -0
- package/dist/src/routes/specialists.d.ts.map +1 -1
- package/dist/src/routes/specialists.js +21 -0
- package/dist/src/routes/specialists.js.map +1 -1
- package/dist/src/routes/subdomains.js +1 -1
- package/dist/src/routes/subdomains.js.map +1 -1
- package/dist/src/routes/workflows.d.ts +9 -3
- package/dist/src/routes/workflows.d.ts.map +1 -1
- package/dist/src/routes/workflows.js +9 -3
- package/dist/src/routes/workflows.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +4 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
- package/dist/src/server-bootstrap/service-init.js +7 -0
- package/dist/src/server-bootstrap/service-init.js.map +1 -1
- package/dist/src/server-bootstrap/static-files.d.ts +4 -0
- package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
- package/dist/src/server-bootstrap/static-files.js +18 -0
- package/dist/src/server-bootstrap/static-files.js.map +1 -1
- package/dist/src/services/archive.d.ts +74 -0
- package/dist/src/services/archive.d.ts.map +1 -0
- package/dist/src/services/archive.js +132 -0
- package/dist/src/services/archive.js.map +1 -0
- package/dist/src/services/cortex-seeder.d.ts +4 -1
- package/dist/src/services/cortex-seeder.d.ts.map +1 -1
- package/dist/src/services/cortex-seeder.js +25 -6
- package/dist/src/services/cortex-seeder.js.map +1 -1
- package/dist/src/services/directory.d.ts.map +1 -1
- package/dist/src/services/directory.js +3 -2
- package/dist/src/services/directory.js.map +1 -1
- package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
- package/dist/src/services/generator-prompt-seeds.js +5 -4
- package/dist/src/services/generator-prompt-seeds.js.map +1 -1
- package/dist/src/services/message-send.d.ts.map +1 -1
- package/dist/src/services/message-send.js +14 -0
- package/dist/src/services/message-send.js.map +1 -1
- package/dist/src/services/organism-search.d.ts +6 -2
- package/dist/src/services/organism-search.d.ts.map +1 -1
- package/dist/src/services/organism-search.js +2 -2
- package/dist/src/services/organism-search.js.map +1 -1
- package/dist/src/services/owner-memory.d.ts +1 -0
- package/dist/src/services/owner-memory.d.ts.map +1 -1
- package/dist/src/services/owner-memory.js.map +1 -1
- package/dist/src/services/owner-session.d.ts +1 -0
- package/dist/src/services/owner-session.d.ts.map +1 -1
- package/dist/src/services/owner-session.js +10 -2
- package/dist/src/services/owner-session.js.map +1 -1
- package/dist/src/services/package-seeder.d.ts +22 -0
- package/dist/src/services/package-seeder.d.ts.map +1 -0
- package/dist/src/services/package-seeder.js +30 -0
- package/dist/src/services/package-seeder.js.map +1 -0
- package/dist/src/services/presence.d.ts +3 -0
- package/dist/src/services/presence.d.ts.map +1 -1
- package/dist/src/services/presence.js +10 -0
- package/dist/src/services/presence.js.map +1 -1
- package/dist/src/services/prompt-defaults.d.ts.map +1 -1
- package/dist/src/services/prompt-defaults.js +8 -3
- package/dist/src/services/prompt-defaults.js.map +1 -1
- package/dist/src/services/scheduler.d.ts +41 -2
- package/dist/src/services/scheduler.d.ts.map +1 -1
- package/dist/src/services/scheduler.js +429 -26
- package/dist/src/services/scheduler.js.map +1 -1
- package/dist/src/services/secretary-authoring.d.ts +71 -0
- package/dist/src/services/secretary-authoring.d.ts.map +1 -0
- package/dist/src/services/secretary-authoring.js +336 -0
- package/dist/src/services/secretary-authoring.js.map +1 -0
- package/dist/src/services/secretary-clarify.d.ts +57 -0
- package/dist/src/services/secretary-clarify.d.ts.map +1 -0
- package/dist/src/services/secretary-clarify.js +104 -0
- package/dist/src/services/secretary-clarify.js.map +1 -0
- package/dist/src/services/secretary-feed.d.ts +11 -0
- package/dist/src/services/secretary-feed.d.ts.map +1 -0
- package/dist/src/services/secretary-feed.js +28 -0
- package/dist/src/services/secretary-feed.js.map +1 -0
- package/dist/src/services/secretary-tick.d.ts +243 -3
- package/dist/src/services/secretary-tick.d.ts.map +1 -1
- package/dist/src/services/secretary-tick.js +273 -3
- package/dist/src/services/secretary-tick.js.map +1 -1
- package/dist/src/services/specialist-runner.d.ts +36 -0
- package/dist/src/services/specialist-runner.d.ts.map +1 -0
- package/dist/src/services/specialist-runner.js +91 -0
- package/dist/src/services/specialist-runner.js.map +1 -0
- package/dist/src/services/specialist.d.ts +9 -0
- package/dist/src/services/specialist.d.ts.map +1 -1
- package/dist/src/services/specialist.js +42 -0
- package/dist/src/services/specialist.js.map +1 -1
- package/dist/src/services/structure-overview.d.ts +13 -0
- package/dist/src/services/structure-overview.d.ts.map +1 -1
- package/dist/src/services/structure-overview.js +34 -11
- package/dist/src/services/structure-overview.js.map +1 -1
- package/dist/src/services/system-agent-responder.d.ts +36 -0
- package/dist/src/services/system-agent-responder.d.ts.map +1 -0
- package/dist/src/services/system-agent-responder.js +107 -0
- package/dist/src/services/system-agent-responder.js.map +1 -0
- package/dist/src/services/system-agent.d.ts +34 -1
- package/dist/src/services/system-agent.d.ts.map +1 -1
- package/dist/src/services/system-agent.js +73 -0
- package/dist/src/services/system-agent.js.map +1 -1
- package/dist/src/storage/interface.d.ts +33 -0
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/interface.js.map +1 -1
- package/dist/src/storage/providers/mongodb/index.d.ts +37 -0
- package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.js +132 -12
- package/dist/src/storage/providers/mongodb/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/index.d.ts +23 -1
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +60 -8
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/memory.d.ts +29 -1
- package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/memory.js +109 -10
- package/dist/src/storage/providers/sqlite/repos/memory.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +64 -9
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/app.repository.d.ts +15 -0
- package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/memory.repository.d.ts +41 -1
- package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/organism.repository.d.ts +2 -1
- package/dist/src/storage/repositories/organism.repository.d.ts.map +1 -1
- package/dist/static/app-catalog.html +469 -122
- package/package.json +2 -1
- package/prisma/schema.postgres.prisma +10 -0
- package/prisma/schema.prisma +12 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file aimeat-i18n.js
|
|
3
|
+
* @description Bundled cortex library: lightweight i18n/localization helper for AIMEAT apps.
|
|
4
|
+
* Wraps translation loading (inline or from the user's own memory — translations are USER
|
|
5
|
+
* data), a flat-key-first `t()` with {var} interpolation, locale switching with persistence,
|
|
6
|
+
* a daisyUI-friendly LanguageSwitcher, and a data-i18n DOM applier. No backend, no hard deps;
|
|
7
|
+
* uses AIMEAT.data when present to load translations from memory.
|
|
8
|
+
* @structure AIMEAT.i18n.{init,t,setLocale,getLocale,locales,available,LanguageSwitcher,apply}
|
|
9
|
+
* @version-history
|
|
10
|
+
* v1.0.0 — 2026-06-26 — Initial: inline + memory-backed translations, switcher, DOM applier.
|
|
11
|
+
*/
|
|
12
|
+
(function (AIMEAT) {
|
|
13
|
+
'use strict';
|
|
14
|
+
|
|
15
|
+
var state = { keyBase: null, localeList: [], locale: 'en', dicts: {}, fallback: 'en' };
|
|
16
|
+
var STORE_KEY = 'aimeat-i18n-locale';
|
|
17
|
+
var styled = false;
|
|
18
|
+
|
|
19
|
+
function injectStyles() {
|
|
20
|
+
if (styled) return; styled = true;
|
|
21
|
+
var css =
|
|
22
|
+
'.aui-i18n-select{font-family:"DM Sans",system-ui,sans-serif;font-size:.875rem;' +
|
|
23
|
+
'padding:.35rem .6rem;border-radius:var(--radius-xs,6px);border:1px solid var(--border,#E5E7EB);' +
|
|
24
|
+
'background:var(--bg-card,#fff);color:var(--text,#1A1A2E);cursor:pointer;}';
|
|
25
|
+
var s = document.createElement('style'); s.setAttribute('data-aimeat', 'i18n'); s.textContent = css;
|
|
26
|
+
document.head.appendChild(s);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getPath(obj, path) {
|
|
30
|
+
var parts = String(path).split('.'); var o = obj;
|
|
31
|
+
for (var i = 0; i < parts.length; i++) { if (o == null) return null; o = o[parts[i]]; }
|
|
32
|
+
return o;
|
|
33
|
+
}
|
|
34
|
+
function interpolate(str, vars) {
|
|
35
|
+
if (!vars) return str;
|
|
36
|
+
return str.replace(/\{(\w+)\}/g, function (m, k) { return (vars[k] != null) ? vars[k] : m; });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Load a single locale's dictionary: inline first, then the user's memory (USER data).
|
|
40
|
+
function loadDict(locale) {
|
|
41
|
+
if (state.dicts[locale]) return Promise.resolve(state.dicts[locale]);
|
|
42
|
+
if (state.keyBase && AIMEAT.data && typeof AIMEAT.data.get === 'function') {
|
|
43
|
+
return Promise.resolve(AIMEAT.data.get(state.keyBase + '.' + locale))
|
|
44
|
+
.then(function (v) { if (v && typeof v === 'object') state.dicts[locale] = v; return state.dicts[locale] || {}; })
|
|
45
|
+
.catch(function () { return {}; });
|
|
46
|
+
}
|
|
47
|
+
return Promise.resolve({});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* init({ keyBase?, locales, default?, fallback?, translations? })
|
|
52
|
+
* - translations: optional inline map { en:{...}, fi:{...} } (used as-is, no memory read)
|
|
53
|
+
* - keyBase: memory key prefix; locale dicts read from `${keyBase}.${locale}` via AIMEAT.data
|
|
54
|
+
*/
|
|
55
|
+
function init(opts) {
|
|
56
|
+
opts = opts || {};
|
|
57
|
+
state.keyBase = opts.keyBase || null;
|
|
58
|
+
state.localeList = opts.locales || (opts.translations ? Object.keys(opts.translations) : ['en']);
|
|
59
|
+
state.fallback = opts.fallback || opts.default || state.localeList[0] || 'en';
|
|
60
|
+
if (opts.translations) state.dicts = Object.assign({}, opts.translations);
|
|
61
|
+
var saved = null;
|
|
62
|
+
try { saved = window.localStorage.getItem(STORE_KEY); } catch (e) { /* private mode */ }
|
|
63
|
+
state.locale = (saved && state.localeList.indexOf(saved) !== -1) ? saved : (opts.default || state.fallback);
|
|
64
|
+
return loadDict(state.locale).then(function () { return state.locale; });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function t(key, vars) {
|
|
68
|
+
var d = state.dicts[state.locale] || {};
|
|
69
|
+
var raw = (d[key] != null) ? d[key] : getPath(d, key);
|
|
70
|
+
if (raw == null) {
|
|
71
|
+
var fb = state.dicts[state.fallback] || {};
|
|
72
|
+
raw = (fb[key] != null) ? fb[key] : getPath(fb, key);
|
|
73
|
+
}
|
|
74
|
+
if (raw == null) raw = key;
|
|
75
|
+
return interpolate(String(raw), vars);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function setLocale(locale) {
|
|
79
|
+
if (state.localeList.indexOf(locale) === -1) return Promise.resolve(state.locale);
|
|
80
|
+
return loadDict(locale).then(function () {
|
|
81
|
+
state.locale = locale;
|
|
82
|
+
try { window.localStorage.setItem(STORE_KEY, locale); } catch (e) { /* ignore */ }
|
|
83
|
+
try { window.dispatchEvent(new CustomEvent('aimeat-i18n-changed', { detail: { locale: locale } })); } catch (e) { /* ignore */ }
|
|
84
|
+
return locale;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function getLocale() { return state.locale; }
|
|
89
|
+
function locales() { return state.localeList.slice(); }
|
|
90
|
+
function available() { return state.localeList.length > 0; }
|
|
91
|
+
|
|
92
|
+
// Translate every [data-i18n] element in root (textContent). Optional [data-i18n-attr].
|
|
93
|
+
function apply(root) {
|
|
94
|
+
var scope = root || document;
|
|
95
|
+
var nodes = scope.querySelectorAll('[data-i18n]');
|
|
96
|
+
for (var i = 0; i < nodes.length; i++) {
|
|
97
|
+
var n = nodes[i]; var key = n.getAttribute('data-i18n');
|
|
98
|
+
var attr = n.getAttribute('data-i18n-attr');
|
|
99
|
+
if (attr) n.setAttribute(attr, t(key)); else n.textContent = t(key);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function LanguageSwitcher(opts) {
|
|
104
|
+
opts = opts || {}; injectStyles();
|
|
105
|
+
var sel = document.createElement('select');
|
|
106
|
+
sel.className = 'aui-i18n-select ' + (opts.className || '');
|
|
107
|
+
state.localeList.forEach(function (loc) {
|
|
108
|
+
var o = document.createElement('option'); o.value = loc; o.textContent = (opts.labels && opts.labels[loc]) || loc.toUpperCase();
|
|
109
|
+
if (loc === state.locale) o.selected = true; sel.appendChild(o);
|
|
110
|
+
});
|
|
111
|
+
sel.addEventListener('change', function () {
|
|
112
|
+
setLocale(sel.value).then(function (loc) { if (typeof opts.onChange === 'function') opts.onChange(loc); });
|
|
113
|
+
});
|
|
114
|
+
if (opts.target) {
|
|
115
|
+
var tgt = (typeof opts.target === 'string') ? document.querySelector(opts.target) : opts.target;
|
|
116
|
+
if (tgt) tgt.appendChild(sel);
|
|
117
|
+
}
|
|
118
|
+
return { el: sel, destroy: function () { if (sel.parentNode) sel.parentNode.removeChild(sel); } };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
AIMEAT.i18n = { init: init, t: t, setLocale: setLocale, getLocale: getLocale, locales: locales, available: available, LanguageSwitcher: LanguageSwitcher, apply: apply };
|
|
122
|
+
AIMEAT['aimeat-i18n'] = AIMEAT.i18n;
|
|
123
|
+
})(window.AIMEAT || (window.AIMEAT = {}));
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
apiVersion: cortex.aimeat.org/v1
|
|
2
|
+
kind: Extension
|
|
3
|
+
metadata:
|
|
4
|
+
name: aimeat-i18n
|
|
5
|
+
namespace: aimeat
|
|
6
|
+
description: "Localization helper — load translations (inline or from the user's own memory), translate with flat-key-first t() + {var} interpolation, switch locale with persistence, and a LanguageSwitcher UI."
|
|
7
|
+
author: AIMEAT
|
|
8
|
+
tags: [i18n, localization, translation, locale, multilanguage, components]
|
|
9
|
+
labels:
|
|
10
|
+
domain: i18n
|
|
11
|
+
visibility: public
|
|
12
|
+
|
|
13
|
+
spec:
|
|
14
|
+
version: "1.0.0"
|
|
15
|
+
license: MIT
|
|
16
|
+
components:
|
|
17
|
+
- type: prompt
|
|
18
|
+
name: i18n-assistant
|
|
19
|
+
content: |
|
|
20
|
+
You are helping build an app that has the aimeat-i18n cortex installed.
|
|
21
|
+
Use AIMEAT.i18n for ALL user-visible text — never hardcode display strings.
|
|
22
|
+
|
|
23
|
+
Setup (once, at boot):
|
|
24
|
+
await AIMEAT.i18n.init({
|
|
25
|
+
locales: ['en', 'fi'],
|
|
26
|
+
default: 'en',
|
|
27
|
+
// EITHER inline translations:
|
|
28
|
+
translations: { en: { 'greeting': 'Hello {name}' }, fi: { 'greeting': 'Hei {name}' } }
|
|
29
|
+
// OR memory-backed (translations are USER data): keyBase: 'myapp.i18n'
|
|
30
|
+
// → reads `myapp.i18n.en`, `myapp.i18n.fi` via AIMEAT.data.get()
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
Translate:
|
|
34
|
+
AIMEAT.i18n.t('greeting', { name: 'Alice' }) // flat key first, then nested dot-path, then fallback locale, then the key itself
|
|
35
|
+
// Flat keys win: a generator producing { "tab.search": "Haku" } resolves before a nested { tab: { search } }.
|
|
36
|
+
|
|
37
|
+
Switch language:
|
|
38
|
+
AIMEAT.i18n.LanguageSwitcher({ target: '#lang', onChange: render }) // renders a <select>; persists choice
|
|
39
|
+
AIMEAT.i18n.setLocale('fi') // emits window 'aimeat-i18n-changed'
|
|
40
|
+
window.addEventListener('aimeat-i18n-changed', render) // re-render on change
|
|
41
|
+
|
|
42
|
+
Static markup:
|
|
43
|
+
<span data-i18n="greeting"></span> then AIMEAT.i18n.apply() // fills textContent of every [data-i18n]
|
|
44
|
+
|
|
45
|
+
Notes:
|
|
46
|
+
- Translations are USER data — load them via AIMEAT.data (keyBase), NOT from an ext: namespace.
|
|
47
|
+
- t() always returns a string (falls back to the key) so the UI never shows blanks.
|
|
48
|
+
Load via: <script src="{{node_url}}/v1/cortex/aimeat-i18n/libs/aimeat-i18n.js"></script>
|
|
49
|
+
variables:
|
|
50
|
+
- "{{node_url}}"
|
|
51
|
+
|
|
52
|
+
- type: lib
|
|
53
|
+
name: aimeat-i18n
|
|
54
|
+
filename: aimeat-i18n.js
|
|
55
|
+
exports: [init, t, setLocale, getLocale, locales, available, LanguageSwitcher, apply]
|
|
56
|
+
api_surface: |
|
|
57
|
+
AIMEAT.i18n.init({ keyBase?, locales, default?, fallback?, translations? }) → Promise<locale> (inline translations OR memory-backed via keyBase)
|
|
58
|
+
AIMEAT.i18n.t(key, vars?) → string (flat key → nested dot-path → fallback locale → key; {var} interpolation)
|
|
59
|
+
AIMEAT.i18n.setLocale(locale) → Promise<locale> (persists choice; emits window 'aimeat-i18n-changed')
|
|
60
|
+
AIMEAT.i18n.getLocale() → string
|
|
61
|
+
AIMEAT.i18n.locales() → string[]
|
|
62
|
+
AIMEAT.i18n.available() → boolean
|
|
63
|
+
AIMEAT.i18n.LanguageSwitcher({ target?, onChange?, labels?, className? }) → { el, destroy() }
|
|
64
|
+
AIMEAT.i18n.apply(root?) → void (translates every [data-i18n] element's textContent, or [data-i18n-attr])
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
.ld-hero2-sub { color: var(--text-dim); font-size: 1rem; max-width: 560px; margin: 1rem auto .25rem; }
|
|
32
32
|
.ld-hero2-cta { display: flex; gap: .8rem; justify-content: center; flex-wrap: wrap; margin-top: 1.1rem; }
|
|
33
33
|
.ld-hero2-cta a { text-decoration: none; }
|
|
34
|
+
.ld-hero2-after { color: var(--text-dim); font-size: .9rem; max-width: 560px; margin: .9rem auto 0; }
|
|
35
|
+
.ld-hero2-after a { color: var(--accent); font-weight: 600; }
|
|
34
36
|
.ld-hero { text-align: center; padding: 2.5rem 0 1.25rem; }
|
|
35
37
|
.ld-h1 { font-size: 2.1rem; font-weight: 800; letter-spacing: -0.5px; margin: 0 0 .6rem; }
|
|
36
38
|
.ld-hero-sub { color: var(--text-dim); font-size: 1.05rem; margin: 0; }
|
|
@@ -3,13 +3,24 @@
|
|
|
3
3
|
* @description Styles for the Secretary view (Phase 0 shell) and the header Secretary button.
|
|
4
4
|
* Prefix `sec-`. Dark/light safe — uses theme tokens only, no hardcoded colors.
|
|
5
5
|
* @version-history
|
|
6
|
+
* v0.11.0 — 2026-06-28 — .sec-strategy: steering card (vision/mission/principles/risks + current→target
|
|
7
|
+
* band + ordered milestone gates with status pills + focus highlight + goal-link details).
|
|
8
|
+
* v0.10.0 — 2026-06-28 — .sec-danger: Reset Secretary card (danger-tinted border).
|
|
9
|
+
* v0.9.0 — 2026-06-28 — Bound triggers: .sec-trig-bound badge + .sec-trig-actlabel spacing.
|
|
10
|
+
* v0.8.0 — 2026-06-28 — B5 action-items: dashboard action-item rows (one-click handle / dismiss).
|
|
11
|
+
* v0.7.0 — 2026-06-28 — B4 delegation: delegate step control (agent picker + delegate button).
|
|
12
|
+
* v0.6.0 — 2026-06-27 — B3 dynamic quick actions: ✎ manager panel, proposed/active shortcut rows.
|
|
13
|
+
* v0.5.0 — 2026-06-27 — B2 Routines + "What's next": routine + step rows, band tags, dashboard
|
|
14
|
+
* routines list.
|
|
15
|
+
* v0.4.0 — 2026-06-27 — B1 dashboard-first IA: quick-action row, "Today" status strip + chips,
|
|
16
|
+
* where-things-stand panel, and the collapsible "Manage & setup" disclosure header.
|
|
6
17
|
* v0.3.0 — 2026-06-25 — `.sec-consent` specialist scope-consent checklist (declare → consent → grant).
|
|
7
18
|
* v0.2.0 — 2026-06-24 — P3-A: doc/image attach control + status line in the chat input row.
|
|
8
19
|
* v0.1.0 — 2026-06-23 — Phase 0: hero + provisioning status card + header button/icon.
|
|
9
20
|
*/
|
|
10
21
|
|
|
11
22
|
.sec {
|
|
12
|
-
max-width:
|
|
23
|
+
max-width: 1280px;
|
|
13
24
|
margin: 0 auto;
|
|
14
25
|
padding: 2rem 1rem;
|
|
15
26
|
}
|
|
@@ -301,7 +312,31 @@
|
|
|
301
312
|
.sec-score.mid { background: var(--bg-dim); color: var(--warning); }
|
|
302
313
|
.sec-score.bad { background: var(--danger-bg); color: var(--danger-fg); }
|
|
303
314
|
|
|
304
|
-
/* Home feed (4) */
|
|
315
|
+
/* Home feed (4) + day grouping (G10) */
|
|
316
|
+
.sec-feed-day + .sec-feed-day { margin-top: 0.5rem; }
|
|
317
|
+
.sec-feed-day-head {
|
|
318
|
+
display: flex;
|
|
319
|
+
align-items: center;
|
|
320
|
+
gap: 0.4rem;
|
|
321
|
+
font-size: 0.78rem;
|
|
322
|
+
font-weight: 600;
|
|
323
|
+
color: var(--text-dim);
|
|
324
|
+
text-transform: uppercase;
|
|
325
|
+
letter-spacing: 0.03em;
|
|
326
|
+
padding: 0.5rem 0 0.25rem;
|
|
327
|
+
border-bottom: 1px solid var(--border);
|
|
328
|
+
position: sticky;
|
|
329
|
+
top: 0;
|
|
330
|
+
background: var(--card);
|
|
331
|
+
}
|
|
332
|
+
.sec-feed-day-count {
|
|
333
|
+
font-weight: 400;
|
|
334
|
+
font-size: 0.7rem;
|
|
335
|
+
padding: 0.05rem 0.4rem;
|
|
336
|
+
border-radius: 999px;
|
|
337
|
+
background: var(--bg-dim);
|
|
338
|
+
color: var(--text-dim);
|
|
339
|
+
}
|
|
305
340
|
.sec-feed-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.6rem; }
|
|
306
341
|
.sec-feed-item { padding: 0.5rem 0; border-top: 1px solid var(--border); }
|
|
307
342
|
.sec-feed-meta { font-size: 0.72rem; color: var(--text-dim); margin-bottom: 0.2rem; }
|
|
@@ -606,3 +641,378 @@
|
|
|
606
641
|
width: 18px;
|
|
607
642
|
height: 18px;
|
|
608
643
|
}
|
|
644
|
+
|
|
645
|
+
/* metaCard: link from the read-only Permissions chips to the agent's scope editor in Agents view */
|
|
646
|
+
.sec-perm-link { display: inline-block; margin-top: 0.4rem; font-size: 0.78rem; color: var(--accent); text-decoration: none; }
|
|
647
|
+
.sec-perm-link:hover { text-decoration: underline; }
|
|
648
|
+
|
|
649
|
+
/* ── B1 dashboard-first IA ── */
|
|
650
|
+
/* Quick-action row (core + later dynamic) */
|
|
651
|
+
.sec-quick {
|
|
652
|
+
display: flex;
|
|
653
|
+
flex-wrap: wrap;
|
|
654
|
+
gap: 0.5rem;
|
|
655
|
+
margin-bottom: 1rem;
|
|
656
|
+
}
|
|
657
|
+
.sec-quick-btn { white-space: nowrap; }
|
|
658
|
+
|
|
659
|
+
/* The Secretary view stacks its cards; give every card breathing room (was per-card before B1). */
|
|
660
|
+
.sec-card + .sec-card,
|
|
661
|
+
.sec-quick + .sec-card { margin-top: 1rem; }
|
|
662
|
+
|
|
663
|
+
/* "Today" status strip */
|
|
664
|
+
.sec-dash-strip {
|
|
665
|
+
display: flex;
|
|
666
|
+
flex-wrap: wrap;
|
|
667
|
+
gap: 0.5rem 0.75rem;
|
|
668
|
+
}
|
|
669
|
+
.sec-chip {
|
|
670
|
+
display: flex;
|
|
671
|
+
flex-direction: column;
|
|
672
|
+
gap: 0.1rem;
|
|
673
|
+
padding: 0.5rem 0.75rem;
|
|
674
|
+
border: 1px solid var(--border);
|
|
675
|
+
border-radius: var(--radius-sm, 8px);
|
|
676
|
+
background: var(--bg-dim);
|
|
677
|
+
min-width: 8rem;
|
|
678
|
+
}
|
|
679
|
+
.sec-chip.stale { border-color: var(--warning); }
|
|
680
|
+
.sec-chip-k { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--text-dim); }
|
|
681
|
+
.sec-chip-v { color: var(--text); font-size: 0.9rem; font-weight: 600; }
|
|
682
|
+
.sec-chip-v .sec-hint { font-weight: 400; }
|
|
683
|
+
.sec-chip-badge {
|
|
684
|
+
font-size: 0.68rem;
|
|
685
|
+
font-weight: 600;
|
|
686
|
+
padding: 0.05rem 0.4rem;
|
|
687
|
+
border-radius: 999px;
|
|
688
|
+
background: var(--bg-dim);
|
|
689
|
+
border: 1px solid var(--warning);
|
|
690
|
+
color: var(--warning);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/* Where-things-stand orientation panel */
|
|
694
|
+
.sec-stand-body {
|
|
695
|
+
color: var(--text);
|
|
696
|
+
font-size: 0.9rem;
|
|
697
|
+
line-height: 1.5;
|
|
698
|
+
white-space: pre-wrap;
|
|
699
|
+
word-break: break-word;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/* Manage & setup disclosure */
|
|
703
|
+
.sec-manage-toggle {
|
|
704
|
+
display: flex;
|
|
705
|
+
align-items: center;
|
|
706
|
+
justify-content: space-between;
|
|
707
|
+
gap: 0.75rem;
|
|
708
|
+
width: 100%;
|
|
709
|
+
padding: 0;
|
|
710
|
+
border: 0;
|
|
711
|
+
background: transparent;
|
|
712
|
+
color: var(--text);
|
|
713
|
+
cursor: pointer;
|
|
714
|
+
font-size: 1rem;
|
|
715
|
+
font-weight: 600;
|
|
716
|
+
}
|
|
717
|
+
.sec-manage-title { color: var(--text); }
|
|
718
|
+
.sec-manage-meta { color: var(--text-dim); font-size: 0.85rem; font-weight: 400; }
|
|
719
|
+
.sec-manage-hint { margin: 0.4rem 0 0; }
|
|
720
|
+
|
|
721
|
+
/* ── B2 Routines + "What's next" ── */
|
|
722
|
+
/* Dashboard routines list */
|
|
723
|
+
.sec-routine-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
|
|
724
|
+
.sec-routine-row {
|
|
725
|
+
display: flex;
|
|
726
|
+
align-items: center;
|
|
727
|
+
gap: 0.75rem;
|
|
728
|
+
padding: 0.5rem 0;
|
|
729
|
+
border-top: 1px solid var(--border);
|
|
730
|
+
}
|
|
731
|
+
.sec-routine-row:first-child { border-top: 0; }
|
|
732
|
+
.sec-routine-main { flex: 1; min-width: 0; }
|
|
733
|
+
.sec-routine-title { color: var(--text); font-weight: 600; font-size: 0.92rem; }
|
|
734
|
+
|
|
735
|
+
/* What's-next working card: routine detail + steps */
|
|
736
|
+
.sec-routine-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.75rem; margin-bottom: 0.5rem; }
|
|
737
|
+
/* G2: recurrence picker + dashboard badge */
|
|
738
|
+
.sec-routine-cadence { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 0.5rem; }
|
|
739
|
+
.sec-cadence-badge {
|
|
740
|
+
font-size: 0.66rem;
|
|
741
|
+
text-transform: uppercase;
|
|
742
|
+
letter-spacing: 0.03em;
|
|
743
|
+
padding: 0.05rem 0.4rem;
|
|
744
|
+
border-radius: var(--radius-xs, 6px);
|
|
745
|
+
background: var(--accent-subtle);
|
|
746
|
+
color: var(--accent);
|
|
747
|
+
vertical-align: middle;
|
|
748
|
+
}
|
|
749
|
+
.sec-routine-actions { gap: 0.5rem; }
|
|
750
|
+
.sec-step-list { list-style: none; margin: 0.5rem 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
|
|
751
|
+
.sec-step-row {
|
|
752
|
+
display: flex;
|
|
753
|
+
align-items: flex-start;
|
|
754
|
+
gap: 0.6rem;
|
|
755
|
+
padding: 0.5rem 0;
|
|
756
|
+
border-top: 1px solid var(--border);
|
|
757
|
+
}
|
|
758
|
+
.sec-step-row.done, .sec-step-row.skipped { opacity: 0.7; }
|
|
759
|
+
.sec-step-main { flex: 1; min-width: 0; }
|
|
760
|
+
.sec-step-tags { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-bottom: 0.2rem; }
|
|
761
|
+
.sec-step-cap {
|
|
762
|
+
font-size: 0.68rem;
|
|
763
|
+
text-transform: uppercase;
|
|
764
|
+
letter-spacing: 0.03em;
|
|
765
|
+
padding: 0.1rem 0.45rem;
|
|
766
|
+
border-radius: var(--radius-xs, 6px);
|
|
767
|
+
background: var(--accent-subtle);
|
|
768
|
+
color: var(--accent);
|
|
769
|
+
}
|
|
770
|
+
.sec-band-tag {
|
|
771
|
+
font-size: 0.68rem;
|
|
772
|
+
padding: 0.1rem 0.45rem;
|
|
773
|
+
border-radius: var(--radius-xs, 6px);
|
|
774
|
+
border: 1px solid var(--border);
|
|
775
|
+
background: var(--bg-dim);
|
|
776
|
+
color: var(--text-dim);
|
|
777
|
+
}
|
|
778
|
+
.sec-band-tag.band-act { border-color: var(--success, #3fb950); color: var(--success, #3fb950); }
|
|
779
|
+
.sec-band-tag.band-off { opacity: 0.7; }
|
|
780
|
+
.sec-step-summary { color: var(--text); font-size: 0.9rem; }
|
|
781
|
+
.sec-step-status { font-size: 0.78rem; color: var(--text-dim); white-space: nowrap; }
|
|
782
|
+
.sec-step-status.sec-done { color: var(--success, #3fb950); }
|
|
783
|
+
.sec-step-status.sec-delegated { color: var(--accent); }
|
|
784
|
+
|
|
785
|
+
/* B4 delegate step control (agent picker + delegate button) */
|
|
786
|
+
.sec-delegate { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; justify-content: flex-end; }
|
|
787
|
+
|
|
788
|
+
/* B5 action-items (tick-derived follow-ups on the dashboard) */
|
|
789
|
+
.sec-item-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
|
|
790
|
+
.sec-item-row {
|
|
791
|
+
display: flex;
|
|
792
|
+
align-items: center;
|
|
793
|
+
justify-content: space-between;
|
|
794
|
+
gap: 0.75rem;
|
|
795
|
+
padding: 0.5rem 0.6rem;
|
|
796
|
+
border: 1px solid var(--border);
|
|
797
|
+
border-left: 3px solid var(--accent);
|
|
798
|
+
border-radius: var(--radius-sm, 8px);
|
|
799
|
+
background: var(--bg-dim);
|
|
800
|
+
}
|
|
801
|
+
.sec-item-text { color: var(--text); font-size: 0.9rem; min-width: 0; }
|
|
802
|
+
.sec-item-actions { display: flex; gap: 0.4rem; flex: 0 0 auto; }
|
|
803
|
+
|
|
804
|
+
/* ── B3 dynamic quick actions (✎ manager) ── */
|
|
805
|
+
.sec-qa-manage { margin-top: 1rem; }
|
|
806
|
+
.sec-qa-list { list-style: none; margin: 0.4rem 0 0.75rem; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
|
|
807
|
+
.sec-qa-row {
|
|
808
|
+
display: flex;
|
|
809
|
+
align-items: center;
|
|
810
|
+
gap: 0.4rem;
|
|
811
|
+
padding: 0.5rem 0;
|
|
812
|
+
border-top: 1px solid var(--border);
|
|
813
|
+
}
|
|
814
|
+
.sec-qa-row:first-child { border-top: 0; }
|
|
815
|
+
.sec-qa-row.proposed {
|
|
816
|
+
border: 1px dashed var(--accent);
|
|
817
|
+
border-radius: var(--radius-sm, 8px);
|
|
818
|
+
background: var(--accent-subtle);
|
|
819
|
+
padding: 0.5rem 0.6rem;
|
|
820
|
+
}
|
|
821
|
+
.sec-qa-main { flex: 1; min-width: 0; }
|
|
822
|
+
.sec-qa-label { color: var(--text); font-size: 0.9rem; font-weight: 600; }
|
|
823
|
+
.sec-qa-kind {
|
|
824
|
+
font-size: 0.66rem;
|
|
825
|
+
text-transform: uppercase;
|
|
826
|
+
letter-spacing: 0.03em;
|
|
827
|
+
margin-left: 0.4rem;
|
|
828
|
+
padding: 0.05rem 0.4rem;
|
|
829
|
+
border-radius: var(--radius-xs, 6px);
|
|
830
|
+
background: var(--bg-dim);
|
|
831
|
+
border: 1px solid var(--border);
|
|
832
|
+
color: var(--text-dim);
|
|
833
|
+
font-weight: 400;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
/* ── Calendar (Decision B): month / week / day of the Secretary's schedule ── */
|
|
837
|
+
.sec-cal-nav { display: flex; gap: 0.75rem; align-items: center; flex-wrap: wrap; }
|
|
838
|
+
.sec-cal-modes, .sec-cal-move { display: inline-flex; gap: 0.25rem; }
|
|
839
|
+
.sec-cal-range { width: 100%; color: var(--text-dim); font-size: 0.85rem; margin-top: 0.25rem; }
|
|
840
|
+
.sec-cal-weekrow { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-top: 0.5rem; }
|
|
841
|
+
.sec-cal-wd { font-size: 0.72rem; color: var(--text-dim); text-align: center; padding: 0.2rem 0; }
|
|
842
|
+
.sec-cal-month { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
|
|
843
|
+
.sec-cal-cell { min-height: 64px; display: flex; flex-direction: column; align-items: stretch; gap: 0.15rem; padding: 0.25rem; background: var(--bg-dim); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; text-align: left; }
|
|
844
|
+
.sec-cal-cell:hover { border-color: var(--accent); }
|
|
845
|
+
.sec-cal-cell--dim { opacity: 0.45; }
|
|
846
|
+
.sec-cal-cell--today { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
|
|
847
|
+
.sec-cal-daynum { font-size: 0.78rem; color: var(--text); font-weight: 600; }
|
|
848
|
+
.sec-cal-cell-evs { display: flex; flex-direction: column; gap: 1px; overflow: hidden; }
|
|
849
|
+
.sec-cal-more { font-size: 0.68rem; color: var(--text-dim); }
|
|
850
|
+
.sec-cal-week { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-top: 0.5rem; }
|
|
851
|
+
.sec-cal-weekcol { background: var(--bg-dim); border: 1px solid var(--border); border-radius: 6px; min-height: 120px; display: flex; flex-direction: column; }
|
|
852
|
+
.sec-cal-weekcol--today { border-color: var(--accent); }
|
|
853
|
+
.sec-cal-weekcol-head { display: flex; flex-direction: column; align-items: center; gap: 0.1rem; padding: 0.3rem; background: transparent; border: 0; border-bottom: 1px solid var(--border); cursor: pointer; }
|
|
854
|
+
.sec-cal-weekcol-evs { display: flex; flex-direction: column; gap: 2px; padding: 0.25rem; }
|
|
855
|
+
.sec-cal-day { display: flex; flex-direction: column; gap: 1px; margin-top: 0.5rem; }
|
|
856
|
+
.sec-cal-hourrow { display: grid; grid-template-columns: 3.2rem 1fr; gap: 0.5rem; align-items: start; min-height: 1.9rem; border-top: 1px solid var(--border); padding-top: 0.2rem; }
|
|
857
|
+
.sec-cal-bucket { display: grid; grid-template-columns: 3.2rem 1fr; gap: 0.5rem; align-items: start; margin: 0.3rem 0; }
|
|
858
|
+
.sec-cal-hour { font-size: 0.72rem; color: var(--text-dim); padding-top: 0.15rem; }
|
|
859
|
+
.sec-cal-hour-evs { display: flex; flex-direction: column; gap: 2px; }
|
|
860
|
+
.sec-cal-ev { font-size: 0.72rem; padding: 0.1rem 0.35rem; border-radius: 4px; border-left: 2px solid var(--border); background: var(--card); color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
861
|
+
.sec-cal-ev--scheduled { border-left-color: var(--accent); }
|
|
862
|
+
.sec-cal-ev--done { opacity: 0.7; border-left-color: var(--success, #3fb950); }
|
|
863
|
+
.sec-cal-ev--routine { border-left-color: var(--warning, #d29922); }
|
|
864
|
+
.sec-cal-evtime { color: var(--text-dim); }
|
|
865
|
+
.sec-cal-empty { text-align: center; padding: 0.4rem; }
|
|
866
|
+
|
|
867
|
+
/* ── Direct brain editor (Decision C2) ── */
|
|
868
|
+
.sec-brain-actions { display: inline-flex; gap: 0.25rem; }
|
|
869
|
+
.sec-rule-edit { list-style: none; margin: 0.25rem 0; padding: 0; display: flex; flex-direction: column; gap: 0.3rem; }
|
|
870
|
+
.sec-rule-row { display: flex; gap: 0.4rem; align-items: center; }
|
|
871
|
+
.sec-rule-row .sec-input { flex: 1; }
|
|
872
|
+
|
|
873
|
+
/* Calendar layout fix: equal day columns + contain long event text (grid/flex children need min-width:0,
|
|
874
|
+
else a nowrap event string forces its column wide and the 7 columns go uneven). */
|
|
875
|
+
.sec-cal-week { grid-template-columns: repeat(7, minmax(0, 1fr)); }
|
|
876
|
+
.sec-cal-month { grid-template-columns: repeat(7, minmax(0, 1fr)); }
|
|
877
|
+
.sec-cal-weekcol, .sec-cal-weekcol-evs, .sec-cal-hour-evs, .sec-cal-cell, .sec-cal-cell-evs { min-width: 0; }
|
|
878
|
+
.sec-cal-ev { display: block; max-width: 100%; box-sizing: border-box; }
|
|
879
|
+
.sec-cal-hourrow, .sec-cal-bucket { grid-template-columns: 3.2rem minmax(0, 1fr); }
|
|
880
|
+
|
|
881
|
+
/* "What's next" actionable proposals (Do it / Skip) */
|
|
882
|
+
.sec-next-actions { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.4rem; }
|
|
883
|
+
.sec-next-action { display: flex; gap: 0.6rem; align-items: flex-start; justify-content: space-between; padding: 0.5rem 0; border-top: 1px solid var(--border); }
|
|
884
|
+
.sec-next-action:first-child { border-top: 0; }
|
|
885
|
+
.sec-next-action-main { flex: 1; min-width: 0; }
|
|
886
|
+
.sec-next-action-sum { color: var(--text); font-size: 0.92rem; }
|
|
887
|
+
.sec-next-action-btns { display: inline-flex; gap: 0.3rem; flex: 0 0 auto; }
|
|
888
|
+
.sec-next-action--done .sec-next-action-sum, .sec-next-action--skipped .sec-next-action-sum { color: var(--text-dim); }
|
|
889
|
+
.sec-next-action--skipped .sec-next-action-sum { text-decoration: line-through; }
|
|
890
|
+
|
|
891
|
+
/* Triggers (Slice 3) */
|
|
892
|
+
.sec-trig-list { list-style: none; margin: 0.25rem 0; padding: 0; display: flex; flex-direction: column; gap: 0.35rem; }
|
|
893
|
+
.sec-trig-row { display: flex; gap: 0.6rem; align-items: center; justify-content: space-between; padding: 0.4rem 0; border-top: 1px solid var(--border); }
|
|
894
|
+
.sec-trig-row:first-child { border-top: 0; }
|
|
895
|
+
.sec-trig-row.paused { opacity: 0.6; }
|
|
896
|
+
.sec-trig-main { flex: 1; min-width: 0; }
|
|
897
|
+
.sec-trig-label { color: var(--text); font-size: 0.9rem; }
|
|
898
|
+
.sec-trig-bound { color: var(--accent); font-size: 0.8rem; white-space: nowrap; }
|
|
899
|
+
.sec-trig-btns { display: inline-flex; gap: 0.25rem; flex: 0 0 auto; }
|
|
900
|
+
.sec-trig-form { margin-top: 0.5rem; }
|
|
901
|
+
.sec-trig-actlabel { display: block; margin-top: 0.35rem; }
|
|
902
|
+
.sec-cal-ev--trigger { border-left-color: var(--accent); }
|
|
903
|
+
.sec-danger { border-color: var(--danger, #e8564a); }
|
|
904
|
+
.sec-danger .sec-warn { color: var(--danger, #e8564a); font-weight: 600; }
|
|
905
|
+
|
|
906
|
+
/* Strategy — steering card (vision/mission/principles/risks + current → target + milestone gates) */
|
|
907
|
+
.sec-dir-line { margin: 0.15rem 0; font-size: 0.9rem; color: var(--text); }
|
|
908
|
+
.sec-dir-bul { margin: 0.15rem 0 0.35rem; padding-left: 1.1rem; }
|
|
909
|
+
.sec-dir-bul li { font-size: 0.85rem; color: var(--text); }
|
|
910
|
+
.sec-dir-goals { margin-top: 0.25rem; }
|
|
911
|
+
.sec-dir-goals summary { cursor: pointer; }
|
|
912
|
+
.sec-dir-goal-opt { display: block; margin: 0.15rem 0; }
|
|
913
|
+
.sec-strategy .sec-dir-state { display: flex; flex-direction: column; gap: 0.25rem; margin: 0.25rem 0 0.5rem; }
|
|
914
|
+
.sec-dir-lbl { display: inline-block; min-width: 3.5rem; color: var(--text-dim); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.03em; }
|
|
915
|
+
.sec-dir-arrow { color: var(--text-dim); font-size: 0.85rem; padding-left: 0.25rem; }
|
|
916
|
+
.sec-dir-ms { list-style: none; margin: 0.25rem 0 0.5rem; padding: 0; display: flex; flex-direction: column; gap: 0.35rem; }
|
|
917
|
+
.sec-dir-ms-row { display: flex; align-items: flex-start; gap: 0.5rem; padding: 0.4rem 0.5rem; border: 1px solid var(--border); border-radius: var(--radius-sm, 8px); background: var(--bg-dim); }
|
|
918
|
+
.sec-dir-ms-row.focus { border-color: var(--accent); }
|
|
919
|
+
.sec-dir-ms-row.reached { opacity: 0.6; }
|
|
920
|
+
.sec-dir-ms-main { flex: 1; min-width: 0; }
|
|
921
|
+
.sec-dir-ms-title { color: var(--text); font-size: 0.9rem; }
|
|
922
|
+
.sec-dir-focus { color: var(--accent); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.03em; }
|
|
923
|
+
.sec-dir-pill { flex: 0 0 auto; border: 1px solid var(--border); border-radius: 999px; padding: 0.1rem 0.55rem; font-size: 0.72rem; cursor: pointer; background: var(--surface); color: var(--text-dim); }
|
|
924
|
+
.sec-dir-pill.sec-dir-in-progress { color: var(--accent); border-color: var(--accent); }
|
|
925
|
+
.sec-dir-pill.sec-dir-reached { color: var(--success, #4caf50); border-color: var(--success, #4caf50); }
|
|
926
|
+
.sec-dir-off { margin-top: 0.25rem; color: var(--text-dim); }
|
|
927
|
+
|
|
928
|
+
/* Feed entry link ("What I've done" → open the result) */
|
|
929
|
+
.sec-feed-link { display: inline-block; margin-top: 0.2rem; font-size: 0.78rem; color: var(--accent); text-decoration: none; }
|
|
930
|
+
.sec-feed-link:hover { text-decoration: underline; }
|
|
931
|
+
|
|
932
|
+
/* "Where things stand" — timestamp + inline refresh + linkified mentions */
|
|
933
|
+
.sec-stand-when { margin-bottom: 0.5rem; }
|
|
934
|
+
.sec-linkbtn { background: none; border: 0; padding: 0; color: var(--accent); cursor: pointer; font: inherit; text-decoration: underline; }
|
|
935
|
+
.sec-stand-body a { color: var(--accent); }
|
|
936
|
+
|
|
937
|
+
/* What's next — inline deliverable preview (show the produced content without navigating) */
|
|
938
|
+
.sec-next-toggle { margin-top: 0.35rem; }
|
|
939
|
+
.sec-next-preview { margin-top: 0.4rem; padding: 0.6rem 0.8rem; background: var(--bg-dim); border: 1px solid var(--border); border-radius: 8px; max-height: 22rem; overflow: auto; }
|
|
940
|
+
.sec-next-preview .md-body { font-size: 0.9rem; }
|
|
941
|
+
|
|
942
|
+
/* ── Customizable two-column dashboard (use-layout.js) ─────────────────────────────────────
|
|
943
|
+
Wide screens: main column + sticky right rail. Narrow: collapses to one column (order kept). */
|
|
944
|
+
.sec-grid {
|
|
945
|
+
display: grid;
|
|
946
|
+
grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
|
|
947
|
+
gap: 1rem;
|
|
948
|
+
align-items: start;
|
|
949
|
+
margin-top: 1rem;
|
|
950
|
+
}
|
|
951
|
+
.sec-col { min-width: 0; display: flex; flex-direction: column; gap: 1rem; }
|
|
952
|
+
.sec-col-right { position: sticky; top: 1rem; }
|
|
953
|
+
@media (max-width: 1100px) {
|
|
954
|
+
.sec-grid { grid-template-columns: 1fr; }
|
|
955
|
+
.sec-col-right { position: static; }
|
|
956
|
+
}
|
|
957
|
+
/* Cards already carry their own spacing internally; the column gap owns inter-card spacing. */
|
|
958
|
+
.sec-col .sec-card, .sec-col .sec-status { margin-bottom: 0; }
|
|
959
|
+
|
|
960
|
+
/* Per-card arrange handle (⋮): reveal on hover (desktop), always visible on touch. */
|
|
961
|
+
.sec-lc { position: relative; }
|
|
962
|
+
.sec-lc-menu { position: absolute; top: 0.5rem; right: 0.5rem; z-index: 6; }
|
|
963
|
+
.sec-lc-btn {
|
|
964
|
+
width: 1.6rem; height: 1.6rem; border-radius: 6px; border: 1px solid var(--border);
|
|
965
|
+
background: var(--surface); color: var(--text-dim); cursor: pointer; line-height: 1;
|
|
966
|
+
opacity: 0; transition: opacity 0.12s;
|
|
967
|
+
}
|
|
968
|
+
.sec-lc:hover .sec-lc-btn, .sec-lc-menu.open .sec-lc-btn { opacity: 1; }
|
|
969
|
+
.sec-lc-btn:hover { color: var(--text); border-color: var(--accent); }
|
|
970
|
+
.sec-lc-pop {
|
|
971
|
+
position: absolute; top: 1.9rem; right: 0; min-width: 12rem; z-index: 7;
|
|
972
|
+
background: var(--card); border: 1px solid var(--border); border-radius: 8px;
|
|
973
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35); display: flex; flex-direction: column; padding: 0.25rem;
|
|
974
|
+
}
|
|
975
|
+
.sec-lc-pop button { text-align: left; background: none; border: 0; color: var(--text); padding: 0.4rem 0.6rem; border-radius: 6px; cursor: pointer; font: inherit; }
|
|
976
|
+
.sec-lc-pop button:hover:not(:disabled) { background: var(--bg-dim); }
|
|
977
|
+
.sec-lc-pop button:disabled { color: var(--text-dim); cursor: default; }
|
|
978
|
+
.sec-lc-pop .sec-lc-hide { color: var(--danger, #e8564a); }
|
|
979
|
+
@media (hover: none) { .sec-lc-btn { opacity: 1; } }
|
|
980
|
+
|
|
981
|
+
/* Layout toolbar: reset + restore hidden sections. */
|
|
982
|
+
.sec-layout-bar { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; margin-top: 1rem; }
|
|
983
|
+
.sec-chip { background: var(--bg-dim); border: 1px solid var(--border); border-radius: 999px; padding: 0.25rem 0.7rem; font-size: 0.8rem; color: var(--text); cursor: pointer; }
|
|
984
|
+
.sec-chip:hover { border-color: var(--accent); }
|
|
985
|
+
|
|
986
|
+
.sec-next-discard { color: var(--danger, #e8564a); }
|
|
987
|
+
|
|
988
|
+
/* Quality pipeline: verify warnings + prompt-driven fallback block */
|
|
989
|
+
.sec-warn { color: var(--warning, #d29922); }
|
|
990
|
+
.sec-next-prompt { margin-top: 0.5rem; display: flex; flex-direction: column; gap: 0.4rem; }
|
|
991
|
+
|
|
992
|
+
/* Phase 3 — "Design a workflow" panel */
|
|
993
|
+
.sec-wf-outcome { min-height: 4rem; }
|
|
994
|
+
.sec-wf-steps { margin: 0.25rem 0 0.5rem; padding-left: 1.3rem; display: flex; flex-direction: column; gap: 0.3rem; }
|
|
995
|
+
.sec-wf-steps li { color: var(--text); font-size: 0.9rem; }
|
|
996
|
+
.sec-wf-cron { width: 12rem; margin-top: 0.4rem; }
|
|
997
|
+
|
|
998
|
+
/* Loading spinner for "thinking"/"running" states */
|
|
999
|
+
.sec-spin {
|
|
1000
|
+
display: inline-block; width: 0.8em; height: 0.8em; margin-left: 0.45rem; vertical-align: -0.1em;
|
|
1001
|
+
border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%;
|
|
1002
|
+
animation: sec-spin 0.7s linear infinite;
|
|
1003
|
+
}
|
|
1004
|
+
@keyframes sec-spin { to { transform: rotate(360deg); } }
|
|
1005
|
+
|
|
1006
|
+
/* Calendar entry inline editor (modal) + clickable entries */
|
|
1007
|
+
.sec-cal-ev--click { cursor: pointer; }
|
|
1008
|
+
.sec-cal-ev--click:hover { filter: brightness(1.15); }
|
|
1009
|
+
.sec-modal-backdrop {
|
|
1010
|
+
position: fixed; inset: 0; background: rgba(0, 0, 0, 0.5); z-index: 50;
|
|
1011
|
+
display: flex; align-items: center; justify-content: center; padding: 1rem;
|
|
1012
|
+
}
|
|
1013
|
+
.sec-modal {
|
|
1014
|
+
background: var(--card); border: 1px solid var(--border); border-radius: 12px;
|
|
1015
|
+
padding: 1.25rem 1.5rem; width: min(36rem, 96vw); max-height: 85vh; overflow: auto;
|
|
1016
|
+
display: flex; flex-direction: column; gap: 0.5rem;
|
|
1017
|
+
}
|
|
1018
|
+
.sec-modal .sec-input, .sec-modal .sec-stand-body { margin-top: 0.2rem; }
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { apiGet, apiDelete, apiPatch, api } from '/js/api.js';
|
|
6
6
|
|
|
7
|
-
/** List
|
|
7
|
+
/** List apps. Returns array. The server decides visibility from who is
|
|
8
|
+
* authenticated: the owner sees their own parked/operator-hidden apps (the latter
|
|
9
|
+
* flagged operator_hidden so the UI can badge them); everyone else does not. */
|
|
8
10
|
export async function listApps() {
|
|
9
11
|
const data = await apiGet('/v1/apps');
|
|
10
12
|
return data?.data?.apps || [];
|
|
@@ -29,7 +31,7 @@ export async function deleteApp(filename) {
|
|
|
29
31
|
return apiDelete('/v1/apps/' + encodeURIComponent(filename));
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
/** Update app metadata (
|
|
34
|
+
/** Update app metadata (name, description, access_code, parked). The URL never changes. */
|
|
33
35
|
export async function patchApp(filename, updates) {
|
|
34
36
|
return apiPatch('/v1/apps/' + encodeURIComponent(filename), updates);
|
|
35
37
|
}
|